SpringCloud Gateway高阶之Sentinel限流、熔断

  • Post author:
  • Post category:其他



前言


为什么需要

服务熔断和降级



微服务是当前业界的一大趋势,原理就是将单一职责的功能模块

独立化为子服务



降低服务间的耦合,服务间互相调用

。但是这样也会出现一些问题:

上图中大量

微服务互相调用



存在大量的依赖关系

,难免会出现某个

服务故障

,如ServiceD出现问题,导致ServiceG、ServiceF、ServiceA、ServiceB都出现问题,然后再会影响其他服务,变成

级联故障

,最终

导致系统不可用

的坍塌,也就是

服务雪崩

当然还有某些场景,在一些时间段某些服务会

出现高并发

的情况,而某些服务占用着那些紧缺的资源显然是不太合理的,这时就需要对一些服务

进行降级处理,削弱占用的系统资源

熟悉Spring Cloud的小伙伴,第一反应应该就是

Hystrix

。但是比较可惜的是Netflix已经宣布

对Hystrix停止更新

。那么还有什么更好的选择呢?除了Spring Cloud官方推荐的

resilience4j

之外,目前

Spring Cloud Alibaba下整合的Sentinel

小伙伴们可以重点考察和选型的目标。


Sentinel是什么

Sentinel 是一款由

阿里开发

的面向

分布式服务架构的轻量级流量控制产品

,主要以流量为切入点,从

流量控制、熔断降级、系统负载保护

等多个维度来帮助我们保护服务的稳定性。

Sentinel的使用分为两部分:

1、sentinel-dashboard:与hystrix-dashboard类似,但是它更为强大一些。除了与hystrix-dashboard一样提供实时监控之外,还

提供了流控规则、熔断规则的在线维护

等功能。

2、客户端整合:

每个微服务客户端都需要整合sentinel的客户端封装与配置

,才能将监控信息上报给dashboard展示以及

实时的更改限流或熔断规则

等。


部署Sentinel Dashboard


下载地址

到github上面搜素sentinel看看他的releases,现在最新的版本V1.6.3,点击下载


运行Sentinel.jar

Sentinel的默认端口是8080,当然你也可以换别的端口,在启动的时候设置一下就行了。我们启动时候要让他在后台运行。


  1. nohup java -jar sentinel-dashboard-1.6.3.jar &


登陆Sentinel控制台


ip+端口号访问服务

,用户名和密码都是:sentinel

登陆进去后,能看到

流控和降级规则设置




Sentinel对网关的支持

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。


Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块

,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:


1、GatewayFlowRule

:网关限流规则,

这个根据网关的自身的路由场景设计的

,可以针对不同 route 或自定义的 API 分组进行限流,

支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。


2、ApiDefinition

:用户自定义的 API 定义分组,

可以看做是一些 URL 匹配的组合

。比如我们可以定义一个 API 叫 myapi,请求 path 模式为 /foo/** 和 /baz/** 的都归到 myapi 这个 API 分组下面。限流的时候可以针对

这个自定义的 API 分组维度进行限流


网关限流规则 GatewayFlowRule


字段解释

如下:


1、resource:


资源名称

网关中的 route 名称或者用户自定义的API 分组名称。


2、resourceMode

规则是针对

API Gateway 的route

(RESOURCEMODEROUTEID)还是用户在 Sentinel 中

自定义的API 分组

(RESOURCEMODECUSTOMAPI_NAME),默认是route。


3、grade


限流指标维度

,同限流规则的grade字段。


4、count:


限流阈值


5、intervalSec

统计时间窗口,单位是秒,默认是1 秒(目前仅对参数限流生效)。


6、controlBehavior

流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持

快速失败和匀速排队

两种模式,

默认是快速失败


7、burst

应对突发请求时额外允许的请求数目(目前仅对参数限流生效)。


8、maxQueueingTimeoutMs

匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。


9、paramItem


参数限流配置

。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:

parseStrategy



从请求中提取参数的策略

,目前支持四种模式提取来源 * IP(PARAMPARSESTRATEGYCLIENTIP) * Host(PARAMPARSESTRATEGYHOST) * 任意 Header(PARAMPARSESTRATEGYHEADER) * 任意 URL 参数(PARAMPARSESTRATEGYURLPARAM)


fieldName

:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。

pattern 和 matchStrategy

:为参数匹配特性预留

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


网关流控实现原理


上图的

整体流程

如下:

1、

外部请求进入API Gateway时会经过Sentinel实现的filter

,其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。

2、

Sentinel 会根据配置的网关流控规则来解析请求属性

,并依照参数索引顺序组装参数数组,最终传入SphU.entry(res, args) 中。

3、Sentinel API Gateway

Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot

,专门用来做网关规则的检查。

4、

GatewayFlowSlot会从GatewayRuleManager中提取生成的热点参数规则

,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在

参数最后一个位置置入预设的常量



达到普通流控的效果



注意:

当通过 GatewayRuleManager 加载

网关流控规则GatewayFlowRule时

,无论是否针对请求属性进行限流,Sentinel底层都会将

网关流控规则转化为热点参数规则ParamFlowRule

,存储在GatewayRuleManager 中,与正常的热点参数规则相隔离。转换时Sentinel会根据请求属性配置,

为网关流控规则设置参数索引idx

,并同步到

生成的热点参数规则


总结

从Sentinel的

1.6.0版本

开始,

提供了SpringCloud Gateway的适配模块

,可以提供两种资源维度的限流:

1、

route 维度:

即在Spring配置文件中配置的路由条目,资源名为对应的routeId

2、

自定义 API 维度:

用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

转载于:https://www.cnblogs.com/Soy-technology/p/11589016.html