sentinel配置

# Sentinel的配置 ## 流量控制相关的配置 ![image.png](https://cos.easydoc.net/13568421/files/lmun5u54.png) ### 详细说明 |选项|说明| |---|---| |**来源**|来源默认是default, 即所有的请求, 只要是请求这个资源就算, 不论来源| |**阈值类型**|QPS: 每秒请求量 <br/> 线程数: 访问该资源占用服务的线程数| |**流控模式**| 直接: 直接监控该资源, 无论是直接访问或间接访问, 一旦到达阈值就会流控<br/> 关联: 即该资源关联另一个资源, 另一个资源若被限流了, 该资源也会被限流<br/>链路: 链路可以指定一个入口资源, 如果是该入口资源开始调用的, 且最终调用到该资源, 且阈值达到, 才会被限流, 如果不是该入口资源调用的, 那么不会被记录, 不会被限流| |**流控效果**|快速失败: 一旦达到阈值, 直接失败, 走流控阻塞逻辑<br/> WarmUp: 如果阈值是M, 预热时长为N, 那么一开始的阈值为M/N, 经N秒后阈值变为M, 一旦超过, 直接失败<br/>排队等待: 一旦超过阈值, 超过的请求进入队列等待, 直到超时失败| ## 降级相关的配置 ![image.png](https://cos.easydoc.net/13568421/files/lmvc3k7e.png) |选项|说明| |---|---| |**降级策略**|RT: 最大响应时间, 如果超过该响应时间且满足最小请求数, 就会进入降级(熔断或限流)<br/>异常比例: 即调用微服务发生异常的次数占总次数的比例, 超过该比例则降级<br/>异常数: 即调用微服务发生的异常数, 如果叨叨了阈值, 就会降级| |**时间窗口**|一旦降级, 就会进入时间窗口, 一直熔断或限流, 直到窗口期结束, 继续判断是否达到阈值, 若达到继续降级, 否则解除降级| ## 资源的定义 ### 基于代码式定义资源 ```java try (Entry entry = SphU.entry("resourceName")) { // 被保护的业务逻辑 // do something here... } catch (BlockException ex) { // 资源访问阻止,被限流或被降级 // 在此处进行相应的处理操作 } ``` #### 优点 > 基于代码式定义资源非常的灵活, 可以指定受保护的资源范围 #### 缺点 > 每次都要手写代码, 非常的麻烦 ### 基于注解式定义资源 ```java // 原本的业务方法. @SentinelResource(blockHandler = "blockHandlerForGetUser") public User getUserById(String id) { throw new RuntimeException("getUserById command failed"); } // blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用 public User blockHandlerForGetUser(String id, BlockException ex) { return new User("admin"); } ``` #### 优点 > 非常的方便, 不需要写代码即可声明和保护资源 #### 缺点 > 缺少了灵活度, 不能自定义受保护的资源范围 #### 要点 1. **如上示例所示, 降级方法的返回值类型必须要一样, 参数列表在必须要一样的基础上加上BlockException的参数, 否则会报错** 2. 如果@SentinalResource设置了fallback, 那么会优先调用fallback对应的方法(该方法可以处理所有的异常) 3. fallback和blockhandler最大的区别是处理的异常范围不同, 如果更具有针对性应选择后者, 如果普遍情况应选择前者 4. **如果fallback方法和原方法不在同一个类中, 那么fallback方法必须是静态** 5. **blockhandler不能声明在其他类** ## 网关限流 [参考文档](https://help.aliyun.com/document_detail/118482.html) ### 前提 > **如果想使用网管限流, sentinel的dashboard版本必须在1.7.1以上, 如果版本低于该版本, 是无法进行网关限流的** ### 配置 ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> ``` > 如果引入了依赖, 没有下面的页面, 可以重启sentinel的控制台还有微服务, 就有了 ![image.png](https://cos.easydoc.net/13568421/files/lmvd1wn1.png) ### 说明 ![image.png](https://cos.easydoc.net/13568421/files/lmvd8jmc.png) |选项|说明| |----|----| |**API类型**| Route ID: 路由ID, 就是我们在网关设置的路由规则对应的id, 可以对整个路由规则进行流控<br/>API分组: 网关设置可以设置API分组, 即对整个分组的资源进行流控| |**属性参数**|这里就是属性匹配, 即如果客户端IP, 远程主机, 请求头, URL参数或Cookie信息满足这里设置的规则才进行流控, 这里可以做对拉某个IP的黑名单| |**流控方式**|快速失败: 如果超过了阈值, 直接返回流控后的逻辑<br/>匀速排队: 匀速排队和普通排队差不多, 超过阈值的请求去排队, 超过超时时间自动返回流控后的规则| > **注意: 这里有`Burst size`, 这个的意思是, 通常情况下, 有可能某个时刻超过流控的QPS阈值, 这里的大小为允许超出多少的QPS, 为了处理突发状况** > **这里有一个间隔, 表示这个间隔时间段内不饿能超过该QPS阈值** ## API分组 ![image.png](https://cos.easydoc.net/13568421/files/lmvdcxb5.png) |选项|说明| |--|--| |**API名称**| API名称就是该分组的名称| |**匹配模式**| 精确: 资源名必须是后面的匹配串, 才能加入分组<br/>前缀: 类似于JavaPath一样的, 如/abc/**, 这个前缀下的所有资源(主要针对path资源)<br/>正则: 通过正则表达式匹配资源 > 有了API分组, 就可以更好的管理资源, 直接从网管这里对这些资源进行流控降级