day_2 分布式入门: Sentinel
Sentinel
基础知识
功能介绍
架构原理
资源&规则
工作原理
部署与配置
部署
在https://github.com/alibaba/Sentinel/releases
下载jar文件后启动,在127.0.0.1:8080
可以访问到控制面板
配置
可按照下方进行配置:
spring:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 配置面板地址
eager: true # 配置启动时就连接面板
异常处理
在为‘资源’设置规则限制之后,如果触发限制,则会抛出BlockException
异常,针对这类异常可以进行一些自定义处理。
Web请求资源
对于Web请求,在触发规则限制后,抛出的BlockException
可以被统一的异常处理器(默认为BlockExceptionHandler
)统一处理。也可以自定义异常处理器,只需要实现BlockExceptionHandler
接口并交给容器管理,如下:
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException e) throws Exception {
PrintWriter printWriter = response.getWriter();
response.setContentType("application/json");
printWriter.write("{\"code\":5000,\"message\":\"流控触发\"}");
printWriter.flush();
printWriter.close();
}
}
但这种方式只限于Web请求这类能够被Sentinel 的 Spring WebMVC 适配器自动注册过的资源。
方法级资源
我们也可以通过@SentinelResource(value = "<valueName>", blockHandler = "<handlerMethod>")
这种方式将某个方法注册为资源,但此时它们触发规则时抛出的异常不会被MVC处理,需要通过blockHandler
、fallback
或defaultBlockHandler
等设置处理方法,比如:
@Service
public class OrderServiceImpl implements OrderService {
@SentinelResource(value = "createOrder", blockHandler = "createOrderHandler")
@Override
public OrderData createOrder(String id) {
OrderData orderData = new OrderData();
orderData.setId(Integer.parseInt(id));
orderData.setName("order");
return orderData;
}
public OrderData createOrderHandler(String id, BlockException e) {
OrderData orderData = new OrderData();
orderData.setId(0);
orderData.setName("流控触发: " + id + " 异常信息: " + e.getClass().getSimpleName());
return orderData;
}
}
fallback
与blockHandler
相比,除了能够处理规则限制触发的异常外,还能够处理业务异常,只需要调整异常处理方法中的异常参数即可。
OpenFeign
对于OpenFeign
远程调用时因触发规则限制产生的BlockException
,会自动调用OpenFeignClient
定义的兜底方法进行异常处理。
SphU硬编码
除了上述三种外,也可以通过SphU.entry()
对于方法内部的逻辑进行资源限制,在触发规则限制后,可以在catch
代码块中进行处理逻辑。比如:
@Override
public OrderData createOrderAAA() {
try {
SphU.entry("aaa");
OrderData orderData = new OrderData();
orderData.setId(0);
orderData.setName("entry normal");
return orderData;
} catch (BlockException e) {
OrderData orderData = new OrderData();
orderData.setId(0);
orderData.setName("entry block");
return orderData;
}
}
流控规则
链路模式需关闭context合并:
spring.cloud.sentinel.web-context-unify=false
流控效果
排队等待
、Warm up
流控效果不支持关联
、链路
两个流控模式。
熔断规则
断路器原理
热点规则
Web请求默认不支持热点规则,使用时需要先通过@SentinelResource
注解定义资源