Sentinel(服务限流,熔断,降级,@SentinelResource,整合openfeign,sentnel持久化)个人笔记
1.服务限流
链路
关联
若果是直接的话,代表的意思就是,若果访问/testa的线程数大于二则直接响应默认错误信息。
冷加载 代表着如果在开始的时只能吃力10/3个请求,超过则报默认错误,5秒后增加到每秒处理10个请求,这个时候在每秒超过10个请求依旧报错。
排队等待
服务熔断降级策略
- 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用
RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - 异常比例
(ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% -
100%。 - 异常数
(ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
代表 在统计时间1秒内,若果有超过5个请求且百分之白的请求的响应时间都超过0.2秒则熔断降级,时间为5秒
表示, 在统计时间1秒内,若果有超过5个请求,且50%都的请求出现错误则熔断降级,熔断时间为5秒
表示, 在统计时间1秒内,若果有超过5个请求,且有4个请求出现异常则熔断降级,时间为5秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18@GetMapping("/hotspot") @SentinelResource(value = "hotspot",blockHandler = "blockHotspot") public String hotspot(@RequestParam(value = "id1",required = false) String id1, @RequestParam(value = "id2",required = false) String id2){ return "..........hotspot"; } /** * 兜底的方法(参数要和被兜底的方法一样且 有BlockException exception) * @param id1 * @param id2 * @param exception * @return */ public String blockHotspot(String id1, String id2, BlockException exception){ return "┭┮﹏┭┮"; }
1
2@SentinelResource(value = "byResource",blockHandlerClass = MyBlockHandel.class,blockHandler = "handleException2")
value:值唯一,一般个请求路径一直
blockHandler :为兜底的方法名
blockHandlerClass:为全局兜底方法的类.class
fallback :负责业务异常(java代码异常)(参数为自定义异常方法)
blockHandler:只负责sentinel控制台配置违规 (参数为自定义违规方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23@GetMapping("/consumer/fallback/{id}") @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler") public CommonResult<Payment> fallback(@PathVariable Long id) { CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id, CommonResult.class,id); if (id == 4) { throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常...."); }else if (result.getDate() == null) { throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异常"); } return result; } //fallback public CommonResult handlerFallback(@PathVariable Long id,Throwable e) { Payment payment = new Payment(id,"null"); return new CommonResult<>(444,"兜底异常handlerFallback,exception内容 "+e.getMessage(),payment); } //blockHandler public CommonResult blockHandler(@PathVariable Long id, BlockException blockException) { Payment payment = new Payment(id,"null"); return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException "+blockException.getMessage(),payment); }
这样的话就都可以起到作用,且如果同时有java异常和违规的话执行违规的兜底方法
意思为若果不符合定义的规则,找到MyBlockHandel这个类的handleException2这个静态方法执行。
必须是静态。
热点规则
代表访问这个/byResource中的第一个参数它的类型是String且他的值是5的时候
那么他可以每秒访问200次,若不是5则只能每秒访问1次。
访问url和资源名的区别
访问url若不符合规则那么会掉用默认的错误处理方法。
Blocked by Sentinel (flow limiting)
访问资源名若不符合规则那么会掉用自己定义的方法,若自己没有定义那么还是会调用默认的错误处理方法。
OpenFeign与sentinel的整合
##1. 导入相关jar包
1
2
3
4
5
6
7
8
9<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
##2. 开启sentinel对feign的支持(在yaml中)
1
2
3
4feign: sentinel: enabled: true
##3. 主启动上标注上相关注解
1
2
3
4@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients
##4. 编写feign接口
1
2
3
4
5
6@FeignClient(value = "nacos-payment-provider",fallback = MyFeignImpl.class) public interface MyFeign { @GetMapping(value = "/paymentSQL/{id}") public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id); }
@FeignClient注解属性
value 填写微服务名
fallback 为兜底的方法MyFeignImpl此类要实现MyFeign
@GetMapping(value = “/paymentSQL/{id}”)必须和服务提供者一样
@PathVariable(“id”) Long id参数也是
方法名可以不相同但建议相同
##5. 编写feign实现类
1
2
3
4
5
6
7
8
9
10
11
12
13@Component public class MyFeignImpl implements MyFeign { /** * feign的异常处理兜底方法 * @param id * @return */ @Override public CommonResult<Payment> paymentSQL(Long id) { return new CommonResult<Payment>(4444,"兜底异常处理",new Payment(1L,"333333")); } }
此类需要注入到ioc容器中(若果在调用出错了,或者异常,或者违规都会调用次兜底的方法)
##6. 使用feign
1
2
3
4
5
6
7
8@Resource//java自带的依赖注入(和@Autowired作用相同) private MyFeign feign; @GetMapping(value = "/consumer/paymentSQL/{id}") public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id){ return feign.dasddasd(id); }
sentinel持久化
1
2## 1.导入jar
1
2
3
4
5<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
1
2## 2.修改yaml文件
将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28server: port: 8401 spring: application: name: cloudalibaba-sentinel-service cloud: sentinel: datasource: ds1: nacos: server-addr: localhost:8848 #nacos服务器地址 dataId: ${spring.application.name} #微服务名 groupId: DEFAULT_GROUP #默认的组 data-type: json #数据类型 rule-type: flow #流控规则 transport: port: 8719 dashboard: localhost:8080 nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: '*'
datasource:
ds1:
nacos:
server-addr: localhost:8848 #nacos服务器地址
dataId: ${spring.application.name} #微服务名
groupId: DEFAULT_GROUP #默认的组
data-type: json #数据类型
rule-type: flow #流控规则
1
2## nacos中添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[ { "resource": "/testa", "limitApp": "default", "grade": 1, "count": 1, "strategy": 0, "controlBehavior": 0, "clusterMode": false }, { "resource": "/testb", "limitApp": "default", "grade": 1, "count": 1, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]
类容解释
表示对/teata和/testb进行以下配置
未解决的问题
目前还不知道rest风格的请求方式如何限流
如 @GetMapping("/testc/{id}")
问题解决:
使用openFeign进行远程调用的时候
sentinel上出现这个簇点
可以进行限流以及其他操作
最后
以上就是矮小红酒最近收集整理的关于Sentinel(服务限流,熔断,降级,热点规则,@SentinelResource,整合openfeign,sentnel持久化)个人笔记Sentinel(服务限流,熔断,降级,@SentinelResource,整合openfeign,sentnel持久化)个人笔记的全部内容,更多相关Sentinel(服务限流内容请搜索靠谱客的其他文章。
发表评论 取消回复