小鹅通基于 TSE 云原生 API 网关的落地实践
导语
2023腾讯全球数字生态大会已于9月7-8日完美落幕,40+专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。
微服务与消息队列专场,我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。
本篇文章针对这场演讲做了详细的解读。主要介绍小鹅通在 TSE 云原生 API 网关上的一些建设和经验,以及在这个过程中遇到了哪些问题和挑战,基于 TSE 的解决方案又是如何在小鹅通进行落地的,以及如何利用云原生网关实现降本增效的经验分享。
关于小鹅通
小鹅通是一家以知识产品与用户为核心的技术服务商。提供知识产品与用户服务的私域运营工具,小鹅通创始至今已经服务百万家客户,最高同时在线人数达一千万,面向7.8亿终端用户提供2000万知识产品。
小鹅通现状分析
CVM 时代入口网关架构
在 CVM 时代,小鹅通的入口网关是比较典型的一个架构,由大量的公网负载 CLB 组成,由于不同的场景和策略,导致小鹅通的安全防护覆盖程度不完全并且也难以梳理;小鹅通的业务场景属于流量变化比较明显的,在 CLB/CVM 的架构下,难以及时进行扩缩容,有些业务需要进行2到3倍的资源冗余,以保证流量上涨的稳定性,就会造成小鹅通的资源利用率低和成本的增加;伴随着这个问题,小鹅通有上百个公网 CLB,CLB 背后有上千条的路由规则,和后端的业务服务形成多对多的非常复杂的矩阵,造成运维成本非常高。

容器时代入口网关架构
随着采用容器化部署,小鹅通目前大部分的流量在容器集群上,在过渡阶段以及部分业务情况仍然需要考虑 CVM 场景,在一开始的技术选型上采用的是公司内部技术栈比较熟悉的也具备高性能的 Openresty 来实现的 Ingress API 网关,但引入了新架构的同时也加剧了原先存在的问题;因为小鹅通的业务和基础设施都是在云上,这部分和云产品的集成度一般,在保障稳定性建设的同时,还需要投入比较多的精力开发集成各块云原生产品。

因此,需要设计更好的架构以满足小鹅通的业务需求,解决痛点问题。
解决方案
在前期的自研过程,小鹅通也参考和调研了许多优秀 API 网关的架构与设计,像 Kong、ApiSix、TSE、Higress 等等,结合本公司的实际业务场景,从稳定性与高可用、流量治理、自动化能力、资源利用率出发,认为以上几个点需要优先保障或解决。
小鹅通列出每个维度需要考虑的要素,进行综合性对比分析。

云原生时代入口网关架构
相比其他解决方案,TSE 云原生 API 网关满足多可用区容灾部署、多种接入方式统一管理能力、开箱即用的限流熔断、流量灰度流量镜像、安全防护能力。由于小鹅通业务服务流量波峰波谷的性质,TSE 云原生 API 网关同样集成支持按照弹性伸缩和定时伸缩,最终小鹅通在这些方案中选择了 TSE 作为小鹅通的统一 API 网关方案。
经过变化调整,小鹅通得到一个如下图所示的云原生入口网关架构,通过从网关到小鹅通的服务再到数据库中间件的多可用区部署,来保障稳定性与高可用能力;统一流量入口、集中访问控制和提高安全性;提升自动化能力以提高我们的运维效率;根据自动弹性扩缩容、按需按量的付费策略,资源复用,提高小鹅通的资源利用率以降低成本。

接下来看一下小鹅通使用 TSE 云原生 API 网关后的两个具体场景。
稳定性与高可用
采用 TSE 云原生 API 网关节点的多可用区部署,配合小鹅通后端业务集群和底层的基础设施、数据库中间件的多可用区部署,在极端场景下的节点机器、磁盘、网络故障发生时,能够做到自愈和快速恢复,借助多可用区容灾能力提高小鹅通整体的稳定性和高可用能力。

流量治理
流量治理是前面提到的比较头疼的部分。面向客户端,小鹅通有非常多的入口,有100多个公网负载、上千条的路由规则,需要对这些进行拆分和复用;面向后端,小鹅通有 K8s 集群、CVM、Serverless 多种运行环境,同时也有多套 K8s 集群,也需要降低这里的运维成本。
因此这里分为两个部分来说明,面向客户端,通过 TSE 云原生 API 网关来统一管控,按照业务场景和需求进行集群、分组拆分,例如集群级别的物理隔离、不同网络安全策略,进行多集群的横向拆分,在单个集群内,还可以进行分组,达到物理隔离和配置路由复用的目的,从而完成南北流量和东西流量的统一治理;面向后端,多个业务集群统一管控,支持K8s、CVM 等多种运行环境的接入,TSE 本身和TKE 集群的集成度比较高,所以管理多个 K8s 集群是一个比较轻松的事情。

方案迁移落地
在上一个部分,提到了 TSE 云原生 API 网关的架构和设计,能够解决小鹅通不少的问题和要求,但是实际如何迁移落地是一件至关重要的事情,小鹅通对整个迁移方案进行了几个阶段的任务拆解;
第一阶段:针对小鹅通自研的网关、开源网关以及云原生网关进行性能压测对比,从 CPU、内存、带宽、新建连接数、并发连接数等等这些基础关键性的指标进行详细对比,确保验证通过并且符合小鹅通的预期。
第二阶段:根据这些多维度的指标,评估契合小鹅通业务的容量方案,包括规格、节点数等。
第三阶段:结合小鹅通实际的业务场景和业务开发测试一起进行多个业务线、多次的服务压测、全链路压测,以保障服务质量,为小鹅通的客户使用体验负责。
第四阶段:通过 OpenAPI 全量同步100多个公网负载、上千条的路由规则,在这个过程中,梳理了大量的路由规则,确认涉及的功能以及影响范围,将不确定性的部分变为确定性。
最后一步:根据前面梳理的规则,按照域名、用途进行分阶段分批次的渐进式迁移,逐步将流量切割到 TSE 云原生 API 网关上,完成最终落地。
如何完成平稳流量切割
关于如何完成域名平稳流量切割到 TSE 云原生 API 网关,这里列举了两个简化的场景。
第一种场景,设置域名解析权重,请求解析到不同的后端实例完成分流,从1%逐步增加流量直到全量请求到 TSE 云原生 API 网关,再将域名解析切换到 TSE 云原生 API 网关。
第二种场景,域名直接解析到 TSE 云原生 API 网关,在网关的服务或者接口路由上配置灰度策略,将流量转发到后端对应的业务服务,逐步增加流量到100%,最后清除灰度策略;实际情况下会比上面提到的两种稍微复杂一些,小鹅通在域名解析和灰度策略上做了不少工作,来实现秒级流量切换和回退。

统一网关带来的收益
除了解决前面提到的核心问题,统一网关也带来了以下收益:
1、减少了90%以上的 CLB 实例数量,通过网关自身的弹性扩缩容配合我们业务的弹性伸缩,极大的降低了我们的资源成本和维护成本;在整个迁移的过程中,同时也梳理了大量的公网域名、路由、负载,进行了相应的合并删减。
2、充分利用 OpenAPI、CRD、插件的方式提高小鹅通的自动化能力,将一些动作和小鹅通的服务初始化的流程和其他环节打通,提高效率的同时也降低了出错的可能性。
3、借助 TSE 云原生 API 网关来统一治理小鹅通业务服务的入口流量,和 WAF、VPN、流量镜像、接口请求响应的审计分析,和小鹅通的安全团队运维团队一起提高访问控制与安全性。
总结
感谢 TSE 云原生 API 网关团队,在性能压测和容量评估阶段,提供了很多的数据参考和成本方案建议,同时在整个迁移过程也提供了非常多的技术支持和保障护航。
相关文章:
小鹅通基于 TSE 云原生 API 网关的落地实践
导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕,40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场,我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。…...
Postgresql处理JSON类型中替换某个属性值问题
一、问题描述 使用postgresql对json的特性使用sql批量处理json中某个属性的值 结构如下: {"id": 1,"parentId": 123,"globalParameters": [{"value": "date","boardId": 123,"canReName":…...
@德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
德人合科技 | 天锐绿盾加密软件是一款全面保障企业电脑数据和安全使用的加密软件 PC端访问地址:www.drhchina.com 它的功能包括但不限于: 实时操作日志:可以实时详细地记录所有终端的操作日志,包括终端上窗口标题的变换、程序的…...
android 使用GSON 序列化对象出现字段被优化问题解决方案
一、问题描述 有以下结构: public class NativeParam<T> {private T data;public NativeParam(T data) {this.data data;}public T getData() {return data;}public void setData(T data) {this.data data;} };NativeParam<String> data "1.0…...
进入不了Bios?进入Bios的方法都在这了,肯定能进!
前言 有些小伙伴可能在重装系统的第一步就卡住了,接着就放弃了。哇哈哈哈啊,先让小白笑会~ 根据小白十二年的装机经验,不同主板进入Bios的时候有不同的姿势。也许要蹲着大喊Bios才能进入呢?要不试试? 好了…...
手把手教你基于 FastGPT 搭建个人知识库
前言 大家好,我是潇潇雨声。我发现在使用 GPT 时,尽管它能够生成一些小红书文案和日志,但内容常常显得空洞缺乏深度。今天我想分享一个解决这个问题的方法,那就是基于开源项目 FastGPT[1]。 我们可以通过向 GPT 提供一些有针对性的…...
gitee 怎么添加SSH密钥
要在Gitee上添加SSH密钥,请按照以下步骤操作: 登录到Gitee账户并导航到您要添加SSH密钥的存储库页面。点击页面右上方的“设置”按钮。在设置页面中,选择“SSH公钥”选项卡。点击“添加密钥”按钮。在弹出的对话框中,输入密钥标题…...
万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码
一、系统概述: 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理,车间基础数据管理&…...
macOS 开发 - MASShortcut
文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群:644096295,V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具,替代和兼容 ShortcutRecorder github : https://git…...
【大数据面试】Flink面试题附答案
目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度? ✅什么是算子链? ✅什么是任务槽(Task Slots)? ✅任务槽和并行度的关系 ✅Flink作…...
语音识别之百度语音试用和OpenAiGPT开源Whisper使用
0.前言: 本文作者亲自使用了百度云语音识别,腾讯云,java的SpeechRecognition语言识别包 和OpenAI近期免费开源的语言识别Whisper(真香警告)介绍了常见的语言识别实现原理 1.NLP 自然语言处理(人类语言处理) 你好不同人说出来是不同的信号表示 单位k 16k16000个数字表示 1秒160…...
Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found
当我在我的 windows 电脑上安装 rust,然后用 cargo 新建了一个项目后,cargo run 会报错: error: linker link.exe not found| note: program not foundnote: the msvc targets depend on the msvc linker but link.exe was not foundnote: p…...
2312llvm,04后端上
后端 后端由一套分析和转换趟组成,任务是生成代码,即把LLVM中间(IR)转换为目标代码(或汇编). LLVM支持广泛目标:ARM,AArch64,Hexagon,MSP430,MIPS,NvidiaPTX,PowerPC,R600,SPARC,SystemZ,X86,和XCore. 所有这些后端共享一套,按通用API方法抽象后端任务的目标无关生成代码的一部…...
springboot学习笔记(五)
MybatisPlus进阶 1.MybatisPlus一对多查询 2.分页查询 1.MybatisPlus一对多查询 场景:我有一个表,里面填写的是用户的个人信息(姓名,生日,密码,用户ID)。我还有一个表填写的订单信息&#x…...
文件上传——后端
文件上传流程: 创建阿里云OSS(对象存储服务)的bucket 登录阿里云,并完成实名认证,地址:https://www.aliyun.com/. 可以通过搜索,进入以下页面: 点击立即使用后: 点击…...
虾皮开通:如何在虾皮上开通跨境电商店铺
在当今的数字时代,跨境电商已经成为了全球贸易的一种重要形式。虾皮(Shopee)作为东南亚市场份额第一的跨境电商平台,为卖家提供了广阔的销售机会。如果您想在虾皮上开通店铺,以下是一些步骤和注意事项供您参考。 先给…...
C语言—每日选择题—Day60
明天更新解析 第一题 1. 下列for循环的循环体执行次数为() for(int i 10, j 1; i j 0; i, --j) A:0 B:1 C:无限 D:以上都不对 答案及解析 A for循环的判断条件是 i j 0;赋值语句做判断条件…...
【3D生成与重建】SSDNeRF:单阶段Diffusion NeRF的三维生成和重建
系列文章目录 题目:Single-Stage Diffusion NeRF: A Unified Approach to 3D Generation and Reconstruction 论文:https://arxiv.org/pdf/2304.06714.pdf 任务:无条件3D生成(如从噪音中,生成不同的车等)、…...
计算机网络:应用层
0 本节主要内容 问题描述 解决思路 1 问题描述 不同的网络服务: DNS:用来把人们使用的机器名字(域名)转换为 IP 地址;DHCP:允许一台计算机加入网络和获取 IP 地址,而不用手工配置࿱…...
现代雷达车载应用——第3章 MIMO雷达技术 3.2节 汽车MIMO雷达波形正交策略
经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.2 汽车MIMO雷达波形正交策略 基于MIMO雷达技术的汽车雷达虚拟阵列合成依赖于不同天线发射信号的可分离性。当不同天线的发射信号正交时&#x…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
