Spring Cloud之Hystrix框架详解

问题引入

在微服务体系中,每个服务都可能会调用很多其他依赖服务,有的时候某些依赖服务出现故障也是很正常的,这些服务一旦出了故障,上游的服务可就惨了,我们想象一下会有哪些问题呢?

1,比如A->B服务,B挂了,A一直在等待,直到超时,这时候我们肯定会设置超时时间,但是超时时间不能太长,在访问高峰期,太长了会导致A服务线程池被打满了,hang住了,如果被hang住了怎么办呢?这时候应该快速返回失败信息,不应该让费时间等到超时吧!如果A服务调用B服务线程池满了,是不是不能影响A服务调用C服务呢,我们是不是应该将调用B和C服务的线程池隔开呢!

2,B服务部署在多台服务器上,其中一台上的B服务挂了,每次访问都失败,是不是应该记录下失败次数,超过了这个次数,就暂时不能去访问那个挂了的节点了呢!但是总不能永远不能丢弃那个故障节点吧,如果我们的工程师及时的恢复了服务,是不是应该定时的去检测故障服务是否恢复呢?

3,如果B服务抛异常了,那我们总不能把异常直接抛给A服务吧,可不可返回个特定的合法的json格式呢,前端拿到这个json格式就能优雅地提示失败了。

4,服务之间的调用,我们是不是应该知道什么时间、上游服务、下游服务、调用结果、什么业务接口等信息,不然出了问题只能靠猜了。

Hystrix框架

为了解决这些问题Spring Cloud推出了Hystrix框架:

  • Hystrix框架通过资源隔离技术(线程池和信号量)阻止任何一个下游服务耗尽线程资源。

  • 同时提供fallback降级机制来应对故障,优雅的返回失败信息。

  • 当访问高峰期,请求排队积压时,采用限流和fail fast来控制故障。

  • Hystrix提供断路器来统计异常次数,来定义服务是否可用,过了一段时间断路器会尝试放入小部分请求来查看故障服务是否恢复。

  • Hystrix dashboard监控面板,负责统计和监控各个服务之间调用情况。

Hystrix常用配置

了解完Hystrix框架原理之后,我们再来看下平时我们如何来配置资源隔离、降级、熔断的,请看下面这段配置:

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: THREAD
          thread:
            timeoutInMilliseconds: 1000
            interruptOnTimeout: true
    
      circuitBreaker:
        enabled: true
        requestVolumeThreshold: 20 //默认多少次请求,错误率达到50%,触发断路器
        sleepWindowInMilliseconds: 5000 // 断路器打开后默认多久进行尝试
        errorThresholdPercentage: 50 // 错误百分比

执行相关的属性

  • hystrix.command.default.execution.isolation.strategy:隔离策略,默认Thread,可以选择Semaphore信号量

  • hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:超时时间,默认1000ms

  • hystrix.command.default.execution.timeout.enabled:是否启用超时,默认ture

  • hystrix.command.default.execution.isolation.thread.interruptOnTimeout:超时的时候是否中断执行,默认true

  • hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests:信号量隔离策略下,允许的最大并发请求数量,默认10

降级相关的属性

  • hystrix.command.default.fallback.enabled 默认true

熔断相关的属性

  • hystrix.command.default.circuitBreaker.enabled:是否启用熔断器默认true

  • hystrix.command.default.circuitBreaker.requestVolumeThreshold:10秒钟内,请求数量达到多少才能去尝试触发熔断,默认20

  • hystrix.command.default.circuitBreaker.errorThresholdPercentage:10秒钟内,请求数量达到20,同时异常比例达到50%,就会触发熔断,默认50

  • hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds:触发熔断之后,5s内直接拒绝请求,走降级逻辑,5s后尝试half-open放过少量流量试着恢复,默认5000

  • hystrix.command.default.circuitBreaker.forceOpen:强制打开熔断器

  • hystrix.command.default.circuitBreaker.forceClosed:强制关闭熔断器

这是默认是所有服务都生效的,但是有的时候我们需要对某些特定的服务进行配置:

hystrix:
  command:
    # 这是针对ServiceClient的getName方法来配置的,这种配置方式没人告诉你
    ServiceClient#getName(Long,String,Integer):
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 100
        circuitBreaker:
          requestVolumeThreshold: 4

fallback降级

降级的话光配置还不够,还需要代码来实现,请看下面一段代码:

@FeignClient(name = "data-center",fallbackFactory = HystrixClientFallbackFactory.class)
public interface ConfigService {
    @RequestMapping(value = "/datacenter/config/findAll/{type}", method = RequestMethod.GET)
    InvokeResult<AlarmConfigCommand> getConfig(@PathVariable("type") Integer type) ;
}

@Component
public class HystrixClientFallbackFactory implements FallbackFactory<ConfigService> {


    @Override
    public ConfigService create(Throwable cause) {
        return new ConfigService() {
            @Override
            public InvokeResult<AlarmConfigCommand> getConfig(Integer type) {
                //throw  new  CustomerRuntimeException(MyErrorType.SENSOR_FIND_TOP__ERROR);
                MyErrorType mes = MyErrorType.FIND_CONFIG_ERROR;
                return new InvokeResult(mes.getErrorCode(),mes.getMessage(),null);
            }
        };
    }
}

这就feign和hystrix整合,开发降级的代码demo,不同的版本写法还不一样,仅供参考。

Hystrix dashboard监控面板

只需要在pom文件中引入spring-cloud-starter-netflix-hystrix-dashboard,在项目启动类中添加 @EnableHystrixDashboard 注解,就已经开启,具体用法自行百度吧,这边简单提下。

Hystrix知识点是Spring Cloud的核心,无论是面试还是平时的工作,都会经常遇到,重中之重,一定要掌握好,如果你想更加系统学习Spring Cloud,请关注我的公众号-辉哥讲技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值