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秒
@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 "┭┮﹏┭┮";
}
@SentinelResource(value = "byResource",blockHandlerClass = MyBlockHandel.class,blockHandler = "handleException2")
value:值唯一,一般个请求路径一直
blockHandler :为兜底的方法名
blockHandlerClass:为全局兜底方法的类.class
fallback :负责业务异常(java代码异常)(参数为自定义异常方法)
blockHandler:只负责sentinel控制台配置违规 (参数为自定义违规方法)
@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包
<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中)
feign:
sentinel:
enabled: true
##3. 主启动上标注上相关注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
##4. 编写feign接口
@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实现类
@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
@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.导入jar
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
## 2.修改yaml文件
将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效
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 #流控规则
## nacos中添加配置
[
{
"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(服务限流内容请搜索靠谱客的其他文章。
发表评论 取消回复