Spring Cloud Alibaba整合Sentinel进行服务熔断降级

一、下载Sentinel Dashboard控制台服务  Releases · alibaba/Sentinel · GitHub 一样的,根据自己的Spring Cloud Alibaba版本下载相应版本的Sentinel  

 启动服务,可以指定端口

java -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=localhost:8849 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar

启动完成后,在浏览器访问​​​​​​   ​http://localhost:8849    用户名、密码都是 sentinel 

Spring Cloud Alibaba整合Sentinel进行服务熔断降级_第1张图片

二、项目中引入sentinel依赖


     com.alibaba.cloud
     spring-cloud-starter-alibaba-sentinel

、整合在application.yml中指定sentinel-dashboard服务地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8849

 

 四、使用@SentinelResource标记资源,value为资源名,blockHandler指定的是被流控降级后执行的方法。

这个方法的返回值类型必须和接口方法一致,并且需要添加一个BlockException exception参数。

    @RequestMapping("getOrder")
    @SentinelResource(value = "getOrder",blockHandler = "FlowHandler")
    public String getOrder(){
        return "order message "+new Date();
    }

    public String FlowHandler(BlockException exception){
        return "你被流控了!";
    }

五、服务启动后需要先访问一次,才能在sentinel控制台看到Spring Cloud Alibaba整合Sentinel进行服务熔断降级_第2张图片

 六、找到getOrder链路,点击流控,默认QPS为1秒内,设置单机阀值为2,即1秒内访问超过2次将会被流控。

测试发现前两次访问返回:order message Wed Dec 07 17:35:18 CST 2022

第三次访问返回:你被流控了! 

Spring Cloud Alibaba整合Sentinel进行服务熔断降级_第3张图片

 七、同样点击熔断,可以根据需要设置,服务出异常多少次,进行降级处理

Spring Cloud Alibaba整合Sentinel进行服务熔断降级_第4张图片

 八、通过上面可以看到想要使用sentinel,就需要在方法上添加@SentinelResource注解,还要指定回调方法,对代码的入侵性太强。我们还可以做统一处理就是实现BlockExceptionHandler接口。

这时候就不要在加@SentinelResource注解了,如果添加了,则该方法不会使用统一处理。

因为handle是无返回值的方法,想要返回结果可以使用httpServletResponse输出。

@Component
public class SentinelGlobalHandler implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        Map map = new HashMap();
        if(e instanceof FlowException){
            map.put("code","900");
            map.put("msg","你被流控了!");
        }else if(e instanceof DegradeException){
            map.put("code","901");
            map.put("msg","你被降级了!");
        }else{
            map.put("code","902");
            map.put("msg",e.getMessage());
        }
        httpServletResponse.setHeader("content-type","application/json;charset=UTF-8");
        PrintWriter writer = httpServletResponse.getWriter();
        writer.print(map);
        writer.flush();
        writer.close();
    }
}

你可能感兴趣的:(Spring,Cloud,Alibaba,Sentinel,sentinel,java,spring,cloud)