Kong入门学习实践(5)API网关路由转发

发布时间 2023-06-26 18:59:28作者: EdisonZhou

最近在学习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的云原生微服务网关》