Kong入门学习实践(5)API网关路由转发
最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。
本篇,我们学习快速配置一个最常见的基本功能:API网关场景下的路由转发。
API网关路由需求
在API网关的需求场景中,我们需要的路由转发往往是下面这个样子:
我们会用API网关作为上游所有API服务的入口,即前端只会通过API网关来调用各个不同的API,各个API服务之间通过路由前缀区分。
例如,当客户端请求 api.edisontalk.cn/order/api/health 接口时,Kong会将/order路由路径的所有请求都转发到上游的Order API,相当于请求的是Order API的/api/health接口。当请求 api.edisontalk.cn/stock/api/health 接口时,Kong则会将/stock路由路径的所有请求都转发到上游的Stock API,相当于请求的是Stock API的/api/health接口。
从上面的例子可以看出,客户端所有的API都是发给 api.edisontalk.cn 的,Kong会自动帮我们进行路由转发。
那么,接下来,我们就来配置实现这个需求。
准备工作
为了演示,我们两个ASP.NET Core WebAPI项目,分别是 sample-order-api 和 sample-stock-api,并且将其分别部署到服务器上,每个应用部署两个容器实例,它们都位于同一台服务器中。
本节示例应用:https://github.com/EdisonChou/EDT.EventBus.Sample,分支:feature/kong-practice-2
同时,为了演示方便,这里我们将Kong的代理监听端口8000和8443改为80和443,这样我们在访问的时候就不需要加8000端口了。
这里我们将之前的docker-compose.yml中关于Kong的部分的端口进行更改:
####################################### # Kong: The API Gateway ####################################### kong: image: ${KONG_DOCKER_TAG:-kong:latest} restart: on-failure networks: - kong-net environment: KONG_DATABASE: postgres KONG_PG_HOST: kong-database KONG_PG_DATABASE: kong KONG_PG_USER: kong KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-kong} KONG_PROXY_LISTEN: 0.0.0.0:8000 KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443 KONG_ADMIN_LISTEN: 0.0.0.0:8001 KONG_ADMIN_LISTEN_SSL: 0.0.0.0:8444 KONG_STREAM_LISTEN: 0.0.0.0:7000 depends_on: - kong-database healthcheck: test: ["CMD", "kong", "health"] interval: 10s timeout: 10s retries: 10 ports: - "7000:7000" - "80:8000" # "8000:8000" - "8001:8001" - "443:8443" #"8443:8443" - "8444:8444"
然后,重新启动一下Kong即可:
docker-compose up -d
配置Upstream
参考之前 路由转发 一文中进行Upstream的配置,添加两个Upstream:sample-stock-api 和 sample-order-api:
其中,sample-stock-api的目标节点配置:
sample-order-api的目标节点配置:
两个Upstream的主动健康检查配置如下:
(1)Verify https certificate: No
(2)Http path: /api/health
配置Service
这里我们需要新建两个Service,分别是 sample-stock-api-service 和 sample-order-api-service。
这里我们以sample-stock-api-service为例:
(1)在新增Service时填写以下内容:
这里需要注意的是:Host的内容需要和Upstream的名字保持一致。
sample-order-api-service 参考上面的内容填写。
配置Route
这里我们为sample-stock-api-service添加一条路由:
这里我们为其添加了要监听的域名 和 路径,表示:只有在客户端请求api.edisontalk.cn/stock/******时才会匹配到这条路由。
另外几个重要的配置如下图所示:
(1)Strip Path:这里选择Yes,表示Kong将路由前缀删除后再传递给上游服务器,这里是去掉/stock前缀。
(2)Preserve Host:这里选择No,表示Kong不将客户端请求的Host带到上游服务器。
(3)Protocols:这里取消https,因为我们并没有配ssl证书。
验证结果
访问 http://api.edisontalk.cn/order/api/orders,可以正确匹配并返回数据。
访问 http://api.edisontalk.cn/stock/api/stocks,可以正确匹配并返回数据。
带未配置的路由http://api.edisontalk.cn/products/api/health,无法匹配路由。
示例应用
本节示例应用:https://github.com/EdisonChou/EDT.EventBus.Sample,分支:feature/kong-practice-2
参考资料
闫观涛,《Kong入门与实践-基于Nginx和OpenRestry的云原生微服务网关》