流控验证太麻烦?不敢上生产?MSE 有办法!

news2025/1/11 9:57:55

作者:涯客

影响服务稳定性的因素有很多,其中比较常见但又往往容易被忽视的就是面向流量的稳定性,流控是保障服务稳定性的重要手段。但是,我们发现大量客户仅仅在开发环境和预发环境中测试流控,却在生产环境中鲜有使用。根据深入的交流,发现问题主要在二方面:

  • 第一:对于首次发布的服务,由于无法精确预测真实流量的大小,往往无法给出合理的限流条件,这给流控的实施带来了很大的挑战。
  • 第二:对于已经上线的服务,直接对正在运行的业务进行流控可能会导致业务宕机或请求错误,进而影响用户体验。部分拥有能力的客户,会在测试环境中模拟生产环境中流量,从而验证流控的正确性,进而在生产环境中实施。这最大的问题是验证成本较高,验证流程较长,而且测试环境无法完全还原生产环境中流量情况。

我们可以归纳以上的问题为一点:如何在不影响生产业务的情况下,小成本验证流控能力,进而在生产环境中实施流控。

在不验证的情况下,直接在生产环境中生效流控规则,很有可能让解决灾难的办法成为灾难本身,例如流控规则配置错误、流控没有达到预期、流控无故生效导致业务宕机等等,这些问题在生产环境中是完全无法接受的。

那么有什么办法能够在生产环境中小成本、快速地验证流控能力?能够在生产环境中确定配置的流量防护策略是否合理?一个简单的思路就是只对线上一部分的流量进行流控验证,即在可控范围内做流控验证。

基于这一想法,我们使用微服务引擎(MSE)中热点参数防护的功能,提出了一种合理的解决方案:首先在生产环境中进行可控范围内的流控能力验证、确定流控合理配置,进而在生产环境中启用流控。

在这里插入图片描述

MSE微服务治理简介:微服务治理中心无侵入增强主流Spring Cloud、Apache Dubbo和Istio等开源微服务框架,提供丰富的服务治理和流量防护功能,将中间件与业务解耦,拥有如下功能:无损上线、无损下线、全链路灰度、流量控制、离群实例摘除等。

验证思路

我们将会按照以下顺序验证所提出方案的可行性:

  1. 搭建基础场景用于模拟生产环境。
  2. 配置相应的流控规则,用于能力验证。
  3. 流量测试。

在这里插入图片描述

基础场景搭建

我们使用MSE服务治理中热点参数防护功能来实现生产环境可控的流控能力验证。

本文以常见的长链路调用场景为例,介绍生产环境下进行可控范围内的流控能力验证的过程,搭建的具体流程不再介绍,可详见MSE产品help文档 [ 1]

模拟场景使用如下后端场景,后端共有3个服务:应用A、应用B、应用C。这3个服务之间通过MSE Nacos注册中心实现服务发现。客户可以通过客户端后者HTML来访问后端服务。客户的请求到达网关后,调用链路为 :用户>MSE云原生网关>A>B>C。

说明:我们的要求是对于指定带标签的流量,任何配置相应流控规则的应用都应起到流控作用。对于从网关到应用A的流量,因携带标签,热点参数防护功能可以生效。但是对于应用A至应用B的流量,会丢失流量中的标签,我们需要额外标签透传的功能,才能保证应用B得到携带标签的流量,从而使得热点参数防护功能可以生效。

在这里插入图片描述

名词解释:

  • MSE云原生网关:MSE云原生网关是兼容K8s Ingress标准的下一代网关产品,支持ACK容器和Nacos等多种服务发现方式,支持多种认证登录方式快速构建安全防线。更多信息,请参见云原生网关概述 [ 2]
  • 带标签请求:请求中的header带指定kv
  • 标签透传请求:正常的RPC请求,即应用A到应用B的请求是不会携带前置请求的header信息。如果是标签透传,前置请求中指定header将会携带后续的请求中

流控配置

我们希望仅仅对线上可控范围内的流量进行流控验证,比如用户等级比较低的请求流量,或者是内部用户的测试流量,从而在不会对线上的服务造成影响的前提下足够地验证流控能力。

我们模拟如上场景,标识特定的流量请求header中加入key为limit,value为true的参数值,特定的流量会被流控规则所控制最大请求范围,并且保证正常的请求流量不会受到任何影响。

然后我们对应用A、应用B加入热点参数防护,用于后续方案可行性验证。该操作对header含有limit:true的请求进行流控,为了效果明显,设定流控生效的qps阈值为20(即qps超过20时,请求将会被拒绝)。

在MSE服务治理中,为应用配置热点参数防护的具体过程如下。

3.1 应用A流控规则配置

  1. 我们只需在mse服务治理页面配置如下热点参数防护能力,就能实现针对特定流量的流控配置。

在应用a中依次选择 选择流量 > 流量防护 > 热点参数防护(HTTP请求) > 新增热点参数防护。

在这里插入图片描述

2.为接口/a加入如下配置防护规则。

在这里插入图片描述

  1. 针对指定的请求配置流控规则,比如下图所示header值为limit且value为true的流量会被当前配置的流控规则控制最大的QPS阈值20。

在这里插入图片描述

3.2 应用B流控规则配置

应用B按照应用A一样配置。

  1. 在应用b中依次选择 选择流量 > 流量防护 > 热点参数防护(HTTP请求) > 新增热点参数防护。

  2. 为接口/b加入如下配置防护规则。

在这里插入图片描述

  1. 针对指定的请求配置流控规则,比如下图所示header值为limit且value为true的流量会被当前配置的流控规则控制最大的QPS阈值20。

在这里插入图片描述

流量测试

在配置完成后,为了模拟生产环境,我们将会依次发送正常请求、被标记请求,检验流控对正常请求和被标记请求是否生效。

我们首先根据如下步骤,获取入口地址:

  1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。
  2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。
  3. 在左侧导航栏,单击基本概览。
  4. 在网关入口页签,查看SLB的入口地址(ip)。

在获取入口地址之后,我们将会对/a接口依次进行如下流量测试。

4.1 正常请求无流控

  1. 向/a接口持续发送无标签的请求。

  2. 可在输出中发现请求没有任何限制,均是正常返回,返回如下。

A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]

4.2 被标记请求应用A流控生效

  1. 向/a接口持续发送含标签请求(header含有limit:true)。

  2. 当qps超过20时,请求出现限流信息,限流信息如下。

Blocked by Sentinel (flow limiting)

4.3 被标记请求应用B无流控

  1. 关闭A服务的流控限制。

  2. 向/a接口持续发送含标签请求(header含有limit:true)。

  3. 可在输出中发现请求没有任何限制,均是正常返回,返回如下。

A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]

说明:如果没有开启标签透传,应用A调应用B的请求无法将header透传。从而无法满足对于指定带标签的流量,任何配置相应流控规则的应用都应起到流控作用的效果。

4.4 配置透传,被标记请求应用B流控生效

  1. 为应用A配置header透传。在k8s集群中寻找到spring-cloud-a服务,在环境变量中加入变量名称:alicloud.service.header ,变量引用:limit。

说明:MSE服务治理使用agent技术,可以使得流量中的header透传

在这里插入图片描述

在这里插入图片描述

  1. 向/a接口发送含标签请求(header含有limit:true)。

  2. 当qps超过20时,请求出现限流信息,限流信息如下。(报错是因为A没有拿到B的正常信息)。

{"timestamp":"2023-04-24T06:35:46.835+0000","status":500,"error":"Internal Server Error","message":"429 null","path":"/a"}

说明:在配置标签透传情况下,可满足对于指定带标签的流量,任何配置相应流控规则的应用都应起到流控作用的效果。

总结

到目前为止,我们通过MSE的热点参数防护与自定义header透传能力的组合,实现了仅针对有特定标识流量的流控能力。这使得我们可以在不影响业务的情况下,在生产环境中做可控范围内的流控能力验证。相较于另外搭建整套预生产环境来验证流控能力来说,该方案的成本更低,且更能直接验证到生产环境中流控规则以及流控后的 Fallback 行为的表现,做到真正的心中有数。

在本文中我们仅仅使用了MSE服务治理中的流量控制功能。然而对于微服务架构来说,生产场景中的每一个组件、每一个环节都至关重要。MSE微服务治理提供微服务各个环节的治理解决方案,旨在帮助企业快速落地完整且健壮的微服务体系。MSE服务治理可以在不修改任何代码和配置的情况下,降低微服务治理的成本,实现以下多种功能:

  1. 低成本实现微服务敏捷开发:包括服务契约、服务测试、开发环境隔离等。
  2. 全面消除变更过程中的风险:包括无损下线、无损上线、全链路灰度等。
  3. 全面消除运行过程中的稳定性问题:包括流量控制、离群实例摘除、熔断降级等。

在这里插入图片描述

欢迎大家使用MSE服务治理并提出宝贵意见。

相关链接:

[1] MSE产品help文档

https://help.aliyun.com/document_detail/478140.html?spm=a2c4g.475424.0.0.3297305eEXZQ1t

[2] 云原生网关概述

https://help.aliyun.com/document_detail/270868.htm#concept-2083330

点击此处进入微服务引擎 MSE 官网查看

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

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

相关文章

FastJson常用的API整理

工作的时候一直用到fastjson做JavaBean和Json的转化,最近工作的时候对fastjson的API的理解有点混乱,所以做了整理。 一、对象类型梳理 首先要明确在转换中涉及到的五个类型的对象,分别是:JavaObject、JavaObjectList、JsonStrin…

C语言初阶之三子棋

三子棋 初始文件建立主函数文件棋盘的初始化(InitBoard)打印棋盘(DisplayBoard)玩家下棋(PlayerMove)电脑下棋(ComputerMove)判定胜负所有代码game.hgame.ctest.c 结语 初始文件建立…

一文总结Redis面试知识点

文章目录 Redis知识点知识点1 缓存穿透知识点2 布隆过滤器知识点3 缓存击穿知识点4 缓存雪崩知识点4 双写一致性知识点5 Redis持久化知识点6 数据过期策略知识点7 数据淘汰策略知识点8 分布式锁知识点9 主从复制知识点10 哨兵模式知识点11 分片集群知识点12 IO多路复用 Redis问…

零信任安全:综合网络安全方法

在当今的数字世界,网络威胁日益复杂,使得组织更加难以保护敏感数据和系统的安全。为应对当前的网络威胁,全新的“零信任”安全模型应运而生。 零信任安全作为一种网络安全方法,要求组织必须验证每一次访问尝试,无论访…

云发布的Docker部署文档

云发布的Docker部署文档 文章目录 云发布的Docker部署文档1、服务器安装 Docker2、修改后端微服务的配置2.1 修改 MySQL 的配置2.2 修改 Redis 的配置2.3 修改 Nacos 的配置 3、生成微服务镜像4、拉取远程镜像5、生成前端镜像5.1 准备文件5.2 构建前端镜像 6、基于镜像生成并运…

《编程思维与实践》1062.计算2的N次方

《编程思维与实践》1062.计算2的N次方 题目 思路 法一:直接复用计算a的n次方的代码即可. 法二:注意到 2 30 2^{30} 230在int(32位,第一位为符号位, 2 31 − 1 2^{31}-1 231−1)的范围内,可以直接处理. 注: int范围为 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [−231,231−…

利用Eigen求解不同坐标系的旋转矩阵

不同坐标系之间的刚性转换以及实现: 坐标系转换原理如下,使用了仿射变换实现了旋转平移: [ r 11 r 12 t x r 21 r 22 t y 0 0 ] ∗ [ x y 1 ] [ x ′ y ′ 1 ] \begin{bmatrix} r_{11} & r_{12}& t_x\\ r_{21}& r_{22}& t…

有没有免费的云渲染平台?

有没有免费的云渲染平台?相信很多人在找云渲染平台的时候都会先网上查找下有没有免费的平台可以使用,而且也确实看到很多云渲染平台写着“免费渲染”,所以这免费是真的免费还是只是一个噱头呢?下面,由前沿的 云渲染平台…

如何应对洗钱犯罪的新变化?探索图数据库在反洗钱中的应用

背景导读 洗钱,即对非法资金的合法化过程。它由违法犯罪集团组织,在躲避银行和执法部门监测情况下,利用违法交易手段对非法收益进行转移,是金融犯罪领域最难发现的活动之一。当前,洗钱团伙日趋集团化、规模化和专业化…

服务熔断Hystrix入门

目录 一. 微服务的核心知识1.1 雪崩效应1.2 服务隔离1.3 熔断降级1.4 服务限流 二. Hystrix介绍三. Hystrix服务熔断的实现方式3.1 Rest 实现熔断3.2 Feign实现服务熔断 四.服务熔断Hystrix高级4.1 Hystrix的监控平台4.2 搭建Hystrix DashBoard监控4.2.1 熔断器的状态4.2.1.1 测…

成为一名高级网络安全工程师,你需要学习什么?

前言 这是我的建议如何成为网络安全工程师,你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程,我建议首先学python,然后是java。 (非必须)接下来学习一些算法和数据结构是很有帮助的,它将帮…

ChatGpt vs 文心一言,谁更厉害

前言 ​ 当下最火的人工智能毫无疑问是大模型的聊天机器人,ChatGpt的出现,让无数人为之惊叹,它聪明、逻辑清晰、又什么都懂,甚至被人们认为是第四次工业革命的开端。AI的大模型之争,美国的OpenAI已经率先拔得头筹&…

Path如何进行环境变量的配置?

开发Java程序,需要使用JDK提供的开发工具(比如javac.exe、java.exe等命令),而这些工具在JDK的安装目录的 bin目录下,如果不配置环境变量,那么这些命令只可以在该目录下执行。我们不可能把所有的java文件都放到JDK 的bin目录下&…

笛卡尔坐标系和Frenet坐标系

笛卡尔坐标系和Frenet坐标系 Frenet坐标系,自动驾驶“混乱”的源头 【自动驾驶】运动规划丨轨迹规划丨Frenet坐标转换 【自动驾驶】笛卡尔坐标系和frenet坐标系相互转换 轨迹规划作为具有多个非线性约束的高维优化问题,需要消耗大量的计算资源&#xff0…

前端012_标签模块_条件查询实现

标签模块_条件查询实现 1、需求分析2、Mock添加分类数据3、Api调用分类接口4、添加条件查询模版1、需求分析 在列表上方添加通过标签名称、分类名称的查询功能。 Form 表单参考 :https://element.eleme.cn/#/zh-CN/component/form#xing-nei-biao-danSelect选择器:https://el…

4-表约束和表设计

目录 1.表约束 1.1.什么是表约束? 1.2.为什么需要表约束? 1.3.常见的表约束 1.3.1.非空约束 not null --->a.查看非空约束 --->b.验证非空约束 1.3.2.唯一约束 unique --->a.查看唯一约束 --->b.验证唯一约束 --->PS&#xff…

error处理:org.springframework.web.bind.MissingServletRequestParameterException

在工作中遇到错误org.springframework.web.bind.MissingServletRequestParameterException 此时为POST方法,添加了RequestParam注解,如图 postman中请求如下 解决办法:选择form-data进行传参即可

linux 设备树详解

设备树 描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…

【服务器数据恢复】Linux系统下OA+oracle的数据恢复案例

服务器数据恢复环境: 某公司一台服务器中组建一组raid5磁盘阵列; 上层操作系统为linux redhat,部署OA系统,后端数据库为oracle。 服务器故障&初检: raid5中有2块磁盘先后掉线,服务器崩溃。oracle已经不…

springboot使用ECharts、ECharts html中文乱码、直接引用CDN资源文件和引用本地资源文件哪个好

springboot使用ECharts、动态地引用版本 1.添加依赖2.创建图表引入ECharts文件方式直接引用CDN资源文件和引用本地资源文件哪个好 3.映射4.添加配置加载ECharts资源5.测试访问6.升级版本号问题7.ECharts html中文乱码 如果想在Spring Boot应用程序中使用ECharts,则可…