• 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输出

  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/chenyishi/p/15492874.html
Copyright © 2020-2023  润新知