随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
资源
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
dependencies>
[
{
"resource":"addOrder",
"count":"1",
"grade":"1",
"strategy":"1",
"limitApp":"queryOrder",
"controlBehavior":"0"
}
]
[
{
"resource": "serviceHi",
"count": 1,
"grade": 0,
"timeWindow": 10,
"minRequestAmount": 1,
"slowRatioThreshold": 0.5,
"statIntervalMs": 10000
}
]
当前熔断规则定义:
在10秒钟之内,最少达到1次请求前提下,超过1毫秒的资源处理时间记录为慢调用,如果所有调用请求的慢调用比例达到50%,则资源会熔断,熔断持续时间10秒,10秒后,断路器半开,尝试访问资源,再次计算熔断规则.
[
{
"resource": "serviceHi",
"count": 1,
"grade": 2,
"timeWindow": 10,
"minRequestAmount": 1,
"slowRatioThreshold": 0.5,
"statIntervalMs": 10000
}
]
表示内容:
10秒内统计异常数的熔断策略,如果最小请求达到1,并且异常数超过1,进入熔断持续时间10秒.
spring:
cloud:
sentinel:
datasource:
#定义一个数据源的名称
key1:
nacos:
#数据源具体属性 nacos address namespace group-id 文件名称
server-addr: localhost:8848
data-id: flowRules.json
data-type: json
#namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
#每一个数据源的规则类型必须配置
rule-type: flow
#如果sentinel版本高于1.7 必须配置nacos用户名密码
username: nacos
password: nacos
key2:
nacos:
#数据源具体属性 nacos address namespace group-id 文件名称
server-addr: localhost:8848
data-id: degradeRules.json
data-type: json
#namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
#每一个数据源的规则类型必须配置
rule-type: degrade
#如果sentinel版本高于1.7 必须配置nacos用户名密码
username: nacos
password: nacos
@Service
public class HelloService {
//定义一个方法为sentinel资源使用的注解
//value 定义资源名称
//blockhandler 会在本类中,寻找一个同名的方法,做降级的处理 要求
//方法参数和方法返回值要和当前目标方法一致,并且要求添加一个异常对象的参数
//fallback
public String aaa(String name,BlockException e){
//异常 BlockException 有可能是所有不同规则对应的异常类型
//DegradeException
return "sorry,sayHi方法熔断了,"+name;
}
public String bbb(String name,Throwable e){
return "sorry,sayHi出现了异常,"+name;
}
@SentinelResource(
value = "serviceHi",
blockHandler="aaa",
fallback = "bbb")
public String sayHi(String name){
System.out.println("进入到service的saiHi");
String result="你好啊!"+name;
int a=1/0;
return result;
}
}
/**
远程调用时,和cart购物车有关的方法
单独封装一个bean对象
*/
@Component
@Slf4j
public class DubboCartService {
@DubboReference
private ICartService cartService;
/**
* 熔断降级的资源方法
* @param orderAddDTO
*/
@SentinelResource(
value="serviceHi",
blockHandler ="aaa" ,
fallback = "bbb")
public void HelloServiceBlockHanlder(OrderAddDTO orderAddDTO){
cartService.deleteUserCart(orderAddDTO.getUserId(), orderAddDTO.getCommodityCode());
}
public void aaa(OrderAddDTO orderAddDTO, BlockException e){
log.error("熔断规则生效,断路器打开状态,orderAddDTO:{},异常信息e:{}",orderAddDTO,e.getMessage());
}
public void bbb(OrderAddDTO orderAddDTO,Throwable e){
log.error("业务调用异常,orderAddDTO:{},异常信息e:{}",orderAddDTO,e.getMessage());
}
}