Hystrix服务降级(停更)

Posted by Beyonderwei on 2020-12-10
Words 1.6k and Reading Time 6 Minutes
Viewed Times

一、相关概念

1. 服务雪崩

由于复杂的项目中系统中各个微服务之间存在相互调用,一旦某个服务出现长时间的不可用,即可能导致服务的雪崩。因此单一的后端依赖可能导致所有的服务在短时间内饱和导致连级效应。因此需要对故障和延迟进行管理,以便单个依赖关系失败后不至于导致整个服务的崩溃。

2.断路器

​ 实际上就是一种开关装置,当某个单元发生故障时,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,保证服务调用方不会被长时间】不必要的占用、避免了故障在分布式系统之间蔓延,乃至雪崩。

3. 服务降级(FallBack)

​ 当服务出现问题的时候(如程序运行异常、超时、线程池/信号量打满等),不让客户端等待直接返回一个友好提示。

4. 服务熔断(Break)

​ 类似于保险丝,当超过最大服务后,直接拒绝访问,然后调用服务降级返回友好提示,

5. 服务限流(FlowLimit)

​ 限制访问数,如高并发的场景下,严禁大量的访问一同发起。排队有序进行。

二、Hystrix 简介

​ 用于处理分布式系统延迟和容错的开源库,在分布式系统中,不可避免的会导致服务调用失败,如超时、异常等,Hystrix保证了在一个依赖出现问题的情况下,不会导致整个服务的失败,避免连级故障,提高分布式系统的弹性。

三、微服务创建

  • pom:引入spring-cloud-starter-netflix-hystrix

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

四、超时及运行异常的服务降级

​ 当queryInfo服务出现问题时,超过了3s 或出现异常时,直接执行TimeOutHandler 方法的返回结果,进行服务降级。

在微服务提供方:

  • 在service实现类上添加 @HystrixCommand 注解,配置超时或异常时的 fallback 方法。然后书写fallback方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @HystrixCommand(fallbackMethod = "TimeOutHandler",commandProperties = {
    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒钟以内就是正常的业务逻辑
    })
    public String queryInfo(Integer id){
    int timeNumber = 4;
    try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
    return "线程池:"+Thread.currentThread().getName()+" 耗时(秒)"+timeNumber;
    }

    public String TimeOutHandler(Integer id){
    return "系统繁忙请稍后再试";
    }
  • 在启动类上添加注解 @EnableCircuitBreaker@EnableHystrix 来激活 @HystrixCommand 注解。

五、服务调用方的服务降级

与微服务的提供方相同,一般在服务的调用方设置服务降级

六、默认的服务降级方法

​ 若每一个服务方法都配备特定的服务降级,将导致代码的臃肿,因此提供统一的服务降级,对于有特殊需求的则单独处理

  • 直接在controller 类上添加如下注解

    1
    @DefaultProperties(defaultFallback = Global_FallbackMethod")  //全局
  • 书写统一的 降级处理方法

    1
    2
    3
    public String Global_FallbackMethod() {
    return "服务超时或出现错误,请稍后再试";
    }
  • 为每个接口添加 @HystrixCommand 注解。或通过如下方单独配置超时时间

    1
    2
    3
    @HystrixCommand(commandProperties = {
    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })

七、通过Feign 开启hystrix 统一管理服务降级

通过 OpenFeign 直接对fallback的接口进行处理,在接口处就完成统一的管理。

  • 配置类:如果处理 feign 自身的容错就开启。开启方式与生产端不一样。

    1
    2
    3
    feign:
    hystrix:
    enabled: true #如果处理自身的容错就开启。
  • 在 OpenFeign 的接口上添加如下注解,表明由 FallbackService类来处理降级。

    1
    @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = FallbackService.class)
  • 新建 FallbackService 实现OpenFeign 接口,对每个方法出现降级进行处理。

    1
    2
    3
    4
    @Component
    public class PaymentFallbackService implements HystrixService{
    ...
    }
  • 注:当六中的默认降级方法和@FeignClient 配置的同时存在时,优先响应@FeignClient 的fallback类的降级方法。

八、 服务熔断

​ 当接口出现超时或异常时,将触发服务降级,长时间的服务降级不可用将直接触发熔断,熔断并不是服务完全的不可用,此时断路器处于半开状态,会适当的放过一些请求,当后序服务恢复以后,放过的请求如果成功,断路器将重新Close(接通),流程如下:正确 -> 错误 -> 降级 -> 熔断 -> 恢复

1. 配置方式

​ 在service中针对出发服务熔断的方法添加如下注解,并书写降级处理方法CircuitBreaker_fallback,开启熔断,配置熔断条件。

1
2
3
4
5
6
@HystrixCommand(fallbackMethod = "CircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //请求次数 默认20
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间范围 默认10秒
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸 默认50%
})

上述配置触发熔断的条件:10秒钟内,如果10次请求,百分之60 的请求失败,将触发熔断。

2. 熔断恢复(Close)

默认是5秒时间之后,断路器会放过去一个请求,如果成功,则断路器恢复(Close)。

九、DashBoard图形监测

新建项目,作为Hystrix的DashBoard服务,对其他Hystrix服务的监测。

  • pom依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!--新增hystrix dashboard-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  • 启动类添加注解

    @EnableHystrixDashboard

  • 配置文件:配置服务端口

    1
    2
    server:
    port: 服务端口
  • 启动后直接访问 http://localhost:服务端口/hystrix 即可看到Hystrix的监控界面。输入相应的微服务,可对服务进行监控。

  • 对被监控的微服务启动类添加如下内容,指定监控路径:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Bean
    public ServletRegistrationBean getServlet(){
    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
    registrationBean.setLoadOnStartup(1);
    registrationBean.addUrlMappings("/hystrix.stream");
    registrationBean.setName("HystrixMetricsStreamServlet");
    return registrationBean;
    }
  • 在Hystrix的监控界面输入被监控的微服务的地址,查看微服务的状态

    http://localhost:微服务端口/hystrix.stream


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00