我是靠谱客的博主 矮小红酒,这篇文章主要介绍Sentinel(服务限流,熔断,降级,热点规则,@SentinelResource,整合openfeign,sentnel持久化)个人笔记Sentinel(服务限流,熔断,降级,@SentinelResource,整合openfeign,sentnel持久化)个人笔记,现在分享给大家,希望可以做个参考。

Sentinel(服务限流,熔断,降级,@SentinelResource,整合openfeign,sentnel持久化)个人笔记

1.服务限流

在这里插入图片描述
链路
在这里插入图片描述
关联
在这里插入图片描述

若果是直接的话,代表的意思就是,若果访问/testa的线程数大于二则直接响应默认错误信息。

在这里插入图片描述

冷加载 代表着如果在开始的时只能吃力10/3个请求,超过则报默认错误,5秒后增加到每秒处理10个请求,这个时候在每秒超过10个请求依旧报错。

排队等待在这里插入图片描述

服务熔断降级策略

  1. 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用
    RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
    状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  2. 异常比例
    (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
    状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% -
    100%。
  3. 异常数
    (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
4
feign: 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
28
server: 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(服务限流内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部