使用微服务的好处多多,但也衍生出了各式各样的问题,这样就需要采取各种手段去完善微服务架构的思想,那为啥需要使用Hystrix断路器呢?
以前的单体应用架构业务之间的调用都是在一个项目中确切的说是在一台机器上面,而微服务各个业务之间的调用需要跨机器和跨网络,这就出现了更多不可控因素,比如网络突然出现异常,会出现连接超时,如果请求不多还好,请求多的话每个过来都超时都会创建大量的线程占用服务器资源,甚至导致系统瘫痪,如果微服务之间调用链太多可能造成雪崩,理论上来说网络都是稳定的,但是现实中谁也说不清,说不定被老鼠把网线咬了呢,等各种因素,对于这些太多的不可控因素,大佬们就提出了断路器来避免这种雪崩的现象。
断路器的思想和电路中的保险丝差不多,如果过载就会熔断,微服务中的断路器比保险丝的功能更加强大,可以实现线程隔离,信号量控制,线程数量控制,出现问题中断,而且还可以在跳闸后尝试请求,意思就是有1000个并发进来,如果在5秒内有20个请求出现问题了,那么剩下的980个请求就会被拦截掉不让其在去请求目标微服务,防止创建更多的线程,这就是线程隔离,如果过一段时间之后,断路器会放行一两个请求看看那个微服务好了没,如果好了,就会持续的放开,这也是断路器智能机制的一种体现,当然hystrix还有更多强大的功能,等待我们的挖掘。
使用断路器的功能也很简单
目录
1、在个人中心微服务中添加断路器依赖
<!-- 添加断路器支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、修改UserCenterController类,添加断路器注解
@DefaultProperties(defaultFallback = "fallback") 这个是默认回退注解
execution.isolation.thread.timeoutInMilliseconds 此属性设置调用者观察超时并离开命令执行的时间(以毫秒为单位)
coreSize 此属性设置核心线程池大小
maxQueueSize 此属性设置实现的最大队列大小
keepAliveTimeMinutes 此属性设置保持活动时间,以分钟为单位
queueSizeRejectionThreshold 此属性设置队列大小拒绝阈值
metrics.rollingStats.numBuckets 度量统计属性
metrics.rollingStats.timeInMilliseconds 此属性设置统计滚动窗口的持续时间(以毫秒为单位)
更多属性在hystrix github上有更加详细的说明,这里只是简单的介绍一下
3、修改用户微服务加一个休眠时间或者错误代码测试断路器功能
为了测试可以在需要调用的微服务中写一段错误代码或者休眠来测试断路器的功能
4、在UserCenterApplication启动类添加启用断路器注解
5、启动所有微服务,测试断路器是否起作用了
6、在postman中调用被加了断路器功能的接口
可以看到输出了错误,说明断路器起作用了,更多其他的测试可以自己玩一玩
7、文章源码地址
码云:https://gitee.com/apgblogs/springCloudStudy/tree/Hystrix/
加了断路器后就可以有效防止因为网络或者其他不可控因素出现大量请求堆积而造成系统资源占用率过高问题,对于断路器参数阈值的设置可以自己根据并发量调控,断路器也是防止整个服务群出现雪崩的有效手段。