降级规则就是设置当满足什么条件的时候,对服务进行降级。Sentinel提供了三个衡量条件:
第1步: 首先模拟一个异常
- int i = 0;
- @RequestMapping("/order/message2")
- public String message2() {
- i++;
- //异常比例为0.333
- if (i % 3 == 0){
- throw new RuntimeException();
- }
- return "message2";
- }
第2步: 设置异常比例为0.25
热点参数流控规则是一种更细粒度的流控规则, 它允许将规则具体到参数上。
热点规则简单使用
第1步: 编写代码
- @RequestMapping("/order/message3")
- @SentinelResource("message3")//注意这里必须使用这个注解标识,热点规则不生效
- public String message3(String name, Integer age) {
- return name + age;
- }
第2步: 配置热点规则
第3步: 分别用两个参数访问,会发现只对第一个参数限流了
很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过:
上面的资源名和授权类型不难理解,但是流控应用怎么填写呢?
第1步: 自定义来源处理规则
- @Component
- public class RequestOriginParserDefinition implements RequestOriginParser{
- @Override
- public String parseOrigin(HttpServletRequest request) {
- String serviceName = request.getParameter("serviceName");
- return serviceName;
- }
- }
第2步: 授权规则配置
这个配置的意思是只有serviceName=pc不能访问(黑名单)
第3步: 访问 http://localhost:8091/order/message1?serviceName=pc观察结果
系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 、CPU使用率和线程数五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量 (进入应用的流量) 生效。
扩展: 自定义异常返回
- //异常处理页面
- @Component
- public class ExceptionHandlerPage implements UrlBlockHandler {
- //BlockException 异常接口,包含Sentinel的五个异常
-
- // FlowException 限流异常
- // DegradeException 降级异常
- // ParamFlowException 参数限流异常
- // AuthorityException 授权异常
- // SystemBlockException 系统负载异常
- @Override
- public void blocked(HttpServletRequest request, HttpServletResponse
- response, BlockException e) throws IOException {
- response.setContentType("application/json;charset=utf-8");
- ResponseData data = null;
- if (e instanceof FlowException) {
- data = new ResponseData(-1, "接口被限流了...");
- } else if (e instanceof DegradeException) {
- data = new ResponseData(-2, "接口被降级了...");
- }
- response.getWriter().write(JSON.toJSONString(data));
- }
- }
- @Data
- @AllArgsConstructor//全参构造
- @NoArgsConstructor//无参构造
- class ResponseData {
- private int code;
- private String message;
- }