Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kong网关初探_API网关

Kong网关初探_API网关

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

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

安装

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022年最强大数据面试宝典(全文50000字,强烈建议收藏)
一、Hadoop 二、Hive 三、Spark 四、Kafka 五、HBase 六、Flink 七、数仓业务方面 八、算法
五分钟学大数据
2022/04/07
1.7K0
2022年最强大数据面试宝典(全文50000字,强烈建议收藏)
Hadoop面试题[通俗易懂]
分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题
全栈程序员站长
2022/09/07
5130
Alluxio在携程大数据平台的应用实践
在《携程技术2018年度合集》中,一共70篇文章中,只有5篇是大数据的内容。其中有一篇,讲到了Alluxio的应用过程。
十里桃花舞丶
2021/09/10
5090
最新Hadoop的面试题总结
  1)Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。   2)Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。   3)Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统。   4)Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。   5)Sqoop:将一个关系型数据库中的数据导进到Hadoop的 HDFS中,也可以将HDFS的数据导进到关系型数据库中。
大数据老哥
2021/03/05
6.1K0
2022年Hadoop面试题最全整理,两万字干货分享【建议收藏】
Hadoop 中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。
Maynor
2023/02/01
1.2K0
【万字长文】HDFS最全知识点整理(建议收藏)
1)跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器。2)挑选一台DN(就近原则,然后随机)服务器,请求建立socket流。3)DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验) 4)客户端以packet为单位接收,现在本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件。
857技术社区
2022/05/17
3.1K0
【万字长文】HDFS最全知识点整理(建议收藏)
HDFS Federation在美团点评的应用与改进
背景 2015年10月,经过一段时间的优化与改进,美团点评HDFS集群稳定性和性能有显著提升,保证了业务数据存储量和计算量爆发式增长下的存储服务质量;然而,随着集群规模的发展,单组NameNode组成的集群也产生了新的瓶颈: 扩展性:根据HDFS NameNode内存全景和HDFS NameNode内存详解这两篇文章的说明可知,NameNode内存使用和元数据量正相关。180GB堆内存配置下,元数据量红线约为7亿,而随着集群规模和业务的发展,即使经过小文件合并与数据压缩,仍然无法阻止元数据量逐渐接近红线。
美团技术团队
2018/03/12
1.6K0
腾讯云大数据 TBDS 在私有化场景万节点集群的实践
作者 | 杨鹏程 策划 | 凌敏 4 月 15 日 -16 日,由 InfoQ 主办的 DIVE 全球基础软件创新大会 通过云上展厅的形式成功召开。在 腾讯云基础软件创新实践专场,来自腾讯云的 TBDS 大数据引擎研发负责人杨鹏程带来了主题为《腾讯云⼤数据 TBDS 在私有化场景万节点集群的实践》的演讲,以下为主要内容。 本次分享主要分为三个部分展开:第一部分是 Hadoop 体系下存算⼀体存在的问题;第二部分是 TBDS 存算分离架构和三层优化;第三部分是云原⽣环境下计算引擎优化和最佳实践,最后是对本次分
深度学习与Python
2023/03/29
1.1K0
腾讯云大数据 TBDS 在私有化场景万节点集群的实践
大数据学习(一)-------- HDFS
已经有了很多框架方便使用,常用的有hadoop,storm,spark,flink等,辅助框架hive,kafka,es,sqoop,flume等。
大数据流动
2019/08/08
4830
HDFS Federation(联邦)简介
本文主要介绍HDFS Federation(联邦)相关知识,为后续文章《如何为CDH集群启用Federation(联邦)》做一个简单的铺垫。Federation即为“联邦”,该特性允许一个HDFS集群中存在多组Namenode同时对外提供服务,分管一部分目录(水平切分),彼此之间相互隔离,但共享底层的Datanode存储资源。
Fayson
2018/09/29
7.3K0
【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇
2021年初的时候,关于Hadoop要退休淘汰的PR文章甚嚣尘上。其中MapReduce思想最为人所诟病,因为其并不友好的写代码方式,高昂的维护成本以及较差的运行效率。
大数据真好玩
2021/09/18
6400
【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇
大数据Hadoop生态圈介绍
Hadoop是目前应用最为广泛的分布式大数据处理框架,其具备可靠、高效、可伸缩等特点。
全栈程序员站长
2022/08/25
1K0
大数据Hadoop生态圈介绍
代达罗斯之殇-大数据领域小文件问题解决攻略
海量小文件问题是工业界和学术界公认的难题,大数据领域中的小文件问题,也是一个非常棘手的问题,仅次于数据倾斜问题,对于时间和性能能都是毁灭性打击。本文参考网上对于小文件问题的定义和常见系统的解决方案,给大家还原一个大数据系统中小文件问题的系统性解决方案。
大数据真好玩
2021/01/26
1.5K0
大数据开发:HDFS Namenode元数据管理
HDFS作为分布式文件系统的代表性产品,在大数据学习当中的重要性是不言而喻的,基于Hadoop基础架构,HDFS更是得到了广泛的认可,在大规模离线数据处理上,提供稳固的底层支持。今天的大数据开发技术分享,我们就主要来讲讲HDFS Namenode元数据管理。
成都加米谷大数据
2021/01/18
9910
大数据开发:HDFS Namenode元数据管理
HDFS元数据管理:fsimage&edits
介绍HDFS的元数据管理机制,说明fsimage文件和edits的作用,给出解析fsimage文件和edits文件的demo
Eights
2020/07/10
2.8K0
HDFS元数据管理:fsimage&edits
(译)优化ORC和Parquet文件,提升大SQL读取性能
本文编译自IBM开发者社区,主要介绍了HDFS中小的ORC和Parquet文件的问题,以及这些小文件如何影响Big SQL的读取性能,并探索了为了提高读取性能,使用现有工具将小文件压缩为大文件的可能解决方案。
九州暮云
2019/10/08
2.9K0
(译)优化ORC和Parquet文件,提升大SQL读取性能
6道经典大数据面试题(ChatGPT回答版)
HDFS(Hadoop Distributed File System)的读写流程如下:
用户6070864
2023/03/24
1.5K0
6道经典大数据面试题(ChatGPT回答版)
基于Hadoop的云盘系统客户端技术难点之三 小文件存储优化
首先明确概念,这里的小文件是指小于HDFS系统Block大小的文件(默认64M),如果使用HDFS存储大量的小文件,将会是一场灾难,这取决于HDFS的实现机制和框架结构,每一个存储在HDFS中的文件、目录和块映射为一个对象存储在NameNode服务器内存中,通常占用150个字节。如果有1千万个文件,就需要消耗大约3G的内存空间。如果是10亿个文件呢,简直不可想象。这里需要特别说明的是,每一个小于Block大小的文件,存储是实际占用的存储空间仍然是实际的文件大小,而不是整个block大小。
数据饕餮
2019/01/14
1K0
【大数据】hdfs
                         spark  Streaming
Java架构师必看
2021/07/21
3260
大数据技术笔试题库
12、在MapTask的Combine阶段,当处理完所有数据时,MapTask会对所有的临时文件进行一次()。
杨校
2022/05/14
3K0
推荐阅读
相关推荐
2022年最强大数据面试宝典(全文50000字,强烈建议收藏)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验