服务降级,controller设置服务降级的超时时间无效?
服务调用出现的问题
- 服务A——>H——>I——>P调用,如果I服务超时,将导致请求全部积压在H服务,导致占用系统资源,引发“雪崩效应”。
解决办法:Hystrix Defend Your App
- Hystrix是处理分布式系统的延迟和容错的开源库。在分布式系统中,许多依赖会调用失败,超时、异常等,Hystrix能够保证在一个依赖出现问题时,不会导致整体服务失败,避免级联故障,提高系统弹性。
- 断路器:当某个服务出现故障,通过断路器的故障监控,像调用方返回一个符合预期的、可处理的备选响应(Fallback),而不是长时间等待或者抛出无法处理的异常。
Hystrix 简单使用
- 服务降级Fallback:服务出现问题,不会让用户等待,也不会调用出问题的服务,而是调用降级方法,返回友好提示。
- 什么情况会出现
- 运行异常
- 超时
- 服务熔断触发
- 线程池打满
- 什么情况会出现
- 服务熔断Break:直接拒绝访问,调用服务降级方法返回友好提示。
- 服务限流Flowlimit:秒杀高并发操作,控制流量。
服务降级入门案例
- 在服务消费方的 controller 层服务降级
<!--hystrix 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
//方法注解 @HystrixCommand
//超时时间设置 @HystrixProperty
@HystrixCommand(fallbackMethod = "okMessageFallbackMethod",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
})
public String okMessage(){
return paymentHystrixService.okMessage();
}
public String okMessageFallbackMethod(){
return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}
- 每个方法都设置服务降级方法不合理,可以使用全局降级方法。
//类注解 @DefaultProperties
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
// 下面是全局fallback方法
public String payment_Global_FallbackMethod()
{
return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
}
controller设置服务降级的超时时间无效
- 服务提供方模拟超时3秒钟,消费方设置超时时间5秒
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
,按照逻辑应该是调用成功,但是浏览器返回降级方法内容。 - 解决办法说明:消费方service层使用openFeign调用服务默认超时时间1秒,而服务提供方模拟超时3秒钟,导致服务调用失败,所以controller设置服务降级的超时时间无效。
//feign集成ribbon,设置ribbon超时时间
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
feign接口实现服务降级
#feign开启hystrix
feign:
hystrix:
enabled: true
//实现feign接口,重写方法,这就是服务降级的方法
@Component
public class PaymentHystrixServiceFallback implements PaymentHystrixService {
@Override
public String okMessage() {
return "PaymentHystrixService fallback /(ㄒoㄒ)/~~";
}
}
//feign接口注解
@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = PaymentHystrixServiceFallback.class)
-
feign接口服务降级超时问题
在于feign:hystrix:enabled: true的作用,官网解释“Feign将使用断路器包装所有方法”,也就是将@FeignClient标记的service接口下所有的方法进行了hystrix包装(类似于在这些方法上加了一个@HystrixCommand),这些方法默认的服务降级超时时间为1s。而服务提供方模拟超时3秒钟,导致服务调用失败,直接进入实现类服务降级方法。 -
解决办法,yml文件配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
配置文件这里的 timeoutInMilliseconds 并不是覆盖注解中的设置,而是两者取较低值,同时也会算上 ribbon: ReadTimeout 的值,也就是三者取最低值。
作 者:凑数的园丁
出 处:https://www.cnblogs.com/lq-404/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。