IT评测·应用市场-qidao123.com

标题: 9. SpringCloud Alibaba Sentinel 流量控制、熔断降级、系统负载,热门规则 [打印本页]

作者: tsx81429    时间: 2025-1-23 21:05
标题: 9. SpringCloud Alibaba Sentinel 流量控制、熔断降级、系统负载,热门规则
9. SpringCloud Alibaba Sentinel 流量控制、熔断降级、系统负载,热门规则的部署设置解说

@
目录

SpringCloud Alibaba Sentinel官方地址:https://github.com/alibaba/Sentinel

SpringCloud Alibaba Sentinel 快速开始: https://sentinelguard.io/zh-cn/docs/quick-start.html

SpringCloud Alibaba Sentinel官方中文地址: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

SpringCloud Alibaba Sentinel 的使用手册:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_al%20ibaba_sentinel

1. Sentinel 是什么?

随着微服务的盛行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自顺应过载保护、热门流量防护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
Sentinel 的主要特性:

sentinel  可以完成的功能: 绿色方框列出的部分
Sentinel  的开源生态:

Sentinel 分为两个部分:
一句话: Sentinel: 分布式系统的流量防卫兵, 保护你的微服务
Sentinel 焦点功能:
拿旅游景点举个示例,每个旅游景点通常都会有最大的欢迎量,不可能无穷制的放游 客进入,比如长城每天只卖八万张票,超过八万的游客,无法买票进入,因为假如超过 八万人,景点的工作职员可能就忙不过来,过于拥挤的景点也会影响游客的体验和心情, 并且还会有安全隐患;只卖 N 张票,这就是一种限流的手段

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,大概第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。假如依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。


Sentinel 系统自顺应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个均衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
根据系统能够处置惩罚的请求,和答应进来的请求,来做均衡,追求的目标是在系统不被 拖垮的情况下,  进步系统的吞吐率

某瞬时来了大流量的请求, 而假如此时要处置惩罚全部请求,很可能会导致系统负载过高, 影响稳定性。但其实可能反面几秒之内都没有消息投递,若直接把多余的消息丢掉则没 有充实利用系统处置惩罚消息的本领
Sentinel 的 Rate Limiter 模式能在某一段时间间隔内以匀速方式处置惩罚这样的请求,  充实利 用系统的处置惩罚本领, 也就是削峰填谷,  保证资源的稳定性
2. Sentinel 控制台

Sentinel 控制台官网说明地址:https://sentinelguard.io/zh-cn/docs/dashboard.html
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。这里,我们将会详细讲述如何通过简单的步骤就可以使用这些功能。
接下来,我们将会逐一先容如何整合 Sentinel 焦点库和 Dashboard,让它发挥最大的作用。同时我们也在阿里云上提供企业级的 Sentinel 服务:AHAS Sentinel 控制台,您只需要几个简单的步骤,就能最直观地看到控制台如何实现这些功能,并体验多样化的监控及全自动托管的集群流控本领。
Sentinel 控制台包含如下功能:
注意:Sentinel 控制台目前仅支持单机部署。Sentinel 控制台项目提供 Sentinel 功能全集示例,不作为开箱即用的生产环境控制台,若盼望在生产环境使用请根据文档自行进行定制和改造。

3. Sentinel 下载&安装&运行

下载地址:https://github.com/alibaba/Sentinel/releases/tag/v1.8.0

运行:进入到对应 sentinel-dashoard-1.8.0 的目录当中,使用 cmd
  1. java -jar sentinel-dashboard-1.8.0.jar
复制代码
注意: Sentinel 控制台  默认端口是 8080。
假如端口被占用了,我们可以更改 Sentinel 控制台的端口。
  1. java -jar sentinel-dashboard-1.8.0.jar --server.port=9090
复制代码

访问:
浏览器: http://localhost:8080。注意:这里我的8080端口被占用了,所以这里我用的是9090端口。
浏览器输入: http://localhost:9090,  用户和密码都是  sentinel

登录成功后的页面,  目前是空的,因为 sentinel 还没有进行流量监控。
4. Sentinel 监控微服务

使用 Sentinel  控制台对  member-service-nacos-provider-10004  微服务  进行实时监控。
当调用了  member-service-nacos-provider-10004  微服务时   可以监控到请求的 url/QPS/ ,
响应时间/流量

使用 Sentinel 需要进入对应的 jar 包。如下
  1.         
  2.         <dependency>
  3.             <groupId>com.alibaba.cloud</groupId>
  4.             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5.         </dependency>
复制代码
在 application.yaml 文件当中配置 Sentinel 配置信息。如下图,所示:
  1. spring:
  2.   application:
  3.     name: member-service-nacos-provider # 配置应用的名称
  4.     # 配置 nacos
  5.   cloud:
  6.     # 配置 Sentinel 的信息
  7.     sentinel:
  8.       transport:
  9.         dashboard: localhost:9090 # 注意这里按照你自己配置的 sentinel 端口信息,默认是8080端口
  10.         # 解读: spring.cloud.sentinel.transport.port
  11.         # 1. spring.cloud.sentinel.transport.port 端口配置会在被监控的微服务当中
  12.         # 对应的机器上启动一个 Http Server
  13.         # 2. 该 Server 会 与 Sentinel 控制台做交互
  14.         # 3. 比如: Sentinel 控制台添加了 1 个限流规则,会把规则数据 push 给这个
  15.         # Http Server 接收,Http Server 再将规则注册到 Sentinel 当中
  16.         # 简单的说明: spring.cloud.sentinel.transport.port: 指定被监控的微服务应用与
  17.         # Sentinel 控制台交互的端口,微服务应用本地会起一个该端口占用的 Http Server
  18.         port: 8719 # 默认的占用的端口是 8719,假如被占用了,会自动从 8719开始依次 + 1 进行一个扫描,
  19.         # 直到找到为占用的端口,进行一个使用。
复制代码
  1. server:
  2.   port: 10004
  3. spring:
  4.   application:
  5.     name: member-service-nacos-provider # 配置应用的名称
  6.     # 配置 nacos
  7.   cloud:
  8.     nacos:
  9.       discovery:
  10.         server-addr: localhost:8848 # 配置注册到哪个 Nacos Server的地址
  11.     # 配置 Sentinel 的信息
  12.     sentinel:
  13.       transport:
  14.         dashboard: localhost:9090 # 注意这里按照你自己配置的 sentinel 端口信息,默认是8080端口
  15.         # 解读: spring.cloud.sentinel.transport.port
  16.         # 1. spring.cloud.sentinel.transport.port 端口配置会在被监控的微服务当中
  17.         # 对应的机器上启动一个 Http Server
  18.         # 2. 该 Server 会 与 Sentinel 控制台做交互
  19.         # 3. 比如: Sentinel 控制台添加了 1 个限流规则,会把规则数据 push 给这个
  20.         # Http Server 接收,Http Server 再将规则注册到 Sentinel 当中
  21.         # 简单的说明: spring.cloud.sentinel.transport.port: 指定被监控的微服务应用与
  22.         # Sentinel 控制台交互的端口,微服务应用本地会起一个该端口占用的 Http Server
  23.         port: 8719 # 默认的占用的端口是 8719,假如被占用了,会自动从 8719开始依次 + 1 进行一个扫描,
  24.         # 直到找到为占用的端口,进行一个使用。
  25.   datasource:
  26.     type: com.alibaba.druid.pool.DruidDataSource # 配置 alibaba 的数据库连接池
  27.     password: MySQL123
  28.     username: root
  29.     url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
  30. mybatis:
  31.   mapper-locations: classpath:mapper/*.xml # 指定 mapper.xml 文件位置 classpath 表示 resources 目录下
  32.   type-aliases-package: com.rainbowsea.springcloud.entity # 实例 bean 类所在的包,这样可以通过类名的方式
  33. # 配置暴露所有的监控点:
  34. management:
  35.   endpoints:
  36.     web:
  37.       exposure:
  38.         include: '*'
复制代码
测试:
启动 Nacos Server 8848
启动 Sentinel8080  控制台/Sentinel dashboard
启动 member-service-nacos-provider-10004
浏览器: localhost:10004/member/get/1
Sentinel 控制台监控页面,浏览器输入: http://localhost:10004/member/get/1

进入到 Sentinel  查看实时监控结果, http://localhost:8080/#/dashboard

注意事项和细节:

5. Sentinel 流量控制

规则

对上图的解读:
解读 QPS 和线程数的区别,  注意听,  比如 QPS 和线程我们都设置阈值为 1:


5.1 流量控制实例-QPS

演示: 当调用 member-service-nacos-provider-10004  的  /member/get/  接口/API 时,限制 1 秒内最多访问 1 次,否则直接失败,抛非常.
配置实现步骤:



测试
启动  Nacos Server 8848
启动  Sentinel909控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: localhost:10004/member/get/1
Sentinel 控制台监控页面:
浏览器输入: http://localhost:10004/member/get/1 , 1 秒钟内访问次数不超过 1 次,  页 面显示正常

浏览器输入: http://localhost:10004/member/get/1 , 1 秒钟内访问次数超过 1 次,  页面 出现错误提示

注意事项和细节:
方案一 :在sentinel中  /member/get?id=1  和  /member/get?id=2  被统一认为是 /member/get  所以只要对/member/get  限流就OK了.

  1. 方案1:  在 sentinel 中/member/get?id=1 和 /member/get?id=2 被统一认为是 /member/get 所以
  2. 只要对 /member/get 限流就OK了。
  3. /**
  4.      * 这里我们使用 url占位符 + @PathVariable
  5.      *
  6.      * @param id
  7.      * @return
  8.      */
  9.     //@GetMapping("/member/get/{id}")
  10.     // 在sentinel中  /member/get?id=1  和  /member/get?id=2  被统一认为是 /member/get  所以只要对/member/get  限流就OK了. 进行统一的限流
  11.     @RequestMapping(value = "/member/get/", params = "id", method = RequestMethod.GET)
  12.     //public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
  13.     public Result getParameter(Long id) {
  14.         Member member = memberService.queryMemberById(id);
  15.         //String color = request.getParameter("color");
  16.         //String age = request.getParameter("age");
  17.         // 模拟超时 ,这里暂停 5秒
  18.        /* try {
  19.             TimeUnit.SECONDS.sleep(5);
  20.         } catch (Exception e) {
  21.             e.printStackTrace();
  22.         }*/
  23.         // 使用 Result 把查询到的结果返回
  24.         if (member != null) {
  25.             //return Result.success("查询会员成功 member-service-nacos-provider-10004  color" + color + "age" + age, member);
  26.             return Result.success("查询会员成功 member-service-nacos-provider-10004  color",member);
  27.         } else {
  28.             return Result.error("402", "ID" + id + "不存在 member-service-nacos-provider-10004 ");
  29.         }
  30.     }
复制代码

方案二: URL 资源洗濯
可以通过 UrlCleaner 接口来实现资源洗濯,也就是对于 /member/get/{id} 这个 URL,
我们可以统一归集到 /member/get/* 资源下,具体的代码实现如下: 需要实现 UrlCleaner接口
并重写此中的 clean 方法即可。

  1. package com.rainbowsea.springcloud.controller;
  2. import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * 方案2: URL 资源清洗
  7. * 可以通过 UrlCleaner 接口来实现资源清洗,也就是对于 /member/get/{id} 这个 URL,
  8. * 我们可以统一归集到 /member/get/* 资源下,具体的代码实现如下: 需要实现 UrlCleaner接口
  9. * 并重写其中的 clean 方法即可
  10. */
  11. @Component  // 注意:同样要被 Spring IOC 容器管理起来
  12. public class CustomUrlCleaner implements UrlCleaner {
  13.     @Override
  14.     public String clean(String originUrl) {
  15.         // 判断字符串是否为空 Null
  16.         // 特别注意: StringUtils.isBlank 是在:org.apache.commons.lang3.StringUtils 包下的
  17.         if (StringUtils.isBlank(originUrl)) {
  18.             return originUrl;
  19.         }
  20.         if (originUrl.startsWith("/member/get")) {
  21.             // 1.如果请求的是接口 /member/get 开头的,比如: /member/get/1
  22.             // 2.给sentinel 的返回的资源名就是 /member/get/*
  23.             // 3. 在 sentinel 对 /member/get/* 添加流控规则即可
  24.             return "/member/get/*";
  25.         }
  26.         return originUrl;
  27.     }
  28. }
复制代码
5.2 流量控制实例-线程数

通过 Sentinel  实现  流量控制
当调用  member-service-nacos-provider-10004  的  /member/get/*  接口/API 时,限制 只有一个工作线程,否则直接失败,抛非常.
配置实现步骤:



测试:
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: localhost:10004/member/get/1
结果页面:
浏览器输入: http://localhost:10004/member/get/1 ,  快速刷新,  页面显示正常(缘故原由 是服务实验时间很短,刷新下一次的时候,启动的工作线程,已经完成)

为了看到结果,我们修改下 com/rainbowsea/springcloud/controller/MemberController.java。模拟延时。

  1.         // 让线程休眠1s,模拟执行时间
  2.         try {
  3.             TimeUnit.MILLISECONDS.sleep(1000);
  4.         } catch (InterruptedException e) {
  5.             e.printStackTrace();
  6.         }
复制代码
  1. @GetMapping("/member/get/{id}")
  2.     public Result getMemberById(@PathVariable("id") Long id) {
  3.         Member member = memberService.queryMemberById(id);
  4.         //String color = request.getParameter("color");
  5.         //String age = request.getParameter("age");
  6.         // 让线程休眠1s,模拟执行时间
  7.         try {
  8.             TimeUnit.MILLISECONDS.sleep(2000);
  9.         } catch (InterruptedException e) {
  10.             e.printStackTrace();
  11.         }
  12.         System.out.println(" enter getMemberById... 当前线程id = " + Thread.currentThread().getId() + "时间 = " + new Date());
  13.         // 使用 Result 把查询到的结果返回
  14.         if (member != null) {
  15.             //return Result.success("查询会员成功 member-service-nacos-provider-10004  color" + color + "age" + age, member);
  16.             return Result.success("查询会员成功 member-service-nacos-provider-10004  color" + member);
  17.             //return Result.success("查询会员成功 member-service-nacos-provider-10004  color",member);
  18.         } else {
  19.             return Result.error("402", "ID" + id + "不存在 member-service-nacos-provider-10004 ");
  20.         }
  21.     }
复制代码
重启 member-service-nacos-provider-10004 , 注意需要重新加入流控规则.
浏览器输入: http://localhost:10004/member/get/1 ,  快速刷新   页面出现非常.

注意事项和细节:

阈值类型 QPS 和 线程数的区别讨论
假如一个线程平均实验时间 为 0.05 秒,就说明在 1秒钟,可以实验 20次(相当于 QPS 为 20)
假如一个线程平均实验时间 为 1秒,说明 1 秒钟,可以实验 1次数(相当于 QPS 为1)
假如一个线程平均实验时间 为 2 秒,说明2秒钟内,才能实验1次请求。
5.3 流量控制实例-关联

关联的含义: 当关联的资源达到阈值时,就限流自己
通过 Sentinel  实现  流量控制
当调用 member-service-nacos-provider-10004 的 /t2 API 接口时,假如 QPS 超过 1,这 时调用 /t1 API 接口 直接接失败,抛非常. 老师梳理 /t2 是关联的资源 , 限流的资源是 /t1
这里使用 postman 模拟高并发访问/t2 ;然后在 postman 实验高并发访问/t2没有结束时,去访问 /t1 才能看到流控非常出现。t1被流控了

配置实现步骤



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
Postman 模拟高并发访问/t2
创建新的 http request

保存 request 到  一个新的 collection 中



设置 run collection  参数,  并运行



浏览器访问: http://localhost:10004/t1

注意事项和细节:
在 postman 实验 高并发访问  /t2 没有结束时,  去访问   /t1 才能看到流控非常出现。
5.4 流量控制实例-Warm up

Warm up 先容:

通常冷启动的过程系统答应通过的 QPS  曲线图(上图)

Warm up 称为  冷启动/预热
应用场景:  秒杀在开启瞬间,大流量很轻易造成冲毁系统,Warmup 可逐步的把流量放入,最 终将阀值增长到设置阀值。
通过 Sentinel  实现  流量控制,演示 Warm up
配置实现步骤:



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: localhost:10004/t2
浏览器访问  http://localhost:10004/t2  快速刷新页面,在前 3 秒,会出现流控非常, 后 3 秒就正常了(假如你刷新非常快 QPS>9 ,  仍然会出现流控非常)


注意事项和细节:
5.5 流量控制实例-排队

排队方式:这种方式严格控制了请求通过的间隔时间,也即是让请求以匀称的速度通 过,对应的是漏桶算法。

这种方式主要用于处置惩罚间隔性突发的流量,例如消息队列。比如这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们盼望系统能够在接下来的 空闲期间渐渐处置惩罚这些请求,而不是在第一秒直接拒绝多余的请求。 类似前面说的 削峰填谷。
匀速排队,阈值必须设置为 QPS
通过 Sentinel  实现  流量控制-排队
为了测试看到结果,修改 com/rainbowsea/springcloud/controller/MemberController.java
  1.     @GetMapping("/t2")
  2.     public Result t2() {
  3.         // 让线程休眠 1s,模拟执行时间为1s=>当多少个请求就会造成超时
  4.         try {
  5.             TimeUnit.MILLISECONDS.sleep(1000);
  6.         } catch (InterruptedException e) {
  7.             e.printStackTrace();
  8.         }
  9.         // 输出线程信息
  10.         log.info("执行t2(),线程id={}",Thread.currentThread().getId());
  11.         return Result.success("t2执行成功");
  12.     }
复制代码
配置实现步骤:



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: localhost:10004/t2



浏览器访问  http://localhost:10004/t2  快速刷新页面 20 次,当请求等待时间超过 10S, 仍然出现流控非常

6. Sentinel 熔断降级

线程堆积引出熔断降级

熔断 降级 限流三者的关系:

梳理:

6.1 熔断策略

慢调用比例:


非常比例:

工作示图:

非常数:

6.2 熔断降级实例-慢调用比例


为/t3  增长降级规则



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
Postman 测试



点击 Run sentinel

浏览器访问: http://localhost:10004/t3

停止 Postman

浏览器访问: http://localhost:10004/t3 ,  结果正常了(需要在停止 Postman 10s 后)

注意事项和细节:
6.3 熔断降级实例-非常比例

通过 Sentinel  实现  熔断降级控制

配置实现步骤



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
Postman 测试:







注意事项和细节
6.4 熔断降级实例-非常数


配置实现步骤



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: http://localhost:10004/t5
http://localhost:10004/t5 ,  访问 5 次,出现 5 次非常(1  分钟内完成)

5 次非常后,出现熔断降级

20S 后,再次访问 http://localhost:10004/t5,  返回正常结果了


注意事项和细节
7. Sentinel 热门规则

一个问题引出热门 key 限流

7.1 热门 Key 限流-实例

需求:  通过 Sentinel  实现  热门 Key 限流

测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard 10.6.4.3.3
启动  member-service-nacos-provider-10004
配置步骤:



浏览器: http://localhost:10004/news?id=1&type=教育


独立设置热门 id=10 的 QPS 阈值(即添加破例)



浏览器: http://localhost:10004/news?id=10&type=教育


注意事项和细节
8. 系统规则

一个问题引出系统规则

图示解读:
系统规则:
需求:  通过 Sentinel  实现  系统规则-入口 QPS
配置实现步骤:



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: http://localhost:10004/t1


9. @SentinelResource 自定义全局限流处置惩罚类

@SentinelResource 自定义全局限流处置惩罚类
观察如下代码:

说明: 当配置的资源名 news  触发限流机制时,会调用  newsBlockHandler 方法
创建 com/rainbowsea/springcloud/handler/CustomGlobalBlockHandler.java


  1. package com.rainbowsea.springcloud.handler;
  2. import com.alibaba.csp.sentinel.slots.block.BlockException;
  3. import com.rainbowsea.springcloud.entity.Result;
  4. /**
  5. * 1. CustomGlobalBlockHandler : 全局限流处理类
  6. * 2. 在 CustomGlobalBlockHandler 类中,可以编写限流处理方法,但是要求方法是static
  7. */
  8. public class CustomGlobalBlockHandler {
  9.     public static Result handlerMethod1(BlockException blockException) {
  10.         return Result.error("400", "客户自定义异常/限流处理方法handlerMethod1");
  11.     }
  12.     public static Result handlerMethod2(BlockException blockException) {
  13.         return Result.error("401", "客户自定义异常/限流处理方法handlerMethod2");
  14.     }
  15. }
复制代码
修改 com/rainbowsea/springcloud/controller/MemberController.java 增长方法 t6()

  1. private static int num = 0;  // 执行的计数器-static静态
  2.     // 这里我们使用全局限流处理类,显示限流信息
  3.     /**
  4.      * value="t6" 表示 sentinel 限流资源的名字
  5.      * blockHandlerClass = CustomGlobalBlockHandler.class:全局限流处理类
  6.      * blockHandler = "handlerMethod1" 指定使用全局限流处理类哪个方法,来处理限流信息
  7.      * fallbackClass = CustomGlobalFallbackHandler.class 全局 fallback处理类
  8.      * fallback = "fallbackHandlerMethod1" 指定使用全局fallback处理类哪个方法来处理java异常/业务异常
  9.      * exceptionsToIgnore = {NullPointerException.class}
  10.      *
  11.      * @return
  12.      */
  13.     @GetMapping("/t6")
  14.     @SentinelResource(value = "t6",
  15.             //   //设置处理sentinel 控制台违规后的异常 blockHand
  16.             blockHandlerClass = CustomGlobalBlockHandler.class,
  17.             blockHandler = "handlerMethod1",
  18.             //设置处理Java异常的 fallback
  19.             fallbackClass = CustomGlobalFallbackHandler.class,
  20.             fallback = "fallbackHandlerMethod1",
  21.             // 如果希望忽略某个异常,可以使用 exceptionsToIgnore,这里忽略NullPointerException异常
  22.             exceptionsToIgnore = {NullPointerException.class}
  23.     )
  24.     public Result t6() {
  25.         log.info("执行t6() 线程id={}", Thread.currentThread().getId());
  26.         // 假定;当访问t6资源次数是5倍数时,就出现Java异常
  27.         if (++num % 5 == 0) {
  28.             throw new NullPointerException("null 指针异常 num=" + num);
  29.         }
  30.         if (++num % 6 == 0) {
  31.             throw new RuntimeException("RuntimeException  num=" + num);
  32.         }
  33.         return Result.success("200", "t6()执行OK~~~");
  34.     }
复制代码
配置实现步骤
为资源  /t6  增长流控规则,方便测试



测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: http://localhost:10004/t6


9.1 @ fallback

看一段代码-引出 fallback
修 改  member-service-nacos-provider-10004 com/rainbowsea/springcloud/controller/MemberController.java 增长一段代码.
  1. private static int num = 0;  // 执行的计数器-static静态
  2.     // 这里我们使用全局限流处理类,显示限流信息
  3.     /**
  4.      * value="t6" 表示 sentinel 限流资源的名字
  5.      * blockHandlerClass = CustomGlobalBlockHandler.class:全局限流处理类
  6.      * blockHandler = "handlerMethod1" 指定使用全局限流处理类哪个方法,来处理限流信息
  7.      * fallbackClass = CustomGlobalFallbackHandler.class 全局 fallback处理类
  8.      * fallback = "fallbackHandlerMethod1" 指定使用全局fallback处理类哪个方法来处理java异常/业务异常
  9.      * exceptionsToIgnore = {NullPointerException.class}
  10.      *
  11.      * @return
  12.      */
  13.     @GetMapping("/t6")
  14.     @SentinelResource(value = "t6",
  15.             //   //设置处理sentinel 控制台违规后的异常 blockHand
  16.             blockHandlerClass = CustomGlobalBlockHandler.class,
  17.             blockHandler = "handlerMethod1",
  18.             //设置处理Java异常的 fallback
  19.             fallbackClass = CustomGlobalFallbackHandler.class,
  20.             fallback = "fallbackHandlerMethod1",
  21.             // 如果希望忽略某个异常,可以使用 exceptionsToIgnore,这里忽略NullPointerException异常
  22.             exceptionsToIgnore = {NullPointerException.class}
  23.     )
  24.     public Result t6() {
  25.         log.info("执行t6() 线程id={}", Thread.currentThread().getId());
  26.         // 假定;当访问t6资源次数是5倍数时,就出现Java异常
  27.         if (++num % 5 == 0) {
  28.             throw new NullPointerException("null 指针异常 num=" + num);
  29.         }
  30.         if (++num % 6 == 0) {
  31.             throw new RuntimeException("RuntimeException  num=" + num);
  32.         }
  33.         return Result.success("200", "t6()执行OK~~~");
  34.     }
复制代码
浏览器: http://localhost:10004/t6 ,  看结果当 num  为 5 的整数时,返回的是 error 页面, 不友爱.

怎么解决=> 使用 fallback
fallback 基本先容
blockHandler 只负责 sentine 控制台配置违规
fallback 负责 Java 非常/业务非常
需求:  请编写一个自定义全局 fallback 处置惩罚类,  处置惩罚 java 非常/业务非常 。也就是解决前面我们提出的问题解
代码实现:
  1. package com.rainbowsea.springcloud.handler;
  2. import com.rainbowsea.springcloud.entity.Result;
  3. /**
  4. * CustomGlobalFallbackHandler :全局 fallback处理类
  5. * 在 CustomGlobalFallbackHandler 类中,可以去编写处理Java异常/业务异常方法-static
  6. */
  7. public class CustomGlobalFallbackHandler {
  8.     public static Result fallbackHandlerMethod1(Throwable throwable) {
  9.         return Result.error("402", "java异常信息 + " + throwable.getMessage());
  10.     }
  11.     public static Result fallbackHandlerMethod2(Throwable throwable) {
  12.         return Result.error("402", "java异常信息 + " + throwable.getMessage());
  13.     }
  14. }
复制代码
在 member-service-nacos-provider-10004  修改 com/hspedu/springcloud/controller/MemberController.java
  1. // 这里我们使用全局限流处理类,显示限流信息
  2.     /**
  3.      * value="t6" 表示 sentinel 限流资源的名字
  4.      * blockHandlerClass = CustomGlobalBlockHandler.class:全局限流处理类
  5.      * blockHandler = "handlerMethod1" 指定使用全局限流处理类哪个方法,来处理限流信息
  6.      * fallbackClass = CustomGlobalFallbackHandler.class 全局 fallback处理类
  7.      * fallback = "fallbackHandlerMethod1" 指定使用全局fallback处理类哪个方法来处理java异常/业务异常
  8.      * exceptionsToIgnore = {NullPointerException.class}
  9.      *
  10.      * @return
  11.      */
  12.     @GetMapping("/t6")
  13.     @SentinelResource(value = "t6",
  14.             //   //设置处理sentinel 控制台违规后的异常 blockHand
  15.             blockHandlerClass = CustomGlobalBlockHandler.class,
  16.             blockHandler = "handlerMethod1",
  17.             //设置处理Java异常的 fallback
  18.             fallbackClass = CustomGlobalFallbackHandler.class,
  19.             fallback = "fallbackHandlerMethod1",
  20.             // 如果希望忽略某个异常,可以使用 exceptionsToIgnore,这里忽略NullPointerException异常
  21.             exceptionsToIgnore = {NullPointerException.class}
  22.     )
  23.     public Result t6() {
  24.         log.info("执行t6() 线程id={}", Thread.currentThread().getId());
  25.         // 假定;当访问t6资源次数是5倍数时,就出现Java异常
  26.         if (++num % 5 == 0) {
  27.             throw new NullPointerException("null 指针异常 num=" + num);
  28.         }
  29.         if (++num % 6 == 0) {
  30.             throw new RuntimeException("RuntimeException  num=" + num);
  31.         }
  32.         return Result.success("200", "t6()执行OK~~~");
  33.     }
复制代码
测试
启动  Nacos Server 8848
启动  Sentinel8080 控制台/Sentinel dashboard
启动  member-service-nacos-provider-10004
浏览器: http://localhost:10004/t6
浏览器输入: http://localhost:10004/t6 ,  访问次数不是 5 的倍数,  返回正常结果

浏览器输入: http://localhost:10004/t6 , 访问次数是 5 的倍数 返回 fallback 指定方法
,信息

为资源 /t6  增长流控规则,方便测试


在流控规则菜单,可以看到新增规则

浏览器输入: http://localhost:10004/t6 ,  假如访问 QPS 大于 1 ,  由  blockHandler  指 定的方法处置惩罚,访问次数是 5 的倍数,  由 fallback 指定方法处置惩罚,  其它情况返回正常的结果.



9.2 @exceptionsToIgnore 忽略

假如盼望忽略某个非常,可以使用 exceptionsToIgnore




10. 补充: 接入  Sentinel  的方式

文档地址: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

基本使用:



注 解 方 式 埋 点 不 支 持 private 方 法 https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81


11. 末了:

“在这个末了的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的范畴奋斗。感谢你们,我们总会在某个时刻再次相遇。”


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4