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=https://www.jb51.net/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=https://www.jb51.net/dev/stdout" -e "KONG_PROXY_ERROR_LOG=https://www.jb51.net/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=https://www.jb51.net/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 :8001/services --data name=server1 --data url='http://192.168.43.94:5000'
3.通过admin api创建路由,也可使用可视化界面Konga创建
:8001/services/server1/routes --data 'paths[]=https://www.jb51.net/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[]=https://www.jb51.net/greet
4.测试,运行GrpcClient
Kong负载Http服务1.启动Server1与Server2
2.通过admin api在Kong中创建upstreams,也可使用可视化界面Konga创建
POST :8001/upstreams --data name=u-http1
3.为u-http1创建target,指向server1与server2