前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kong网关初探_API网关

Kong网关初探_API网关

作者头像
全栈程序员站长
发布于 2022-09-30 12:50:34
发布于 2022-09-30 12:50:34
4K01
代码可运行
举报
运行总次数:1
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

安装

Kong安装文档

Kong开源版不提供dashboard支持,只有Kong企业版才有该功能。但有第三方控制台Konga同样可以友好地管理Kong Admin API对象,快速安装如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 1337:1337  \
--name konga  \
--network=kong-net \
-e DB_ADAPTER=postgres   \
-e DB_HOST=kong-database  \
-e DB_PORT=5432  \
-e DB_USER=kong  \
-e DB_PASSWORD=kong  \
-e DB_DATABASE=konga  \
pantsel/konga

使用

需求定位是通过网关不仅实现API网关功能,也要能够替代原先Nginx。因此需要的主要功能如下:

  • 服务负载均衡
  • 负载节点健康检查
  • 静态资源访问
  • 调用方认证、路由鉴权
  • 限流、IP黑白名单
  • 灰度发布
  • 监控

Kong网关的主要概念有route、service、upstream、target,其逻辑关系见下图:

负载均衡

当前的负载均衡逻辑为Nginx做负载均衡,服务发版时通过动态模板解析实现:Jenkins自动化脚本修改Nginx的upstream文件实现。例如对某服务的a、b两节点发版时具体逻辑如下:

  1. 先修改Nginx的upstream脚本摘除该服务的a节点
  2. 等待a节点无流量请求后发布重启a节点的新版本
  3. 最后再修改Nginx的upstream脚本重新添加a节点
  4. 接着同样的逻辑操作b节点

通过以上逻辑实现服务的无缝发版,但每次节点变动都需要reload一次Nginx。虽然现在的Nginx版本的reload已经支持配置平滑更新,但实际上reload操作依然会造成CPU竞争、Nginx性能降低以及提前关闭HTTP长连接导致部分客户端调用异常。

为了避免以上问题,常见的解决方案如下:

  1. DNS动态解析
  2. lua脚本解析

Kong网关对以上两种方案均支持,基于这两种方案,可以对当前上述服务发版流程优化成功以下几种方式:

集成Kubernetes

集成Kubernetes,通过Kubernetes的DNS服务发现实现负载均衡。Kong网关只负责路由匹配、调用者认证、路由鉴权等网关责任,而服务注册发现的逻辑全部交由Kubernetes处理,使Kong网关完全脱离upstream的逻辑处理。

集成注册中心

Kong网关提供了API接口,可以通过这些开放的API接口来管理Kong内部的各个对象,例如上线/下线节点target,详见官方文档admin-api/add-target

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 节点上线
curl -X POST http://127.0.0.1:8001/upstreams/test-upstream/targets \
--data "target=172.17.0.1:8080" \
--data "weight=100"

# 节点下线
curl -X POST http://127.0.0.1:8001/upstreams/test-upstream/targets \
--data "target=172.17.0.1:8080" \
--data "weight=0"

因此可以搭建如上图的架构方案,自行代码实现一个节点监听服务,通过对接注册中心的API来实时监听各个服务节点的状态。当某服务节点上下线后,注册中心将节点上下线事件推送给监听服务,然后监听服务通过Kong的开放API修改该节点对应的Kong中的target对象状态。

通过上述方案从而实现一个注册中心同时管理微服务之间的服务发现和网关到服务的服务发现。此时应用发布流程例如对某服务的a、b两节点发版时具体逻辑如下:

  1. 请求注册中心下线该服务的a节点
  2. 监听服务监听到a节点下线后自动将Kong中的a节点下线
  3. 等待a节点无流量请求后发布重启a节点的新版本
  4. a节点启动成功后自动将自己重新注册到注册中心
  5. 监听服务监听到a节点上线后自动将Kong中的a节点上线
  6. 接着同样的逻辑操作b节点

自动化脚本

该方案需要配合健康检查使用,具体逻辑与动态模板解析方案基本相同,仅仅是将模板修改操作替换成API请求操作。例如对某服务的a、b两节点发版时具体逻辑如下:

  1. 请求Kong网关API摘除该服务的a节点
  2. 等待a节点无流量请求后发布重启a节点的新版本
  3. 最后再请求Kong网关API重新添加a节点
  4. 接着同样的逻辑操作b节点

健康检查

Kong的upstream支持target健康检查,详细文档见health-checks-circuit-breakers

Kong支持两种健康检查方式,即可以单独使用,也可以组合使用。通过健康检查target的健康状态,被标记为不健康的target不再有请求路由到该节点。

  • 主动健康检查:定时请求target的指定path,并通过响应状态码标记该target为健康/不健康
  • 被动健康检查:target的指定响应码数量超过阈值后标记该target为不健康

被动健康检查不会将不健康的target标记成功健康状态,需要人工手动标记该target为健康状态从而恢复流量路由到该目标。因此如果需要使用被动健康检查,务必与主动健康检查组合使用,通过主动健康检查自动将恢复响应的target标记为健康状态。

静态资源

Kong目前仅支持API路由,不支持静态资源映射,为了最简单地方式使Kong实现静态资源访问,可以搭建下图所示的架构。单独搭建一个Nginx服务做静态资源服务器,然后在Kong中将该Nginx服务配置成service并设置路由规则,将静态资源访问请求通过路由规则请求到该Nginx上。

限流

Kong自带限流插件rate-limiting

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local function get_identifier(conf)
local identifier
if conf.limit_by == "service" then
identifier = (kong.router.get_service() or
EMPTY).id
elseif conf.limit_by == "consumer" then
identifier = (kong.client.get_consumer() or
kong.client.get_credential() or
EMPTY).id
elseif conf.limit_by == "credential" then
identifier = (kong.client.get_credential() or
EMPTY).id
elseif conf.limit_by == "header" then
identifier = kong.request.get_header(conf.header_name)
elseif conf.limit_by == "path" then
local req_path = kong.request.get_path()
if req_path == conf.path then
identifier = req_path
end
end
return identifier or kong.client.get_forwarded_ip()
end

rate-limiting插件限流逻辑的对象选择关键代码如上,当基于path限流时,该插件的后续处理逻辑有点反常识。正常逻辑下对指定path限流意味着path规则匹配时则限流,path不匹配时不限流,但该插件的逻辑是path规则匹配时限流,path规则不匹配时按调用方ip限流。

且该插件的path匹配规则仅支持单个完全匹配,不支持范围匹配、正则匹配等常见规则。因此如果需要基于path做限流控制,可以对官方插件稍作修改后使用。

计数模式config.policy支持3种策略:

  • local: 节点本地内存中计数,应用场景为单节点模式,性能影响最小
  • redis: redis中计数,应用场景为集群模式,需要额外依赖redis服务,性能影响中
  • cluster: 集群计数,应用场景为集群模式,不需要额外依赖服务,但性能影响最大

灰度发布

灰度发布是指通过将更改缓慢推广到一小部分用户,降低在生产环境中引入新软件版本的风险。Kong开源版官方不提供该插件,但有第三方插件支持kong-plugins-canary

支持通过ip、header、cookie、args四种匹配方案来做灰度流量控制,并支持单个、多个、正则匹配规则。

数据监控

启用prometheus插件

首先在Kong控制台启用prometheus插件,如下图所示,直接在全局范围启用该插件,关于prometheus插件更多配置详见官方文档

插件启动后访问KongAdmin的/metrics地址,如下图所示,则说明prometheus插件启动成功。

安装prometheus

prometheus

修改配置文件,将KongAdmin的访问地址添加到targets值域中,如下图,然后启动prometheus服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d \
--name prometheus \
--network=kong-net \
-p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

访问prometheus的访问地址http://host:9090后,在搜索栏中输入关键字kong后如下图自动补全搜索关键字,则表示prometheus成功收集到了Kong的监控数据。

安装grafana

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d \
--name=grafana \
--network=kong-net \
-p 3000:3000 \
grafana/grafana

访问grafana的控制台地址http://host:3000(默认账号密码admin:admin),需要先关联prometheus服务。如下图,在配置栏添加prometheus数据库,并输入prometheus的服务访问地址http://host:9090

prometheus数据库配置完成后,添加Kong的dashboards,直接输入模板ID7424或者访问 https://grafana.com/grafana/dashboards/7424下载模板JSON文件后导入均可,如下图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iN2oAYaN-1616828418728)(https://img.wakzz.cn/202102/N8zKbiCnsX.png)]

最终效果展示:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195230.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月10日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
云原生架构下的 API 网关实践: Kong (二)
Kong 是 Mashape 开源的一款云原生架构下的分布式 API 网关,其性能和可扩展性在同类组件中,表现都很优异。Kong 官方提供了很多直接可用的插件,此外,Kong 还可以通过插件扩展已有功能。
aoho求索
2019/08/28
2.3K0
Kong入门学习实践(3)路由转发
最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。
Edison Zhou
2023/07/09
6870
Kong入门学习实践(3)路由转发
如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Trk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:
温铭@APISIX
2020/02/24
4.2K1
kong笔记——认识kong
最近公司打算重构API网关,给定的硬性条件是支持lua脚本,kubernetes可部署,可解析lua,另外需要支持身份认证,IP黑白名单,限流,负载均衡等一些功能,为此,在技术选型上锁定了kong以及APISIX,最终选择了kong。
全栈程序员站长
2022/09/13
1.5K1
Kong网关 入门、实战与进阶
入门篇 第1章 全面了解Kong网关 Kong是一款基于OpenResty(Nginx+Lua模块)编写的高可用、易扩展的开源API网关,专为云原生和云混合架构而建,并针对微服务和分布式架构进行了特别的优化 微服务网关具有负载均衡、缓存、路由、访问控制、服务代理、监控、日志等多项功能。API网关在微服务架构中正是以微服务网关的身份存在 由于企业间信息交流和共享变得日益频繁,企业需要将自身数据、能力等向外开放,通常以接口的方式向外提供,如淘宝开放平台、腾讯的QQ开放平台和微信开放平台。开放平台的引入必然涉及客
yeedomliu
2021/11/19
2.4K0
Kong网关 入门、实战与进阶
基于 Apache APISIX,爱奇艺 API 网关的更新与落地实践
本文整理自爱奇艺高级研发师何聪在 Apache APISIX Meetup - 上海站的演讲,通过阅读本文,您可以了解到基于 Apache APISIX 网关,爱奇艺技术团队是如何进行公司架构的更新与融合,打造出全新的网关服务。欢迎感兴趣的同学点击阅读原文访问 bilibili 观看视频。 作者何聪,高级研发师,IIG 基础架构部 - 计算云,主要负责爱奇艺网关开发和运维工作
深度学习与Python
2021/10/13
8270
微服务API网关-Kong初探
Kong是一个clould-native、快速的、可扩展的、分布式的微服务抽象层(也称为API网关、API中间件或在某些情况下称为服务网格)框架。更确切地说,Kong是一个在Nginx中运行的Lua应用程序,并且可以通过lua-nginx模块实现。Kong不是用这个模块编译Nginx,而是与OpenResty一起发布,OpenResty已经包含了lua-nginx-module。OpenResty 不是 Nginx的分支,而是一组扩展其功能的模块。
KaliArch
2019/09/29
5.5K2
微服务API网关-Kong初探
Kong入门学习实践(5)API网关路由转发
最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。
Edison Zhou
2023/07/09
9160
Kong入门学习实践(5)API网关路由转发
Kong网关介绍[通俗易懂]
传统服务如下左图,通用函数重复使用在多个服务中,系统庞大僵化难以管理,由于会冲击其他服务导致的扩展困难,由于系统限制导致生产率低,如下右图是kong的解决方案
全栈程序员站长
2022/10/01
5.3K0
Kong网关介绍[通俗易懂]
选择Kong作为你的API网关
在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度。如上图左所示,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单独实现,这使得系统维护者没有一个全局的视图来统一管理这些功能。API 网关致力于解决的问题便是为微服务纳管这些通用的功能,在此基础上提高系统的可扩展性。如右图所示,微服务搭配上 API 网关,可以使得服务本身更专注于自己的领域,很好地对服务调用者和服务提供者做了隔离。
kirito-moe
2018/07/25
3.5K0
选择Kong作为你的API网关
Docker 安装 KONG 带你玩转 API 网关
在当今的软件开发中,API 网关已成为微服务架构中不可或缺的一环。它不仅简化了服务间的通信、提供了统一的入口,还能在安全、监控、限流等方面发挥巨大作用。
南山竹
2024/07/11
4960
Docker 安装 KONG 带你玩转 API 网关
Kong网关:入门、实战与进阶-重读
Kong、OpenResty都是基于Nginx打造的新一代服务器。它们兼具Web服务器的功能,但侧重于网关层特性的延伸
yeedomliu
2023/12/21
8K0
Kong网关:入门、实战与进阶-重读
对比微服务网关 Kong 和 Apisix
网关,就是指一个流量的集中式出入口。而 API Gateway,顾名思义,就是在 Gateway 上再添加了一些 API 相关的功能后得到的东西。 具体而言,API Gateway 就是比普通的网关多干了一些以前我们在应用内部实现的事:身份认证,权限控制,基于来源的流量控制,日志服务等,甚至是直接在第七层魔改 HTTP 请求的内容。好处有:
Kunkka Wu
2022/01/13
4.5K0
高性能微服务网关.NETCore客户端Kong.Net开源发布
拥抱开源的脚步,我们从来都是一直在路上;.NETCore作为后起之秀,带给我们太多的惊喜和感动;但是也正是由于年轻,.NETCore 的生态还是不够完善,这就非常需要我们社区的力量,需要大家一起参与,把开源社区好的工具、组件、应用接入到 .NETCore 应用中。
全栈程序员站长
2022/09/06
1.3K0
高性能微服务网关.NETCore客户端Kong.Net开源发布
kong 网关教程入门[通俗易懂]
1. 方便客户端维护– 每个请求方不用管理多个api url,统一访问api-gateway即可
全栈程序员站长
2022/09/13
3.6K0
API 网关 Kong
所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层。
平也
2020/05/22
2.5K0
KONG网关 — 丰富的插件
为什么kong这么火热呢?当然是它拥有强大的插件群来解决我们本来需要重复手动配置或者需要自己实现的内容,kong在1.X版本加强了对于插件的支持,官方提供的插件就是几十个,通过插件可以带来各种场景更加方便使用
喵了个咪233
2019/05/26
2.5K0
手把手教你实现一个Kong网关插件
Kong Gateway 是一个轻量、快速、灵活的基于Nginx开发云原生 API 网关。在云原生领域,Kong Gateway 越来受欢迎。
windealli
2023/10/12
2.5K0
手把手教你实现一个Kong网关插件
微服务 - kong安装,API网关设计(原理篇)
微服务实践的第二个关键组件,微服务API网关设计,API网关是对微服务做统一的鉴权、限流、黑白名单、负载均衡等功能实现,这篇我们先来介绍Api网关的意义和安装kong/konga需要的组件。
stark张宇
2023/04/26
8480
又肝了下微服务 API 网关“金刚”,也是蛮香的~
Kong 是由 Mashape 公司开源的云原生、高性能、可扩展的微服务 API 网关。它基于 OpenResty 实现,使用 Cassandra 或 PostgreSQL 存储数据。
芋道源码
2020/06/16
2K0
又肝了下微服务 API 网关“金刚”,也是蛮香的~
相关推荐
云原生架构下的 API 网关实践: Kong (二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验