作者:涯客
影响服务安稳性的要素有很多,其间比较常见但又往往容易被忽视的就是面向流量的安稳性,流控是保证服务安稳性的重要手段。但是,咱们发现大量客户只是在开发环境和预发环境中测验流控,却在出产环境中鲜有运用。依据深化的沟通,发现问题主要在二方面:
- 榜首:关于首次发布的服务,由于无法准确猜测实在流量的巨细,往往无法给出合理的限流条件,这给流控的实施带来了很大的应战。
- 第二:关于现已上线的服务,直接对正在运行的事务进行流控可能会导致事务宕机或恳求过错,然后影响用户体会。部分拥有才干的客户,会在测验环境中模仿出产环境中流量,然后验证流控的正确性,然后在出产环境中实施。这最大的问题是验证本钱较高,验证流程较长,并且测验环境无法彻底复原出产环境中流量状况。
咱们能够概括以上的问题为一点:如安在不影响出产事务的状况下,小本钱验证流控才干,然后在出产环境中实施流控。
在不验证的状况下,直接在出产环境中收效流控规矩,很有可能让解决灾难的办法成为灾难本身,例如流控规矩装备过错、流控没有到达预期、流控无故收效导致事务宕机等等,这些问题在出产环境中是彻底无法承受的。
那么有什么办法能够在出产环境中小本钱、快速地验证流控才干?能够在出产环境中确定装备的流量防护战略是否合理?一个简略的思路就是只对线上一部分的流量进行流控验证,即在可控范围内做流控验证。
根据这一主意,咱们运用微服务引擎(MSE)中热门参数防护的功用,提出了一种合理的解决计划:首要在出产环境中进行可控范围内的流控才干验证、确定流控合理装备,然后在出产环境中启用流控。
MSE微服务管理简介:微服务管理中心无侵入增强干流Spring Cloud、Apache Dubbo和Istio等开源微服务框架,提供丰厚的服务管理和流量防护功用,将中间件与事务解耦,拥有如下功用:无损上线、无损下线、全链路灰度、流量操控、离群实例摘除等。
验证思路
咱们将会依照以下顺序验证所提出计划的可行性:
- 建立根底场景用于模仿出产环境。
- 装备相应的流控规矩,用于才干验证。
- 流量测验。
根底场景建立
咱们运用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流控规矩装备
- 咱们只需在mse服务管理页面装备如下热门参数防护才干,就能完成针对特定流量的流控装备。
在运用a中顺次挑选 挑选流量 > 流量防护 > 热门参数防护(HTTP恳求) > 新增热门参数防护。
2.为接口/a参加如下装备防护规矩。
- 针对指定的恳求装备流控规矩,比方下图所示header值为limit且value为true的流量会被当时装备的流控规矩操控最大的QPS阈值20。
3.2 运用B流控规矩装备
运用B依照运用A一样装备。
-
在运用b中顺次挑选 挑选流量 > 流量防护 > 热门参数防护(HTTP恳求) > 新增热门参数防护。
-
为接口/b参加如下装备防护规矩。
- 针对指定的恳求装备流控规矩,比方下图所示header值为limit且value为true的流量会被当时装备的流控规矩操控最大的QPS阈值20。
流量测验
在装备完成后,为了模仿出产环境,咱们将会顺次发送正常恳求、被符号恳求,检验流控对正常恳求和被符号恳求是否收效。
咱们首要依据如下步骤,获取进口地址:
- 登录MSE网关管理操控台,并在顶部菜单栏挑选地域。
- 在左边导航栏,挑选云原生网关 > 网关列表,单击目标网关名称。
- 在左边导航栏,单击基本概览。
- 在网关进口页签,检查SLB的进口地址(ip)。
在获取进口地址之后,咱们将会对/a接口顺次进行如下流量测验。
4.1 正常恳求无流控
-
向/a接口继续发送无标签的恳求。
-
可在输出中发现恳求没有任何约束,均是正常返回,返回如下。
A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]
4.2 被符号恳求运用A流控收效
-
向/a接口继续发送含标签恳求(header含有limit:true)。
-
当qps超越20时,恳求呈现限流信息,限流信息如下。
Blocked by Sentinel (flow limiting)
4.3 被符号恳求运用B无流控
-
关闭A服务的流控约束。
-
向/a接口继续发送含标签恳求(header含有limit:true)。
-
可在输出中发现恳求没有任何约束,均是正常返回,返回如下。
A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]
阐明:假如没有敞开标签透传,运用A调运用B的恳求无法将header透传。然后无法满足关于指定带标签的流量,任何装备相应流控规矩的运用都应起到流控作用的作用。
4.4装备透传,被符号恳求运用B流控收效
- 为运用A装备header透传。在k8s集群中寻找到spring-cloud-a服务,在环境变量中参加变量名称:alicloud.service.header ,变量引证:limit。
阐明:MSE服务管理运用agent技能,能够使得流量中的header透传
-
向/a接口发送含标签恳求(header含有limit:true)。
-
当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服务管理能够在不修改任何代码和装备的状况下,降低微服务管理的本钱,完成以下多种功用:
- 低本钱完成微服务敏捷开发:包含服务契约、服务测验、开发环境阻隔等。
- 全面消除变更进程中的危险:包含无损下线、无损上线、全链路灰度等。
- 全面消除运行进程中的安稳性问题:包含流量操控、离群实例摘除、熔断降级等。
欢迎大家运用MSE服务管理并提出宝贵意见。
相关链接:
[1]MSE产品help文档
help.aliyun.com/document_de…
[2]云原生网关概述
help.aliyun.com/document_de…
点击此处进入微服务引擎 MSE 官网检查