【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

导读:本篇文章讲解 【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、网关流控介绍

在微服务系统中,网关提供了微服务系统的统一入口,所以在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。

Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流;
ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/**的都归到 my_api 这个 API 分组下面,限流的时候可以针对这个自定义的 API 分组维度进行限流;

其中网关限流规则 GatewayFlowRule的字段解释如下:
resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称;
resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route;
grade:限流指标维度,同限流规则的 grade 字段;
count:限流阈值;
intervalSec:统计时间窗口,单位是秒,默认是 1 秒;
controlBehavior:流量整形的控制效果,同限流规则的 `controlBehavior` 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败;
burst:应对突发请求时额外允许的请求数目;
maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效;
paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段: 

parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。

fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称;
pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持);
matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)(1.6.2 版本开始支持)

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)

2、网关流控控制台

Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置。

在gateway-9999的pom文件中引入相关依赖:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

修改gateway-9999的yml配置文件:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

启动 gateway-9999 和 9002 服务,访问:http://localhost:9999/feenix/get,可以看到成功转发到9002服务:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

来到Sentinel Dashboard控制台,可以看到当前已经有一个针对网关级别的控流管理:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

【请求链路】中的API名称已经变为9002的服务名称,而不是原先服务中的某一个接口名称。

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

值得注意的是【间隔】和【Burst size】这两个设置。【间隔】指的是当每秒的请求超过QPS值,则会启动间隔。在间隔启动的这1秒内,所有调用这个接口直接返回,不去调用业务代码。【Burst size】指的是应对突发流量激增时额外允许的请求数目。  

直接新增一个规则:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

通过Jmeter访问可以看出已经被限流:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

手快点直接通过浏览器也可以看出效果:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

将配置中的【间隔】改为1分钟,一旦被限流之后,不管怎么访问,在间隔启动的这1分钟内,所有的请求将全部被拒绝。将配置中的【Burst Size】改为5,通过Jmeter去测试流控,发现一共通过了7次请求:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

也就是说当设置了【Burst Size】的值之后,应对流量激增时可以通过的请求数是QPS阈值+Burst Size。

细心的小伙伴或者会发现,这里限流的效果和之前的热点参数的限流效果一致。这点在官网上也有所解释,根据官方的说法是:当通过 GatewayRuleManager 加载网关流控规则(GatewayFlowRule)时,无论是否针对请求属性进行限流,Sentinel 底层都会将网关流控规则转化为热点参数规则(ParamFlowRule),存储在 GatewayRuleManager 中,与正常的热点参数规则相隔离。转换时 Sentinel 会根据请求属性配置,为网关流控规则设置参数索引(idx),并同步到生成的热点参数规则中。

外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter,其中会依次进行 路由/API 分组匹配请求属性解析参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot,专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

3、API分组限流

在日常生产环境中,直接对整个Route ID下的全服务都进行限流的情况极少,更多的还是对服务中某些特定的接口进行限流。这就必不可少的用到第二种方式,API分组限流。

精确

在Sentinel Dashboard中新增一个自定的API,通过【精确】方式进行匹配:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

在API分组中选择刚刚新增的API名称:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

使用Jmeter进行访问,可以看到已经被成功限流:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

前缀

在Sentinel Dashboard中新增一个自定的API,通过【前缀】方式进行匹配:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

在API分组中选择刚刚新增的API名称:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

使用Jmeter进行访问,可以看到已经被成功限流:

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/111892.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!