Hystrix的异常处理
我们在调用服务提供者时,服务提供者可能抛出异常,我们自己也可能抛异常,默认情况下方法抛了异常会自动进行服务降级,交给服务降级中的方法去处理;
当我们自己发生异常后,只需要在服务降级方法中添加一个 Throwable 类型的 参数就能够获取到抛出的异常的类型,如下:
public ResultObject fallback(Throwable throwable) {
System.out.println(throwable.getMessage());
return new ResultObject(Constant.ONE,"服务降级");
}
当然远程服务发生了异常也可以获取到异常信息;
如果远程服务有一个异常抛出后我们不希望进入到服务降级方法中去处理,而是 直接将异常抛给用户,那么我们可以在@HystrixCommand 注解中添加忽略异 常,如下:
@HystrixCommand(fallbackMethod = "fallback", ignoreExceptions=Throwable.class,
降级是作用?
- 可以监听你的请求有没有超时;(默认是1秒,时间可以改)
- 异常或报错了可以快速让请求返回,不会一直等待;(避免线程累积)
- 当的系统马上迎来大量的并发(双十一秒杀这种或者促销活动) 此时如果系统承载不了这么大的并发时,可以考虑先关闭一些不重要的微服务(在降级方法中返回一个比较友好的信息),把资源让给核心微服务,待高峰流量过去,再开启回来。
Hystrix限流
限流有很多方案:
- Nginx
- Redis + Lua
- Sentinel
- 基于限流算法自己实现(令牌桶、漏桶算法)
hystrix限流就是限制你某个微服务的使用量(可用线程数、信号量)
hystrix通过线程池的方式来管理微服务的调用,它默认是一个线程池(大小10个) 管理你的所有微服务,你可以给某个微服务开辟新的线程池:
@RequestMapping("/cloud/goodsHystrix2")
@HystrixCommand(fallbackMethod = "fallback",
threadPoolKey = "goods",
threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "2"),
@HystrixProperty(name = "maxQueueSize", value = "1")})
public ResultObject goodsHystrix2() throws InterruptedException {
threadPoolKey 是线程池唯一标识, hystrix 会使用该标识来计数,看线程占用是否超过了, 超过了就会直接降级该次调用;
这里coreSize给他值为2 那么假设你这个方法调用时间是1s执行完, 那么在1s内如果有超过2个请求进来的话,剩下的请求则全部降级;
其中maxQueueSize是一个线程队列,里面只能放一个请求线程,本来线程数有2个,队列里面允许放一个,那么总共只能有3个请求线程执行,如果超过了就会限流;