概述
上一篇博客我已经介绍了sentinel的控制台功能,以及他的限流处理
接下来我们实现sentinel的熔断保护功能
什么叫熔断保护,当我们的某个服务接口出现了问题,不能正常提供服务,或者该接口响应速度很慢,导致调用方大量请求堆积,此时需要将该接口降级服务,从而保护调用该接口的服务,快速返回降级结果,防止因为过多的服务等待该接口的返回,导致系统雪崩
启动控制台, 启动nacos server, 这个就不在多说了, 请查看前期博客
接下来我们对payment-service进行改造
新增PaymentService接口
public interface PaymentService {
Balance getBalance(Integer id);
}
PaymentServiceImpl实现类
@Service
@RefreshScope
public class PaymentServiceImpl implements PaymentService {
final static Map<Integer, Balance> balanceMap = new HashMap() {
{
put(1, new Balance(1, 10, 1000));
put(2, new Balance(2, 0, 10000));
put(3, new Balance(3, 100, 0));
}
};
@Value("${sleep:0}")
private int sleep;
@Value("${server.port:0}")
private int port;
@Override
@SentinelResource(value = "getBalance", fallback = "getBalanceFallBack", blockHandlerClass = SentinelExceptionHandler.class, blockHandler = "blockExceptionHandle")
public Balance getBalance(Integer id) {
System.out.println("request: " + port + ", /pay/balance?id=" + id + ", sleep: " + sleep);
if(sleep > 0) {
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//制造异常
for (int i = 0; i < 100000000L; i++) {
throw new RuntimeException();
}
if(id != null && balanceMap.containsKey(id)) {
return balanceMap.get(id);
}
return new Balance(0, 0, 0);
}
// 该方法降级处理函数,参数要与原函数getBalance相同,并且返回值类型也要与原函数相同,此外,该方法必须与原函数在同一个类中
public Balance getBalanceFallBack(Integer id){
return new Balance(0, 0, 0, "sentinel降级处理");
}
}
改造controller
将原有逻辑代码移动到实现类中,将@SentinelResource
注解移动到实现类方法上面, 并添加fallback属性,
添加对应的降级方法, 如上PaymentServiceImpl中的getBalanceFallBack, 解释如上注解
@RestController
public class PaymentController {
@Autowired
private PaymentService service;
/**
*
* @param id
* @return
*/
@RequestMapping("/pay/balance")
public Balance getBalance(Integer id) {
return service.getBalance(id);
}
}
代码基本改造完成
sentinel又3中降级处理方法,
1.超时降级: 在超过多少次的超时后,下一次尝试访问超时就降级
2.异常比率: 在达到一定比率后的下一次访问异常就降级
3.异常数:在到达多少次异常后,下一次异常就降级
sentinel控制台中3中规则配置如下窗口
配置好降级规则
我这里配置的时异常数, 印为我代码里写的时抛出异常
然后我们访问
http://localhost:8081/acc/user?id=1
或者访问http://localhost:8082/pay/balance?id=3
返回的都是降级处理的结果,不会出现异常页面
最后
以上就是爱撒娇薯片为你收集整理的springCloud Alibaba实战五之Sentinel(熔断处理)的全部内容,希望文章能够帮你解决springCloud Alibaba实战五之Sentinel(熔断处理)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复