希沃 API 网关架构演进之路

news2024/11/25 19:40:48

网关往期迭代与痛点

希沃网关的发展经历了四个版本的迭代。2013 年公司开始尝试互联网业务,那时候采用了 OpenResty+NGINX 静态配置的方式搭建了最初的网关,开发人员通过 SCP 来发布。与此同时一个比较严重的问题就是,每次上线发布都需要运维人员的协助才能保证平滑上线。

随着业务的发展和人员的扩充,2016 年我们开发了第二代发布系统和相关迭代网关。这次是基于 OpenResty 集成了 upsync 模块,同时配合 Consul 来进行服务发现。第二代的系统解决了上一代开发人员无法独立发布上线的问题,但仍需要运维协助才能进行扩容。

之后公司业务开始了迅猛发展,开始对网关以及产品的弹性扩缩能力有了更高的要求。2018 年我们基于 K8s 开发了第三代系统。考虑到仍有部分应用遗留在数组机上,所以整个网关架构是在 K8s 上使用 Ingress NGINX 来当作第二层的网关,第一层网关仍是 OpenResty 配合的双层网关架构。这种情况下虽然解决了前代发布扩容等自助问题,但又引入了新的麻烦。

业务的快速扩充致使对于整体稳定性的要求越来越高。采用这种双层网关架构后,一层 NGINX reload 和二层网关的路由变更,都会造成长连接断开。这对于一些长连接使用场景,比如软件对老师的授课状态获取就会断开,从而影响授课过程。

从上图的网关流量拓扑图可以看到我们前文提到的双层网关架构,本身双层架构就会带来成本层面的一些增加。在双层网关架构下,目前都会出现 reload 变更的场景,不管是在第一层网关添加域名、修改配置或者添加一些特殊规则等,都需要 reload NGINX。

同时从整体架构来看,组件的配合对于流量控制层面来说比较差。尤其是目前我们的业务用户体量已达到千万级别,一旦客户端出现不可规避的异常,就有可能出现侵蚀服务端的情况,这种时候如果在网关层面没有一定的流量控制能力,对于后端来说将会造成非常严重的雪崩。

因此,基于上述迭代遗留问题和架构痛点,在 2022 年我们引入了 APISIX 来解决上述问题。同时借助 APISIX,也加强了在网关层面对于流量的控制能力。

但是在迁移 APISIX 的过程中,也会存在一些已知挑战。比如:

  • ⼀层 NGINX 域名多,定制化规则复杂。目前我们的业务中有 700+ 域名,同时还存在非常多的定制化配置,比如重定向、黑⽩名单等,这些都需要适配 APISIX 的插件。
  • 由于历史遗留问题,⼀层 NGINX 和⼆层 Ingress 网关还是⼀对多的关系,对于后续的流量切换是不是会很复杂,这也是一个待解决问题。
  • 内部存在的双层 DNS 架构。目前 DNS 解析主要用于处理公网和服务器内部的解析,所以对于后续的方案我们更希望是一个能方便回滚同时可以优化内网调用性能的。

迁移 APISIX 后架构调整

面对上述已知的挑战,在迁移过程中主要进行了以下三个角度的操作。由于整个迁移过程没有涉及研发内容,所以全部都是由运维人员实施的。

在迁移过程中,首先要做的就是 APISIX 路由的生成。基于原本的架构,我们去掉了一层特殊功能,比如 rewrite、set-header 等。弱化一层网关的转发,把所有功能都集中在二层的 Ingress 上,然后基于 Ingress 去生成 APISIX 的路由。同时在 NGINX 配置的基础上,需要去适配 APISIX 的插件。

路由生成后,就需要去校验整个转发过程是否正确。我们基于 goreplay 的录制回放来验证路由转发的正确性,同时通过自动化脚本来验证插件功能是否正常。在功能校验通过的情况下,我们会继续验证 APISIX 在性能层面是否满足内部需求。因此,在性能压测过程中我们自研了 elastic-apm 插件,同时针对部分影响 QPS 的插件进行了性能优化。

处理完功能跟性能相关的问题后,最大的挑战就是流量切换了,因为流量切换将直接关乎生产质量。

虽然前边我们已经使用了 goreplay 进行流量录制回放,但我们仍然需要一个比较可靠的回滚方案。假设流量切换造成了异常,比如转发异常或者是 APISIX 出现崩溃时,能够进行快速回滚操作。基于此,我们首先切换了公网流量,因为公网是通过 WAF 回源到 SLB 来进行流量切换的,这时如果我们切换到 APISIX,就可以很方便地去修改回源地址来将整个流量进行回滚,如上图标注「切换」字样所示。这个异常情况下的流量切换过程基本是在秒级别,可能 10 秒内就把所有流量都切回来了。

完成了公网流量切换的情况下,顺利运行了几天,我们就通过 APISIX 将内网流量也进行了变更,然后整个生产上的切换就全部完成了。但是这个上线过程中,其实我们还是遇到了一些问题的。

迁移过程中的问题与解决方案

Prometheus 插件转发延迟

这个是在我们内网测试环境中发现的一个问题。由于我们的内网是 all-in-one 的测试环境,所有部门都使用同一个 APISIX 的入口,所以路由规则非常多,达到 4000+。这样就会导致每次拉取 Prometheus 插件时, metrics ⼤⼩达到 80M+,造成单个 worker 进程跑满,从而造成 worker 的转发延迟。

这个问题是目前 APISIX 开源版本存在的一个现象,主要是因为业务流量和内部 API 流量(比如Prometheus metrics 和 Admin API)都共用 worker 造成的。我们在之前是针对 Prometheus 插件进行了修改,其中延迟相关的metrics 占用了90%以上,我们将这部分采集去掉了,还是满足我们业务的监控需求。

  不过最近我们针对这个问题又有了新的方案。这套新方案是对 Nginx 源码进行修改,通过多启动⼀个或多个 worker 进程(isolation process) 来专⻔监听特定端⼝(比如 Prometheus、admin、control 等),不监听处理正常业务端⼝请求。其它的 worker 进程则取消监听上述特定端口,只处理正常业务端⼝请求,来确保 APISIX 内部请求和正常业务请求不会互相影响。

详细的文章可以参考:如何修改 Nginx 源码实现 worker 进程隔离

默认路由匹配异常

在上线 APISIX 后,我们发现域名并没有走精确匹配模式,而是采用了通配符匹配,这跟 NGINX 的域名最长匹配是不一致的。为此,我们通过更换路由策略,将 URL 方式改成了 host+URL 的方式,解决了该问题。

但关于 APISIX 基于 URL 路由策略作为默认路由的问题,大家可以在自己的生产环境中进行压测后再决定是否保留。

假如你的生产场景中属于 URL 特别多、域名特别少的类型,那 APISIX 这种默认路由策略是完全 OK 的。但在我们的业务场景下,并没有这么多 URL,所以采用 host+URL 的方式是更满足我们的性能需求。

默认自动绑核问题

在云原生的背景下,大部分用户都会选择将 APISIX 部署在容器中使用。但 APISIX 在默认配置下会进行自动绑核,这样就会导致在容器化场景下,可能只会用到前几个核心,造成前几个核心跑满而后几个核心仍处于空闲的状态。虽然 CPU 使用率不高,但APISIX转发会出现延迟。

不过 APISIX 社区最近已经开始调整这个配置,将 worker_cpu_affinity 配置的默认值从 true 改为了 false。因此这个问题目前在 APISIX 版本中已经解决了。

版本升级兼容问题

在上线 APISIX 的过程中,我们还发现在较老的系统或 OpenSSL 库中,它的 ssl_ciphers 和服务端默认值⽆交集,从而造成 SSL 握手失败。

针对这个问题,我们建议大家在上线 APISIX 之前,先通过一些 SSL 工具先去探测一下当前旧网关与 APISIX 网关的 SSL 握手交集是否正确或满足使用场景,然后再进行规模化的迁移调整。

除此之外,在 APISIX 发布 2.15 LTS 版本后,我们就在内网进行了升级,但是升级后就发现了一些路由匹配相关的问题。

因为从旧版本升级到新版本时,存在一些兼容性问题,导致 redirect 插件参数 http_to_https 为true 时,参数 http_to_https 和 append_query_string 校验失败,进而路由加载失败,导致路由丢失。这种情况下就会在路由匹配时出现 404 或者转发到其他上游的情况。

目前这个问题已经在 APISIX 的 master 分支中解决了,但是并没有针对 2.15 版本进行单独解决,所以大家在使用该版本时也需要留意这部分问题。

应用 APISIX 的收益及展望

虽然前边提到了一些我们在上线 APISIX 过程中遇到的问题,但是在应用 APISIX 之后,给公司业务层面还是带来了很多价值的。比如:

  • 运维效率提升。使用 APISIX 后,再也不存在 reload 相关的烦恼,可以做到随时更新路由和证书等,给开发人员带来了操作上的便利。
  • 流量控制能力提升。使用 APISIX 后,我们在熔断和限流方面都得到了提升,稳固了整个核心流程。
  • 自研插件,增强网关能力。得益于 APISIX 的强拓展性和自身插件性能的优异,我们也会更主动地去开发一些插件。比如我们在 APISIX 上集成了统一鉴权的能力,新业务⽆需单独对接鉴权系统,加快了产品迭代流程。

  • 去掉了冗余的一层 NGINX,实现降本增效。之前的双层网关架构中,一层的 NGINX 对于开发人员并不透明。现在将双层网关合并为一层后,开发人员可以很清晰地看到整个架构的路由、插件等配置,对于排查问题来说更加方便快捷。 在后续使用 APISIX 的规划中,我们还是会继续在网关层面进行增强。比如开发针对内部业务的自研插件,提供多租户的能力,或者是将 API 管理的功能带到网关层面等等。

当然在这个过程中,我们也在积极回馈社区。目前已在社区中贡献了 8 个 PR,帮忙完善和修复了一些生态插件相关的问题。比如完善 batch_request ⽀持⾃定义 uri、为 hmac-auth 插件提供请求 body 校验等功能。

希望在后续的实践过程中,我们可以更全面地去使用和发挥 APISIX 的特性,同时也会更加积极地去探索 APISIX 的使用场景,也非常期待未来有更多的共建功能上线。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”

近日,在“开源中国(OSCHINA)”开展的年度评选中,袋鼠云数栈技术团队凭借在2022年间的技术分享频率及质量、运营积极性等多方面的表现,荣获“2022年度优秀开源技术团队”的称号,这也是袋鼠云数栈技术团队连续…

umi学习总结

文章目录umi介绍umi是什么?umi的特性开发环境Node.js依赖管理工具目录结构路由配置路由页面跳转Link组件路由组件参数:路由动态参数query信息样式使用css样式dva为什么需要状态管理umi如何管理状态umi介绍 umi是什么? Umi,中文发…

自定义委托类

setItemDelegete();该函数可以自定义委托类 该例子为Qt官网的一个例子:使用QSpinBox来提供编辑功能 首先创建一个项目:名为object在项目中添加一个c类,类名为SpinBoxDelegate 修改该类的基类:更改为QImageDelegate,然后需要添加重…

12/15历史上的今天

宜找代驾 星期四 农历十一月廿二 今夜无人拥你入怀不如喝完杯中酒走入夜色中踏上回家的归途 *约翰-梅尔西藏墨脱公路嘎隆拉隧道顺利贯通 2010年12月15日,西藏墨脱公路控制性工程——嘎隆拉隧道顺利贯通。   2010年12月15日西藏墨脱公路控制性工程——嘎隆拉隧道…

华为开源自研AI框架昇思MindSpore应用实践:RNN实现情感分类

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、数据准备1.数据下载模块2.加载IMDB数据集2.加载预训练词向量三、数据集预处理四、模型构建1.Embedding2.RNN(循环神经网络)3.Dense4.损失函数与优化器5.训练逻辑6.评估指标和逻辑五、模型训练与保存六、模…

电脑重装系统后卡顿怎么办?教你快速解决电脑卡顿问题

​Win10电脑卡顿怎么办?许多用户在使用电脑的过程中发现,随着使用时间的增加,电脑会越来越卡顿。有些小伙伴就会选择重装电脑系统,那么我们在重装电脑之后要进行什么操作才能让电脑不卡顿呢? 操作方法: 优化…

java学生成绩管理系统源码swing(GUI) MySQL带开发教程永久学习

今天给大家演示一款由Java swing即GUI和mysql数据库实现的,学生成绩管理系统,系统采用了MVC的设计模式,结构层次非常清晰,此外,该项目有手把手的开发教程,适合刚入门Java的学生学习,下面我们来看…

Pr:导出设置

◆ ◆ ◆导出设置(媒体文件)Export Settings(Media File)基本设置文件名File Name指定导出的文件名。位置Location可以点击蓝色字更改导出的文件的存放位置。预设Preset选择导出预设。匹配源 Match Source预设会将大多数设置与源…

[附源码]Python计算机毕业设计高校贫困生信息管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Mysql 查询获取 为数字的 字符串

先看示例数据: test_value 字段 为 VARVCHAR 类型 数据样例: 包含 纯数字, 带小数点的数字, 字符串 获取里面的纯数字 :使用正则匹配 函数 REGEXP ,返回 1代表不匹配, 返回 0 代表匹配 包含小数点 [^0-…

两步开启研发团队专属ChatOps|极狐GitLab ChatOps 的设计与实践

本文来自: 彭亮 极狐(GitLab) 高级产品经理 郭旭东 极狐(GitLab) 资深创新架构师 舒文斌 极狐(GitLab) 高级网站可靠性工程师 最近几天,ChatGPT 真是杀疯了 ! 相信大家的朋友圈,已经被调戏、询问或探讨 ChatGPT 的贴子刷屏。 看到…

虹科案例 | 风电机组的预测性维护应该如何进行?

虹科预测性维护方案 在风能领域的应用 虹科案例 01 应用背景 风能是最重要的清洁能源之一,大力发展风电等清洁能源是实现国家可持续发展战略的必然选择。发展风电、光伏等新能源的高效运维技术已成为当前电力系统面临的重要问题之一。在风电机组单机容量较大、机组…

在Azure上设置存储账户

目录 (一)前言 (二)正文 1. 搜索存储账户类型资源 2. 开始创建新存储账户 (1)基本信息 (2)高级选项 (3)网络配置 (4)数据保护…

怎么看电脑是32位还是64位?2个方法,快速查看

熟悉计算机操作系统的朋友应该知道,电脑系统分为32位和64位。不同系统位数的兼容软件也会有所不同。怎么看电脑是32位还是64位?这里小编分享2个方法,快速查看自己的电脑系统位数。 方法一:电脑属性查看法 很多小伙伴不知道怎么看…

特殊符号——双引号和单引号

特殊符号——双引号和单引号一.通常理解二.一般使用三.特殊使用四.为何计算机需要字符一.通常理解 在c语言中,我们通常认为双引号保存的是字符串,单引号里保存的是字符。这里也没什么好说的,说一说它们的细微的一些地方 二.一般使用 接下来我…

图为科技与深圳人工智能产业协会联合发布边缘计算机概念

2022年12月13日由图为信息科技(深圳)有限公司联合深圳市人工智能产业协会举办的“边缘计算机发布会”在深圳市龙岗区大运AI小镇举行。 随着5G、物联网、人工智能等技术的规模应用和持续进步,边缘计算市场进入蓬勃发展期。我国在《…

罗克韦尔(AB)PLC远程维护连接不上网关怎么办?

对很多使用罗克韦尔(AB)PLC的工厂来说,PLC具备成熟系统和稳定性能等特点,可以适应厂内设备的控制指令,需要细心保养,认真维护。随着无线通信技术和物联网技术的发展,PLC的数据上云进行云端监控和…

过两年 JVM 可能就要被它替代了

今天说一说 GraalVM。 GraalVM 是 Oracle 大力发展和想要推广的新一代 JVM ,目前很多框架都已经渐渐支持 GraalVM 了,比如我们在用的 Spring 也已经推出了对 GraalVM 兼容的工具包了。 既然说的这么厉害,那么它到底是何方神圣呢。 GraalVM…

java零基础入门-Scanner类

目录 1.概念 2.常用api 3.next()方法 4.nextLine()方法 5.next()与nextLine()区别 6.实例 1.概念 针对java5版本诞生,在jdk之前版本这次的版本是添加了java.util.Scanner类;其类是一个用于扫描输入文本的工具集。它不仅提供了可结合正则表达式和从输…

基于云原生的集群自愈系统 Flink Cluster Inspector

作者: 舟柒、楼台 1. 业务背景与挑战 1.1 实时计算集群现状 关于热点机器处理一直是阿里云 Flink 集群运维的一大痛点,不管在日常还是大促都已经是比较严重的问题,同时这也是分布式系统的老大难问题。而在今年整个阿里云成本控制的背景下,…