SpringCloud Hystrix
针对之前的章节描述过服务注册、负载策略,那是否会存在一些特殊场景需要处理? 针对系统微服务高负载如何快速处理呢?
思考如下问题
- 如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到处理处理完返回,高负载情况下会造成所有处理用户请求的线程都会被耗竭
- 如果服务消费者可以是其它服务的提供者,这样会造成其它服务消费者接着耗竭,造成雪崩效应
解决方案思路如下
- 设置超时机制
- 断路器模式
超时详细分析:
优势:如服务A调用B默认是20S超时,那我们根据场景设定一个合理值,如4S,可能尽力避免资源耗竭。
缺点:当依赖服务有大量超时,再让新的请求去访问从本质上来看没有多少意义,只会无畏消耗现有资源,我们应该使用断路器避免浪费资源
断路器模式
优势:可以实现快速失败,如果它在一段时间内侦测到错误(如:超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,防止资源消耗;
同样路由器也可以使应用程序能够诊断错误是否已修正,如果正常;会再次尝试调用
断路器模式需要做哪些事情呢?
- 首先肯定要监控,比如调用哪些服务,共计多少次?多少次失败? 如超过20%,断路器打开状态
- 断路器状态(打开、关闭、半开)
- 分流,半开状态,一小部分流量尝试请求
- 断路器状态切换
下面讲解 Hystrix 实现断路器模式
如图,浏览器发送一个请求到API,请求微服务B,此处微服务B出现异常,开发人员可以在微服务B基础上提供一个Fallback机制,API直接请求Fallback,此时不再请求服务B
Hystrix Demo
@SpringBootAppliction
@EnableCircuitBreaker
public class CircuitBreakerApplication{
public static void main(String[] args){
SpringApplication.run(CircuitBreakerApplication.class,args);
}
}
@RestController
public class CircuitBreakerDemoController {
@Autowired
private FeginClient feginClient;
@RequestMapping(value = "/getUser",method = RequestMethod.GET)
@HystrixCommand(fallbackMethod="getUserFallback")
public String showInfo(@RequestParam String name){
return feginClient.userInfo(name);
}
public getUserFallback(String name){
return "";
}
}
针对以上代码,什么时候进入getUserFallback()方法呢?
配置 hystrix.command.default.execution.isolation.trhead.timeoutInMilliseconds:5000
调用服务方法showInfo(),5秒钟未响应,此时认为服务存在异常,会调用getUserFallback()方法
总结:
Hystrix 实现断路器模式,可以控制服务的统计、限流;保证资源合理化利用
作者简介:张程 技术研究
更多文章请关注微信公众号:zachary分解狮 (frankly0423)