求创意设计分享的网站,查关键词的排名工具,网站后台管理是做一些什么,郑州手机网站建设多少钱SpringCloud Alibaba第十三章#xff0c;升级篇#xff0c;服务降级、熔断和限流Sentinel
一、Sentinel概述
1、Sentinel是什么
随着微服务的流行#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点#xff0c;从流量控制、熔断降级、系统负载保…SpringCloud Alibaba第十三章升级篇服务降级、熔断和限流Sentinel
一、Sentinel概述
1、Sentinel是什么
随着微服务的流行服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。一句话概括sentinel即Hystrix的替代品官网 https://sentinelguard.io/zh-cn/下载https://github.com/alibaba/Sentinel/releases2、Sentinel基本概念
2.1、资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容例如由应用程序提供的服务或由应用程序调
用的其它应用提供的服务甚至可以是一段代码。在接下来的文档中我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码就是资源能够被 Sentinel 保护起来。大部分情况下可以使用方法签名
URL甚至服务名称作为资源名来标示资源。2.2、规则
围绕资源的实时状态设定的规则可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。2.3、流量控制
流量控制在网络传输中是一个常用的概念它用于调整网络包的发送数据。然而从系统稳定性角度考虑在处理请求的速度
上也有非常多的讲究。任意时间到来的请求往往是随机不可控的而系统的处理能力是有限的。我们需要根据系统的处理能
力对流量进行控制。Sentinel 作为一个调配器可以根据需要把随机的请求调整成合适的形状.流量控制有一下几个角度
1、资源的调用关系例如资源的调用链路资源和资源之间的关系
2、运行指标例如 QPS、线程池、系统负载等
3、控制的效果例如直接限流、冷启动、排队等。2.4、熔断降级
降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性如果调用链路中的某个资源出现了不稳
定最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定例如表现为 timeout异常比例升高的
时候则对这个资源的调用进行限制并让请求快速失败避免影响到其它的资源最终产生雪崩的效果。Sentinel和Hystrix在限制手段上采取了不一样的方法1、Hystrix通过线程池的方式
Hystrix 通过线程池的方式来对依赖进行了隔离。2、Sentinel 对这个问题采取了两种手段:
a、通过并发线程数进行限制
b、通过响应时间对资源进行降级2.5、系统负载保护
Sentinel 同时对系统的维度提供保护。防止雪崩是系统防护中重要的一环。当系统负载较高的时候如果还持续让请求
进入可能会导致系统崩溃无法响应。在集群环境下网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。
如果这个时候其它的机器也处在一个边缘状态的时候这个增加的流量就会导致这台机器也崩溃最后导致整个集群不可用。针对这个情况Sentinel 提供了对应的保护机制让系统的入口流量和系统的负载达到一个平衡保证系统在能力范围之
内处理最多的请求。二、Sentinel控制台安装
Sentinel分为两个部分
1、核心库
2、控制台dashboard基于Springboot开发打包后可直接运行不需要Tomcat等额外的容器下载
https://github.com/alibaba/Sentinel/releases运行
Sentinel Dashboard默认的端口是8080java -jar sentinel-dashboard-1.7.0.jar访问
http://localhost:8080/账号sentinel 密码sentinel三、Sentinel案例
3.1、初始化演示工程
创建cloudalibaba-sentinel-service-8401
parentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version
/parent
modelVersion4.0.0/modelVersionartifactIdcloudalibaba-sentinel-service-8401/artifactIdPOM
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloudalibaba-sentinel-service-8401/artifactIddependencies!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到--dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency!--SpringCloud ailibaba sentinel --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency!--SpringCloud ailibaba nacos --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.lee.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version/dependency!--openfeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!-- SpringBoot整合Web组件actuator --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--日常通用jar包配置--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion4.6.3/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/projectapplication.yml
server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080port: 8719 #默认8719假如被占用了会自动从8719开始依次1扫描。直至找到未被占用的端口management:endpoints:web:exposure:include: *主启动类
SpringBootApplication
EnableDiscoveryClient
public class SentinelMain8401 {public static void main(String[] args) {SpringApplication.run(SentinelMain8401.class,args);}
}业务类
Slf4j
RestController
public class FlowLimitController {GetMapping(/testA)public String testA(){return testA;}GetMapping(/testB)public String testB(){return testB;}
}测试
1、启动nacos server、Sentinel-Dashboard、CloudAlibaba-sentinel-service-8401
2、查看sentinel控制台 http://localhost:8080/结果空空如也
因为Sentinel采用的是懒加载模式
3、浏览http://localhost:8401/testA和http://localhost:8401/testB
4、再查看sentinel控制台 http://localhost:8080/3.2、流控规则
资源新增流控可以通过两个地方来添加
1、簇点链路-点击”流控“
2、流控规则-点击新增流控规则阈值类型
QPS系统每秒钟处理完成的请求次数QPS是在请求进入应用之前就处理线程数是在请求进入应用之后处理3.2.1、流控模式
流控3种模式分为直接、关联、链路3.2.1.1、直接 测试
1、直接的配置如上
2、每秒访问一次http://localhost:8401/testA正常
3、每秒多次快速的访问http://localhost:8401/testABlocked by Sentinel (flow limiting)
(当再次恢复每秒1次的访问频率时又可正常访问)思考
访问频次不符合配置规则后直接显示sentinel的默认处理Blocked by Sentinel,我们如何自定义规则不匹配的情况呢
(后续会介绍SentinelResource去做方法的兜底处理类似Hystrix的HystrixCommand)3.2.1.2、关联
什么是关联即当与testA相关的资源testB达到阈值时就挂testA测试
1、配置规则如上
2、postman模拟并发密集的访问http://localhost:8401/testB
3、浏览器访问http://localhost:8401/testA结果Blocked by Sentinel (flow limiting)当对testB密集访问停止后testA访问恢复正常3.2.1.3、链路
新增代码service
Slf4j
Service
public class FlowLimitService {SentinelResource(findOrder)public String findOrder(){log.info(----order----);return order;}
}controller
Slf4j
RestController
public class FlowLimitController {Resourceprivate FlowLimitService flowLimitService;GetMapping(/testA)public String testA(){flowLimitService.findOrder();return testA;}GetMapping(/testB)public String testB(){flowLimitService.findOrder();return testB;}
}配置规则 1、配置规则如上
2、快速访问http://localhost:8401/testA
结果
###############################有待确认#############
快速访问http://localhost:8401/testB
结果
###############################有待确认#############3.2.2、流控效果
3.2.2.1、快速失败
源码
com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController上面写流控模式的时候已经展示了效果不符合配置的时候快速做出对应的反映如3.2.2.2、Warn Up预热
源码:
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController公式
阈值除以coldFactor默认为3经过预热时长后才会达到阈值限流-冷启动
当流量突然增大的时候我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲
的状态我们希望处理请求的数量是缓步的增多经过预期的时间以后到达系统处理请求个数的最大值。Warm Up冷启
动预热模式就是为了实现这个目的的。应用场景
秒杀系统在开启的瞬间会有很多流量上来会把系统打死预热方式就是为了保护系统可以慢慢的把流量放进来。
慢慢的把阈值增长到设定的阈值、配置解读
系统初始化的阈值为10/3约等于3即阈值刚开始为3.然后过了5秒后阈值才逐渐升到103.2.2.3、排队等待
源码
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController匀速排队阈值必须设置为QPS。匀速排队会严格控制请求通过的时间间隔。也即是让请求以均匀的速度通过对应的是漏桶算法。类似消息队列配置解读
/testB每秒1次请求超过的话就排队等待。等待的超时时间是20000ms3.3、降级规则
降级规则包括RT、异常比例、异常数3.3.1、RT平均响应时间
RT平均响应时间:
当1s内持续进入5个请求对应时刻的平均响应时间均超过阈值那么在接下的时间窗口之内对这个方法的调用都会自动地
熔断抛出DegradeException.Sentinel的默认RT上限是4900ms,超出此阈值的都会算作4900ms。若需要变更此上线可以通过
-Dcsp.sentinel.statistic.max.rtxxx来配置新增代码
GetMapping(/testD)
public String testD()
{try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.info(testD 测试RT);return testD;
}配置 测试 如上JMeter创建1s中10个线程的访问去请求testD.然后再浏览器上访问http://localhost:8401/testD
结果
Blocked by Sentinel (flow limiting)配置中我们希望200毫秒处理完这次任务如果200毫秒还没处理完在未来1s的时间窗口内断路器打开微服务不可用当我们停止JMeter测试后没这么大访问量了断路器关闭微服务恢复。3.3.2、异常比例
异常比例
当资源的每秒请求量5并且每秒异常总数占通过量的比值超过阈值之后资源进入降级状态即在接下来的时间窗口之
内对这个方法的调用都会自动返回。新增代码
GetMapping(/testE)
public String testE()
{log.info(testE 测试RT);int age 10/0;return ------testE;
}配置规则 测试
JMeter压测testE,每秒10个线程浏览器访问http://localhost:8401/testE结果不是报错而是Blocked by Sentinel (flow limiting)结论
开启JMeter后直接高并发发送请求多次调用达到了我们的配置条件。断路器开启微服务不可用不再报错error而是
进入服务降级3.3.3、异常数
异常数
当资源近1分钟的异常数目超过阈值之后进入熔断这个统计时间窗口是分钟级别的若timewindow小于60s,则结束熔断状
态后仍可能再次进入熔断状态新增代码
GetMapping(/testF)
public String testF()
{log.info(testF 测试异常数);int age 10/0;return ------testF 测试异常数;
}配置规则如下 浏览器访问http://localhost:8401/testF
前5次报错走Error
之后报Blocked by Sentinel (flow limiting)
61s后,服务熔断解除走Error3.4、热点KEY限流
3.4.1、普通配置
何为热点热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据并对其访问进行限
制。之前的case限流出现问题后都是Sentinel的默认提示:Blocked by Sentinel (flow limiting)
我们将使用SentinelResource类似Hystrix的HystrixCommand。当方法出现问题后就找对应的兜底方法返回。
新增方法如下
GetMapping(/testHotKey)
SentinelResource(value testHotKey,blockHandler deal_testHotKey)
public String testHotKey(RequestParam(value p1,required false) String p1,RequestParam(value p2,required false) String p2) {//int age 10/0;return ------testHotKey;
}//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){return ------deal_testHotKey,o(╥﹏╥)o;
}配置规则如下 测试
快速访问http://localhost:8401/testHotKey 结果------testHotKey快速访问http://localhost:8401/testHotKey?p1abc 结果------deal_testHotKey,o(╥﹏╥)o快速访问http://localhost:8401/testHotKey?p2123 结果------testHotKey快速访问http://localhost:8401/testHotKey?p1abcp2123 结果------deal_testHotKey,o(╥﹏╥)o如果不快速访问达不到阈值时也只会返回------testHotKey
3.4.2、参数例外
我们有时候期望当P1参数为某个特殊值时它的限流值和平时不一样假如当P15时期望它的阈值为200。 测试
1、浏览器快速访问http://localhost:8401/testHotKey?p15 返回------testHotKey2、浏览器快速访问http://localhost:8401/testHotKey?p13 返回------deal_testHotKey,o(╥﹏╥)o注意参数必须是基础数据类型3.5、系统规则
系统保护规则是从应用级别的入口流量进行控制从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等
几个维度监控应用指标让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。系统保护规则是应用整体维度的而不是资源维度的并且仅对入口流量生效。入口流量指的是进入应用的流量
EntryType.IN比如 Web 服务或 Dubbo 服务端接收的请求都属于入口流量。系统规则支持以下的模式:
1、load自适应仅对 Linux/Unix-like 机器生效
系统的 load1 作为启发指标进行自适应系统保护。当系统 load1 超过设定的启发值且系统当前的并发线程数超过估
算的系统容量时才会触发系统保护BBR 阶段。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是
CPU cores * 2.5。2、CPU usage
当系统 CPU 使用率超过阈值即触发系统保护取值范围 0.0-1.0比较灵敏。3、平均 RT
当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护单位是毫秒。4、并发线程数
当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。5、入口 QPS
当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。3.6、SentinelResource
SentinelResource:类似Hystrix的HystrixCommand,做兜底服务自定义其中blockXXXX是处理配置违规的blockHandlerClass 处理类blockHandler 处理类下的处理方法fallback:处理异常做服务降级的
exceptionToIgnore忽略异常【程序异常和违规同时发生优先执行blockHandler】3.6.1、按资源名称限流
新增业务类RateLimitController
Slf4j
RestController
public class RateLimitController {GetMapping(/byResource)SentinelResource(value byResource,blockHandler handleException)public CommonResult byResource(){return new CommonResult(200,按资源名称限流测试OK,new Payment(2020L,serial001));}public CommonResult handleException(BlockException exception){return new CommonResult(444,exception.getClass().getCanonicalName()\t 服务不可用);}}新增配置 测试
上述配置解析
表示1秒钟内查询次数大于1就限流跑到我们自定义的方法1、1s访问一次http://localhost:8401/byResource
结果{code:200,message:按资源名称限流测试OK,data:{id:2020,serial:serial001}}2、1s内快速多次访问http://localhost:8401/byResource
结果{code:444,message:com.alibaba.csp.sentinel.slots.block.flow.FlowException\t 服务不可用,data:null}根据资源名称限流会优先返回我们自定义的处理信息没有自定义的返回Sentinel默认限流处理信息3.6.2、按URL地址限流
新增方法
GetMapping(/rateLimit/byUrl)
SentinelResource(value byUrl,blockHandler byUrlHandler)
public CommonResult byUrl()
{return new CommonResult(200,按url限流测试OK,new Payment(2020L,serial002));
}public CommonResult byUrlHandler(BlockException exception){return new CommonResult(444,exception.getClass().getCanonicalName()\t 服务不可用);
}新增配置 测试
1、1s访问一次http://localhost:8401/rateLimit/byUrl
结果
{code:200,message:按url限流测试OK,data:{id:2020,serial:serial002}}2、1s内快速访问http://localhost:8401/rateLimit/byUrl
结果
Blocked by Sentinel (flow limiting)根据url地址限流返回的是Sentinel自带的默认限流处理信息3.6.3、优化
以上一个方法新增一个对应的处理限流方法代码冗余且和业务混杂我们可以将处理方法提出来做单独处理
新增一个handler
public class CustomerBlockHandler {//注意---这里必须是static且不能为privatepublic static CommonResult handlerException(BlockException exception){return new CommonResult(4444,按客戶自定义,global handlerException----1);}public static CommonResult handlerException2(BlockException exception){return new CommonResult(4444,按客戶自定义,global handlerException----2);}}业务类新增方法
GetMapping(/rateLimit/customerBlockHandler)
SentinelResource(value customerBlockHandler,blockHandlerClass CustomerBlockHandler.class,blockHandler handlerException)
public CommonResult customerBlockHandler()
{return new CommonResult(200,按客戶自定义,new Payment(2020L,serial003));
}新增对应的配置然后测试
1s内多次快速的访问http://localhost:8401/rateLimit/customerBlockHandler结果
{code:4444,message:按客戶自定义,global handlerException----1,data:null}3.7、Sentinel与Ribbon和Feign的整合
3.7.1、Sentinel与Ribbon
3.7.1.1、创建cloudalibaba-provider-payment-9004和9005
parentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version
/parent
modelVersion4.0.0/modelVersion
artifactIdcloudalibaba-provider-payment-9004/artifactIdpom
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloudalibaba-provider-payment-9004/artifactIddependencies!--SpringCloud ailibaba nacos --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependency!-- 引入自己定义的api通用包可以使用Payment支付Entity --groupIdcom.lee.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version/dependency!-- SpringBoot整合Web组件 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--日常通用jar包配置--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies
/projectapplication.yml
server:port: 9004spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: *主启动类
SpringBootApplication
EnableDiscoveryClient//服务发现
public class PaymentMain9004 {public static void main(String[] args) {SpringApplication.run(PaymentMain9004.class,args);}
}业务类
Slf4j
RestController
public class PaymentController {Value(${server.port})private String serverPort;public static HashMapLong, Payment hashMap new HashMap();static{hashMap.put(1L,new Payment(1L,aaa));hashMap.put(2L,new Payment(2L,bbb));hashMap.put(3L,new Payment(3L,ccc));}GetMapping(value /paymentSQL/{id})public CommonResultPayment paymentSQL(PathVariable(id) Long id){Payment payment hashMap.get(id);CommonResultPayment result new CommonResult(200,from mysql,serverPort: serverPort,payment);return result;}}3.7.1.2、创建cloudalibaba-consumer-order-84
parentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version
/parent
modelVersion4.0.0/modelVersion
artifactIdcloudalibaba-consumer-order-84/artifactIdPOM
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud_2020/artifactIdgroupIdcom.lee.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloudalibaba-consumer-order-84/artifactIddependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependencydependencygroupIdcom.lee.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/projectapplication.yml
server:port: 84spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080port: 8719service-url:nacos-user-service: http://nacos-payment-provider主启动类
EnableDiscoveryClient
SpringBootApplication
EnableFeignClients
public class ConsumerOrderNacos84 {public static void main(String[] args) {SpringApplication.run(ConsumerOrderNacos84.class,args);}
}配置类
Configuration
public class ApplicationContextConfig {BeanLoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}}业务类
Slf4j
RestController
public class CircleBreakerController {public static final String SERVICE_URL http://nacos-payment-provider;Resourceprivate RestTemplate restTemplate;RequestMapping(/consumer/fallback/{id})SentinelResource(value fallback) //没有配置//SentinelResource(value fallback,fallback handlerFallback) //fallback只负责业务异常//SentinelResource(value fallback,blockHandler blockHandler) //blockHandler只负责sentinel控制台配置违规//SentinelResource(value fallback, fallback handlerFallback, blockHandlerblockHandler,exceptionsToIgnore {IllegalArgumentException.class})public CommonResultPayment fallback(PathVariable Long id) {CommonResultPayment result restTemplate.getForObject(SERVICE_URL /paymentSQL/id, CommonResult.class,id);if (id 4) {throw new IllegalArgumentException (IllegalArgumentException,非法参数异常....);}else if (result.getData() null) {throw new NullPointerException (NullPointerException,该ID没有对应记录,空指针异常);}return result;}//fallbackpublic CommonResult handlerFallback(PathVariable Long id,Throwable e) {Payment payment new Payment(id,null);return new CommonResult(444,兜底异常handlerFallback,exception内容 e.getMessage(),payment);}//blockHandlerpublic CommonResult blockHandler(PathVariable Long id, BlockException blockException) {Payment payment new Payment(id,null);return new CommonResult(445,blockHandler-sentinel限流,无此流水: blockException blockException.getMessage(),payment);}}3.7.1.3、测试
1、启动nacos-server、sentinel-server、cloudalibaba-provider-payment-9004、9005、
cloudalibaba-consumer-order-84#############测试一############
2、浏览器访问http://localhost:84/consumer/fallback/1结果
{code:200,message:from mysql,serverPort: 9004,data:{id:1,serial:aaa}}
{code:200,message:from mysql,serverPort: 9005,data:{id:1,serial:aaa}}
两个结果来回切换3、浏览器访问http://localhost:84/consumer/fallback/4结果
Whitelabel Error Page#############测试二##############
4、consumer-84业务类放开注解SentinelResource(value fallback,fallback handlerFallback)//fallback只负责业务异常5、浏览器访问http://localhost:84/consumer/fallback/4结果
{code:444,message:兜底异常handlerFallback,exception内容 IllegalArgumentException,非法参数异常....,data:{id:4,serial:null}}##############测试三############
6、consumer-84业务类放开注解SentinelResource(value fallback,blockHandler blockHandler) //blockHandler只负责sentinel控制台配置违规7、且sentinel控制台新增fallback的降级策略新增降级资源名fallback 策略异常数 异常数2 时间窗口28、浏览器访问http://localhost:84/consumer/fallback/2结果正常浏览器访问http://localhost:84/consumer/fallback/4结果Whitelabel Error Page快速多次访问http://localhost:84/consumer/fallback/4结果{code:445,message:blockHandler-sentinel限流,无此流水: blockException null,data:{id:4,serial:null}}##################测试四############
9、consumer-84业务类放开注解SentinelResource(value fallback, fallback handlerFallback, blockHandler blockHandler,exceptionsToIgnore {IllegalArgumentException.class})10、浏览器访问http://localhost:84/consumer/fallback/4结果Whitelabel Error Page浏览器访问http://localhost:84/consumer/fallback/5结果{code:444,message:兜底异常handlerFallback,exception内容 NullPointerException,该ID没有对应记录,空指针异常,data:{id:5,serial:null}}结论blockHandlerClass 处理类
blockHandler 处理类下的处理方法
fallback:处理异常做服务降级的
exceptionToIgnore忽略异常3.7.2、Sentinel与OpenFeign
修改modulecloudalibaba-consumer-order-84
POM新增上面创建的时候就已增加过了
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependencyyml新增
#对Feign的支持
feign:sentinel:enabled: true新增feign对应的接口paymentService
FeignClient(value nacos-payment-provider,fallback PaymentFallbackService.class)
public interface PaymentService {GetMapping(value /paymentSQL/{id})public CommonResultPayment paymentSQL(PathVariable(id) Long id);}新增feign接口的对应的服务降级类PaymentFallbackService
Component
public class PaymentFallbackService implements PaymentService
{Overridepublic CommonResultPayment paymentSQL(Long id){return new CommonResult(44444,服务降级返回,---PaymentFallbackService,new Payment(id,errorSerial));}
}新增controllerOrderController
Slf4j
RestController
public class OrderController {// OpenFeignResourceprivate PaymentService paymentService;GetMapping(value /consumer/feign/paymentSQL/{id})public CommonResultPayment paymentSQL(PathVariable(id) Long id) {return paymentService.paymentSQL(id);}}主启动类新增注解
EnableFeignClients测试
1、启动nacos-server、sentinel-server、cloudalibaba-provider-payment-9004、9005、
cloudalibaba-consumer-order-842、浏览器访问http://localhost:84/consumer/feign/paymentSQL/5结果:
{code:200,message:from mysql,serverPort: 9005,data:null}4、此时关闭cloudalibaba-provider-payment-9004、9005两个微服务重新访问结果
{code:44444,message:服务降级返回,---PaymentFallbackService,data:{id:5,serial:errorSerial}}3.8、Sentinel规则持久化
//TODO 以后再单独列出文章来写