zoukankan      html  css  js  c++  java
  • 30分钟通过Kong实现.NET网关

    什么是Kong

    Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库。其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块。Kong是一个Openrestry程序,而Openrestry运行在Nginx上,用Lua扩展了nginx。所以可以认为Kong = Openrestry + nginx + lua。Kong有很高的扩展性,可以通过其插件机制实现扩展。

    官方文档:https://docs.konghq.com/
    Github:https://github.com/Kong/kong

    原理

    客户端请求到达Kong,Kong识别出是哪个Consumer,根据路由规则将请求转发给Service对应的上游服务。我们来看看这个过程中涉及到的核心组件

    Consumer:代表一个应用,可以为Consumer定义plugin,制定其请求规则。

    Route:客户端与服务匹配的规则,是Kong的入口,一旦匹配Route规则,则将其代理到与其关联的Service,一个Route对应一个Service,一个Service有多个Route

    Service:管理我们的API或者Upstream Server,Service主要属性是url,端口,协议等

    Upstream:位于Kong之后的服务/API,多实例部署实现负载均衡

    Plugin:提供高级功能并扩展Gateway。例如身份认证,速率限制等。

    安装Kong

    官方文档:https://konghq.com/install/#kong-community

    大家可以安装企业版或者开源版,我这次安装企业版,但只使用其中的开源功能

    #拉镜像 
    docker pull kong/kong-gateway:2.6.0.0-alpine
    
    #打标签 
    docker tag kong/kong-gateway:2.6.0.0-alpine kong-ee
    
    #创建网络 
    docker network create kong-ee-net
    
    #运行数据库容器 
    docker run -d --name kong-ee-database --network=kong-ee-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6
    
    #数据库迁移
    docker run --rm --network=kong-ee-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-ee-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_PASSWORD={PASSWORD}" kong-ee kong migrations bootstrap
    
    #运行Kong
    docker run -d --name kong-ee --network=kong-ee-net -e "KONG_PROXY_LISTEN=0.0.0.0:8000,0.0.0.0:9080 http2" -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-ee-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" -e "KONG_ADMIN_GUI_URL=http://{HOSTNAME}:8002" -p 8000:8000 -p 8443:8443 -p 8001:8001 -p 8444:8444 -p 8002:8002 -p 8445:8445 -p 8003:8003 -p 8004:8004 -p 9080:9080 kong-ee

    安装可视化界面Konga

    官方源码:https://github.com/pantsel/konga

    docker pull pantsel/konga
    
    docker run -d -p 1337:1337 --network kong-ee-net -e "TOKEN_SECRET=kongtoken" -e "DB_ADAPTER=postgres" -e "DB_HOST=kong-ee-database" -e "DB_USER=kong" -e "DB_PASSWORD=kong" --name konga pantsel/konga

    访问localhost:1337,新建用户,登录后创建连接:test/http://192.168.43.94:8001,指定kong api的端口8001

    Kong代理HTTP服务

    我们用的演示项目是https://github.com/cysnet/gateway-aspnetcore-demo,其中包含以下内容

    • Http服务:Server1与Server2
    • Grpc服务:GrpcService1与GrpcService2
    • Grpc客户端:GrpcClient
    • IdentityServer4服务:Idstest
    • 日志服务:LogServer

    1.代理Http服务我们用Server1,启动Server1

     2.通过admin api在Kong中创建Service,也可使用可视化界面Konga创建

    POST http://192.168.43.94:8001/services  --data name=server1 --data url='http://192.168.43.94:5000’

    3.通过admin api创建路由,也可使用可视化界面Konga创建

    http://192.168.43.94:8001/services/server1/routes  --data 'paths[]=/http1'--data name=http1

    4.测试

    Kong代理Grpc服务

    1.代理Grpc我们用GrpcService1,启动GrpcService1

     2.通过admin api在Kong中创建Service,也可使用可视化界面Konga创建

    POST 192.168.43.96:8001/services --data name=gserver1 --data protocol=grpc --data host=192.168.43.94  --data port=6001

    3.通过admin api创建路由,也可使用可视化界面Konga创建

    POST 192.168.43.94:8001/services/gserver1/routes  --data protocols[]=grpc --data name=r-gserver1  --data paths[]=/greet

    4.测试,运行GrpcClient

    Kong负载Http服务

    1.启动Server1与Server2

     2.通过admin api在Kong中创建upstreams,也可使用可视化界面Konga创建

    POST http://192.168.43.94:8001/upstreams --data name=u-http1

    3.为u-http1创建target,指向server1与server2

    POST http://192.168.43.94:8001/upstreams/u-http1/targets  --data target='192.168.43.94:5000’
    POST http://192.168.43.94:8001/upstreams/u-http1/targets  --data target='192.168.43.94:5001'

    4.修改http1 service的指向,让其指向u-htttp1这个upstream

    PATCH http://192.168.43.94:8001/services/server1 --data host='u-http1’

    5.测试,调用以下api

    http://192.168.43.94:8000/http1/Name

    Kong负载Grpc服务

    1.启动GrpcService1与GrpcService2

     2.通过admin api在Kong中创建upstreams,也可使用可视化界面Konga创建

    POST http://192.168.43.94:8001/upstreams --data name=u-gserver1

    3.为u-gserver1创建target,指向GrpcService1与GrpcService2

    POST http://192.168.43.94:8001/upstreams/u-gserver1/targets  --data target='192.168.43.94:6001’
    POST http://192.168.43.94:8001/upstreams/u-gserver1/targets  --data target='192.168.43.94:6002'

    4.修改gserver1 service的指向,让其指向u-gserver1这个upstream

    PATCH http://192.168.43.94:8001/services/gserver1 --data host=‘u-gserver1’

    5.测试,运行GrpcClient

    集成IdentityServer4实现JWT认证

    1.给server1开启jwt插件

    POST http://localhost:8001/services/server1/plugins -d “name=jwt ” –d “config.key_claim_name=client_id”

    2.创建consumer

    POST localhost:8001/consumers -d "username=c-server1"

    3.获取ids4证书公钥与私钥

    openssl安装https://slproweb.com/products/Win32OpenSSL.html

    openssl pkcs12 -in chester.pfx -nocerts -nodes -out private_pc.key
    从密钥对中提取私钥(头部格式:-----BEGIN RSA PUBLIC KEY-----)
    openssl rsa -in  private_pc.key -out private.pem
    从密钥对提取公钥(头部格式:-----BEGIN PUBLIC KEY-----)
    openssl rsa -in private_pc.key -pubout -out public.key

    4.为C-server1创建凭证

    POST localhost:8001/consumers/c-server1/jwt -d "algorithm=RS256" -d "key=big_cat" -d "secret=xxxxxx" -d "rsa_public_key=xxxxxxxxx“

     5.启动id4test获取jwttoken

     6.调用api验证token

    RateLimit限流插件

    POST http://<admin-hostname>:8001/plugins --data name=rate-limiting --data config.minute=5 --data config.policy=redis --data redis_host=192.168.43.102 --data limit_by=ip –data redis_password=123456

    多次调用触发则触发限流

    Cache插件

    POST http://localhost:8001/plugins  --data name=proxy-cache  --data config.content_type="text/plain; charset=utf-8"  --data config.cache_ttl=30 --data config.strategy=memory

    多次调用X-Cache-Status=Hit则命中缓存成功

    日志插件

    启动LogServer

     开启日志插件

    POST http://localhost:8001/services/server1/plugins  --data "name=http-log"  --data "config.http_endpoint=http://192.168.43.94:5555/Log"  --data "config.method=POST" 

    请求http://192.168.43.94:8000/http1/Name,查看LogServer输出

  • 相关阅读:
    js中的日期控件My97 DatePicker
    list中慎用remove
    ehcache注解全面解析
    servlet
    SpringMVC注解@RequestMapping全面解析
    SpringMVC注解@RequestParam全面解析
    lucene全文检索
    jenkins和hudson
    Mysql与PostgreSql数据库学习笔记
    前端学习笔记
  • 原文地址:https://www.cnblogs.com/chenyishi/p/15492874.html
Copyright © 2011-2022 走看看