注解支持,必看:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
下载Sentinel:https://github.com/alibaba/Sentinel/releases
sentinel控制台文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
参考:https://www.cnblogs.com/ralgo/p/14152390.html
启动Sentinel命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar E:\download\sentinel-dashboard-1.8.8.jar
可以自由指定Sentinel端口,不指定直接启动默认就是8080,命令:java -jar E:\download\sentinel-dashboard-1.8.8.jar
浏览器访问 http://localhost:8080,登录账号密码都是sentinel
Nacos配置Sentinel规则JSON说明 https://www.cnblogs.com/xsj1989/p/18345057
基于之前的示例项目:https://www.cnblogs.com/xsj1989/p/18334504
父项目pom中引入依赖
<!--父pom管理的依赖--> <dependencyManagement> <dependencies> <!--Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2023.0.1.2</version> </dependency> <!--sentinel持久化依赖,采用Nacos作为规则配置数据源。--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.8</version> </dependency> </dependencies> </dependencyManagement>
<!--Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--sentinel持久化依赖,采用Nacos作为规则配置数据源。--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
子Module服务项目中bootstrap.yaml配置Sentinel,红色部分为新增的Sentinel配置。这样在调用服务的时候会自动找到对应的nacos配置,同步到Sentinel流控规则中。
server: port: 8001 # 服务端口号,与application.yaml中的一致。 spring: application: name: cloud-order-service # cloud-order-service-dev.yaml profiles: active: dev # 环境配置 test dev pro cloud: nacos: discovery: server-addr: localhost:8848 #Nacos作为服务中心地址 config: server-addr: localhost:8848 # Nacos作为配置中心地址 file-extension: yaml # Nacos配置后缀 group: DEFAULT_GROUP # Nacos配置分组 namespace: public # Nacos配置命名空间 username: nacos password: 123456 sentinel: transport: web-context-unify: false # 默认true 将调用链路收敛, 导致链路流控效果无效 dashboard: localhost:8080 # 配置sentinel dashboard地址,监控项目端口8001 port: 8719 # 默认8719端口,如果被占用,则从8719递增检查未被占用的端口 # sentienl 数据源配置 原文链接:https://blog.csdn.net/qq_42402854/article/details/127379403 datasource: nacos-flow-rule1: # 自定义数据源名称,可以随便定义,保持唯一,可以配置多个,目的是为了区分出每条规则,无实际应用。 nacos: server-addr: localhost:8848 # nacos地址 username: nacos # nacos账户 password: 123456 # nacos密码 namespace: 8e23ce60-9f28-4fa7-875a-5e0d61b533d5 # nacos命名空间必须使用id dataId: cloud-order-service-flow # Nacos创建的配置DataId rule-type: flow # 规则类型 flow:流控规则; data‐type: json # 默认值json,可以不填。 feign: sentinel: enabled: true
Controller对应的代码
//@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu") //@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu",blockHandlerClass = CustomerBlockHandler.class) @SentinelResource(value = "cloud-order-service-TestController-getStu", fallback = "getStu", fallbackClass = CustomerFallback.class) @GetMapping("/getStu") public StuDto getStu() { return new StuDto() {{ setAge(23); setName("jay111"); setSn("111111"); }}; } //sentinel限流处理 public static StuDto dealGetStu(BlockException ex) { return new StuDto() {{ setAge(12); setName("TestController.dealGetStu"); setSn("TestController.dealGetStu"); }}; } //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "dealQueryStu") //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandler = "dealQueryStu") @SentinelResource(value = "cloud-order-service-TestController-queryStu", fallback = "queryStu", fallbackClass = CustomerFallback.class) @PostMapping("/queryStu") public StuDto queryStu(@RequestBody StuDto dto) { return new StuDto() {{ setAge(dto.getAge()); setName("George111"); setSn("111111"); }}; } //sentinel限流处理 public static StuDto dealQueryStu(StuDto dto, BlockException ex) { return null; }
@SentinelResource的属性说明
==value==:作用指定资源名称,必填
==entryType==:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
==blockHandler==:处理BlockException的函数名称,函数要求为 必须是public 返回类型与原方法一致 参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数 默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法
==blockHandlerClass==:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为: 必须是public 返回类型与原方法一致 参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
==fallback==:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为: 返回类型与原方法一致 参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数 默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法
==fallbackClass==:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
==defaultFallback==:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求: 返回类型与原方法一致 方法参数列表为空,或者有一个Throwable类型的参数 默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。
==exceptionsToIgnore==:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
==exceptionsToTrace==:需要trace的异常
Nacos新增配置,
命名空间:8e23ce60-9f28-4fa7-875a-5e0d61b533d5
Data Id:cloud-order-service-flow
配置格式:JSON
配置内容:如下
[ { "resource": "cloud-order-service-TestController-getStu", "controlBehavior": 0, "count": 1, "grade": 1, "limitApp": "default", "strategy": 0, "clusterMode": false }, { "resource": "cloud-order-service-TestController-queryStu", "controlBehavior": 0, "count": 1, "grade": 1, "limitApp": "default", "strategy": 0, "clusterMode": false } ]
配置说明:
resource:资源名称;
limitApp:来源应用;
grade:阈值类型;0表示线程数,1表示QPS;
count:单机阈值;
strategy:流控模式;0表示直接,1表示关联,2表示链路;
controlBehavior:流控效果;0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群。
Sentinel是懒加载,发起一次请求,再刷新Sentinel控制台就可以看到流控规则。
此种情况下,只能修改Nacos配置,然后同步到Sentinel。
而在Sentinel中修改规则,并不会同步回Nacos,有待后续研究。
参考:https://blog.csdn.net/u022812849/article/details/131206976
https://blog.csdn.net/qq_42402854/article/details/127379403
https://www.jb51.net/program/284986jxr.htm
https://www.zhihu.com/question/482422308/answer/3384468058
https://zhuanlan.zhihu.com/p/681044230
Nacos配置Sentinel各种规则说明:https://blog.csdn.net/ohh_lang/article/details/136384205