一、下载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
二、项目中引入sentinel依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
三、整合在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控制台看到
六、找到getOrder链路,点击流控,默认QPS为1秒内,设置单机阀值为2,即1秒内访问超过2次将会被流控。
测试发现前两次访问返回:order message Wed Dec 07 17:35:18 CST 2022
第三次访问返回:你被流控了!
七、同样点击熔断,可以根据需要设置,服务出异常多少次,进行降级处理
八、通过上面可以看到想要使用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();
}
}