「码动四季·开源同行」go实战案例:如何使用 Kong 进行网关业务化定制?

张开发
2026/4/16 14:34:48 15 分钟阅读

分享文章

「码动四季·开源同行」go实战案例:如何使用 Kong 进行网关业务化定制?
为什么使用 Kong当我们对原有业务系统进行微服务改造时客户端包括移动端和Web 端等如何与各个微服务进行交互这个问题需要我们认真考虑服务数量的增加会导致一些基础功能的实现变得困难如认证授权、负载均衡和服务间通信管理但微服务网关所提供的访问限制、安全、流量控制、分析监控、日志、请求转发、合成和协议转换功能可以使得开发者更加集中精力在各个业务服务的实现上从而避免将大量时间花在考虑如何解决这些问题上。在业内流行的微服务网关组件中基于 Nginx 的Kong表现突出。Kong 是 Mashape 开源的高性能、高可用 API网关也可以认为是API服务管理层。它可以通过插件扩展已有功能这些插件使用Lua 编写在 API 请求响应循环的生命周期中被执行。除此之外Kong 本身还提供了包括 HTTP 基本认证、密钥认证、CORS、TCP、UDP、文件日志、API 请求限流、请求转发及 Nginx 监控等基本功能。在用 Kong 进行实践之前我们得先介绍一些 Kong 中常用的术语因为这些术语在实践中会经常用得到。Route请求的转发规则按照Hostname 和 PATH将请求转发给 Service。Services多个Upstream的集合是 Route的转发目标。ConsumerAPl的用户记录用户信息。Plugin插件可以是全局的也可以绑定到Service、Router或者Consumer。CertificateHTTPS配置的证书。SNI域名与Certificate的绑定指定了一个域名对应的HTTPS 证书。Upstream上游对象用来表示虚拟主机名拥有多个服务目标时会对请求进行负载均衡。Target最终处理请求的 Backend 服务。安装实践Kong 支持多种安装方式目前最新版本是 Kong 2.1官方支持包括 Docker、K8s 等方式的安装:除了官方提供的安装方式还有社区提供的安装方式Microsoft Azure、Kongverge 等详细情况你可参见该网址Install Kong Gateway - Kong Gateway | Kong Docs。为了方便这里我们就选择基于 Docker的方式安装选择的 Kong版本为1.1.2。docker-compose.yml 中定义的镜像、依赖和参数如下所示version: 3.7 services: kong: image: kong:1.1.2 environment: - “”KONG_DATABASEpostgres - KONG_PG_HOSTkong-database“” - KONG_CASSANDRA_CONTACT_POINTSkong-database - KONG_PROXY_ACCESS_LOG/dev/stdout - KONG_ADMIN_ACCESS_LOG/dev/stdout - KONG_PROXY_ERROR_LOG/dev/stderr - KONG_ADMIN_ERROR_LOG/dev/stderr - KONG_ADMIN_LISTEN0.0.0.0:8001, 0.0.0.0:8444 ssl ports: - 8000:8000 - 8443:8443 - 8001:8001 - 8444:8444 networks: - kong-net depends_on: - kong-database konga: image: pantsel/konga environment: - TOKEN_SECRETblueskykong.com - NODE_ENVproduction ports: - 8080:1337 networks: - kong-net depends_on: - kong-database kong-database: image: postgres:9.6 ports: - 5432:5432 environment: - POSTGRES_USERkong - POSTGRES_DBkong networks: - kong-net volumes: - /etc/localtime:/etc/localtime:ro - /data/data/postgresql:/var/1ib/postgresql/data networks: kong-net: external: true如上的 docker-compose.yml 会启动三个容器服务Kong、Konga 和 Kong-database。这三个容器之间的通信需要增加network段把容器放在同一个网段内相关链接修改为容器名称来访问:docker network create kong-net所启动的三个容器服务除了Kong之外的另两个服务Konga是 Kong的 Dashboard它是基于JaVaScript的客户端管理工具对外暴露的端口为 8080Kong-database是 Kong 的数据库服务它用于存储配置信息此处使用的是 Postgres。这里要注意的是在启动Kong容器之前需要保持数据库的 Docker 容器在运行状态并执行如下初始化数据库的操作:docker run --rm \ --networkkong-net \ -e KONG_DATABASEpostgres \ -e KoNG_PG_HosTkong-database \ kong:latest kong migrations bootstrap数据库初始化成功后再次启动docker-compose.yml服务就可以了。我们看到Kong 映射出多个端口默认情况下Kong监听的端口为:8000。此端口是 Kong用来监听来自客户端传入的HTTP请求并将此请求转发到上游服务器;Kong 根据配置的路由规则转发到真实的后台服务地址。8443。此端口是 Kong用来监听来自客户端传入的HTTPS 请求跟 8000端口的功能类似还会转发HTTPS 请求。我们可以通过修改配置文件来禁用HTTPS 的功能。8001。Kong提供的管理API端口通过此端口管理者可以对Kong的监听服务进行配置插件设置、API的增删改查以及负载均衡等一系列的配置都是通过 8001端口进行管理的。8444。通过此端口管理者可以对HTTPS 请求进行监控。容器都启动好之后下面我们来验证一下$ curl -i http://1ocalhost:8001/ HTTP/1.1 200 0K Date: Sat, 20 Ju1 2019 08:39:08 GMT Content-Type: application/json; charsetutf-8 Connection: keep-alive Access-Control-Allow-Origin: * Server: kong/1.l.2 Content-Length: 5785 ...本地访问 8001端口返回如上的结果表示安装正确可以正常使用 Kong。在浏览器中输入http://localhost:8080 即可访问Konga的管理界面如下图如果你第一次登录使用则需要创建管理员账号和密码。至此Kong以及管理工具都已安装完成。下面我们将会通过创建服务、创建路由、安装插件等过程的讲解进入APlGateWay的具体实践。1.创建服务正如我们在前面术语部分的介绍服务 Services 是上游服务的抽象可以是一个应用或者具体某个接口。Kong提供了管理接口我们可以通过请求 8001管理接口直接创建也可以通过安装的管理界面这二者的实现效果是一样的。curl -i -X POST \ --url http://localhost:8001/services/ \ --data nameaoho-blog \ --data urlhttp://blueskykong.com/这里我们创建了一个服务名为 aoho-blog 的后端服务指定转发的地址为 http://blueskykong.com。可以在管理界面中看到如下的记录Kong服务列表在创建服务的同时我们还可以设置其中的一些参数如 Retries重试次数、Connect timeout连接的超时时间、Write/Read timeout写/读超时时间等。2.创建路由创建好服务之后我们需要创建具体的API路由。路由是请求的转发规则根据Hostname 和 PATH将请求转发。curl -i -X POST \ --url http://localhost:8001/services/aoho-blog/routes \ --data hosts[]blueskykong.com \ --data paths []/api/blog如上所示我们在 aoho-blog 中创建了一个访问/api/blog 的路由在管理界面可以看到相应的记录创建好路由之后我们就可以访问/api/blog如下图Kong 默认通过 8000 端口处理代理的请求。成功的响应意味着 Kong 会将 http://localhost:8000 的请求转发到配置的URL并将响应转发给我们。需要注意的是如果 API暴露的地址与前面Host 定义的地址blueskykong.Com不一致就需要在请求的 Headers 里面加入HeaderKong 根据上面请求中定义的HeaderHost执行此操作。创建了服务和路由之后我们已经能够将客户端的请求转发到对应的服务但微服务网关还承担了很多基础的功能如安全认证、限流、分析监控等功能因此还需要应用Kong的插件来实现这些功能。安装Kong插件请求到达Kong网关我们可以在请求转发给服务端应用之前应用Kong自带的插件对请求进行处理如身份认证、API限流、黑白名单校验和日志切面等。同时我们也可以按照 Kong的教程文档定制属于自己的插件。这部分我们主要选择其中的三个插件示例应用至于其余的插件应用你可以参考这个网址https://docs.konghq.com/hub/。1.JWT认证插件JWTJSON WebToken是一种流行的跨域身份验证解决方案。作为一个开放的标准RFC7519MT定义了一种简洁的、自包含的方法用于通信双方之间以JSON对象的形式安全地传递信息。因为数字签名的存在这些信息是可信的。JMT最大的优点就是能让业务无状态化让Token作为业务请求的必须信息随着请求一并传输过来服务端不用再去存储 session 信息尤其是在分布式系统中。Kong提供了 jJWT认证插件用以验证包含HS256 或RS256 签名的JWT请求。每个消费者都将拥有JWT凭证公钥和密钥这些凭证必须用于签署其JWT。JWT 令牌可以通过请求字符串、Cookie 或者认证头部传递Kong将会验证令牌的签名通过则转发否则直接丢弃请求。我们在前面配置的路由基础上增加WT认证插件curl -X POST http://1ocalhost:8001/routes/e33d6aeb-4f35-4219-86c2- a41e879eda36/plugins \ --data namejwt可以看到在插件列表增加了相应的记录在增加了JWT插件之后就没法直接访问/api/blog 接口了接口返回messageUnauthorized提示客户端要访问的话则需要提供ⅧT的认证信息。因此我们需要创建用户curl -i -x POST \ --url http://1ocalhost:80o1/consumers/ \ --data usernameaoho如上我们就创建了一个名为aoho的用户创建好用户之后需要获取用户M凭证执行如下的调用$ curl -i -x POST \ --url http://localhost:8001/consumers/aoho/jwt \ --header Content-Type: application/x-www-form-urlencoded # 响应 { rsa_public_key: null, created_at 1563566125, consumer: { id: 8c0e1ab4-8411-42fc-ab80-5eccf472d2fd } id: 1d69281d-5083-4db0-b42f-37b74e6d20ad, algorithm: Hs256, secret: olsIeVjfVSF4RuQuylTMX4x53NDAOQyo, keyTojHFM4m1qQuPPReb8BTWAYCdM38xi3C }使用key和 secret在 https://jwt.io可以生成jMT凭证信息。在实际的使用过程中我们通过编码实现此处为了演示使用网页工具生成Token。上图中画线部分即为jMT凭证的 key 和 secret。然后我们将生成的Token配置到请求的认证头部再次执行请求可以看到我们能够正常请求相应的API接口JWT认证插件应用成功。Kong的JWT认证插件使用比较简单但在实践过程中我们还需要考虑如何跟自身的用户认证系统进行结合。2. Prometheus 可视化监控Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 BorgMon监控系统由工作在SoundCloud 的员工在2012年作为社区开源项目进行开发并于2015年正式发布。作为新一代的监控框架Prometheus 适用于记录时间序列数据并且它还具有强大的多维度数据模型、灵活而强大的查询语句、易于管理和伸缩等特点。Kong官方提供的 Prometheus 插件可用的metric指标有如下:状态码。上游服务返回的 HTTP 状态码。时延柱状图。Kong中的时延都将被记录包括请求完整请求的时延、KongKong 用来路由、验证和运行其他插件所花费的时间和上游上游服务所花费时间来响应请求。Bandwidth。流经Kong的总带宽出口/入口。DB 可达性。Kong 节点是否能访问其DB。Connections。各种 Nginx 连接指标如 Active、读取、写入和接收连接。我们在 Service 为 aoho-blog 安装Prometheus 插件:curl -X POST http://localhost:8001/services/aoho-blog/plugins \ --data nameprometheus从管理界面可以看到我们已经成功将 Prometheus 插件绑定到aoho-blog服务上通过访问/metrics接口返回收集度量数据:$ curl -i http://localhost:8001/metrics HTTP/1.1 200 OK Server: openresty/1.13.6.2 Date: Sun, 21 Ju1 2019 09:48:42 GMT Content-Type: text/plain; charsetuTF-8 Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Origin: * kong_bandwidth{typeegress, serviceaoho-blog} 178718 kong_bandwidth{typeingress,serviceaoho-blog} 1799 kong_datastore_reachable l kong_http_status{code20o,serviceaoho-blog} 4 kong_http_status{code401, serviceaoho-blog} 1 kong_latency_bucket{typekong, serviceaoho-blog,le00005.0} 1 kong_latency_bucket{typekong, serviceaoho-blog,le00007.0} 1 ... kong_latency_bucket{typeupstream,serviceaoho-blog, le0030o.0}4 kong_latency_bucket{typeupstream,serviceaoho-blog, le00400.0} 4 ... kong_latency_count{typekong, serviceaoho-blog} 5 kong_latency_count{typerequest, serviceaoho-blog} 5 kong_latency_count{typeupstream, serviceaoho-blog} 4 kong_latency_sum{typekong, serviceaoho-blog} 409 kong_latency_sum{typerequest, serviceaoho-blog} 1497 kong_latency_sum{typeupstream,serviceaoho-blog} 1047 kong_nginx_http_current_connections{stateaccepted} 2691 kong_nginx_http_current_connections{stateactive} 2 kong_nginx_http_current_connections{statehandled} 2691 kong_nginx_http_current_connections{statereading} 0 kong_nginx_http_current_connections{statetotal} 2637 kong_nginx_http_current_connections{statewaiting} 1 kong_nginx_http_current_connections{statewriting} 1 kong_nginx_metric_errors_total 0返回的响应太长有省略从响应可以看到Prometheus插件提供的 metric 都有体现。Prometheus插件导出的度量标准可以在 Grafana一个跨平台的开源的度量分析和可视化工具中绘制PrometheusGrafana”的组合是目前较为流行的监控系统。3.链路追踪Zipkin插件Zipkin是由 Twitter开源的分布式实时链路追踪组件。Zipkin收集来自各个异构系统的实时监控数据用来追踪与分析微服务架构下的请求应用系统则需要向 Zipkin 报告链路信息。Kong的 Zipkin 插件将 Kong 作为 zipkin-clientzipkin-client 组装好 Zipkin 需要的数据包发送到zipkin-serVer。Zipkin插件会将请求打上如下标签并推送到 Zipkin 服务端span.kind (sent to Zipkin as kind)http.methodhttp.status_codehttp.urlpeer.ipv4peer.ipv6peer.portpeer.hostnamepeer.service关于链路追踪和Zipkin的具体信息到后面的链路追踪课时我们会详细讲解本课时我们就旨在介绍如何在 Kong 中使用 Zipkin 插件追踪所有请求的链路。首先开启Zipkin插件将插件绑定到路由上这里可以绑定为全局的插件。cur1 -X POST http://kong:8001/routes/e33d6aeb-4f35-4219- 86c2-a41e879eda36/plugins \ --data namezipkin \ --data config.http_endpointhttp://localhost:9411/api/v2/spans \ --data config.sample_ratio1如上配置了ZipkinCollector 的地址和采样率为了测试效果明显设置采样率为100%但在实际生产环境中还是要谨慎使用100%的采样率配置采样率对系统吞吐量会有影响。可以看到Zipkin 插件已经应用到指定的路由上。下面我们将会执行请求/api/blog 接口打开http://localhost:9411 界面如下:这时Zipkin已经将请求记录我们可以点开查看其链路详情从链路调用可以知道请求到达 Kong 之后都经历了哪些服务和 Span以及每个 Span 所花费的时间等信息。小结本文我们重点介绍了微服务网关 Kong的相关概念和安装实践并在此基础上安装实践了其中具有代表性的三个Kong 插件JWT认证插件、Prometheus 可视化监控和链路追踪 Zipkin 插件。Kong官方对自身的定位也是适用于混合云平台的下一代 API 管理平台其在功能方面很强大。因此基于 Kong的丰富生态和配套的工具我们可以快速构建一个微服务网关作为服务端的统一入口。

更多文章