小鹅通基于 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…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
