四、微服务容错处理之Hystrix


实现容错的手段

雪崩效应

我们常把”基础服务故障”导致”级联故障”的现象称为雪崩效应。雪崩效应描述的是提供者不可用导致消费者不可用,并将不可用逐渐放大的过程。

如图所示,A 作为服务提供者(基础服务),B 为 A 的服务消费者,C 和 D 是 B 的服务消费者。当 A 不可用引起 B 的不可用,并将不可用像滚雪球一样放大到 C 和 D 时,雪崩效应就形成了。

雪崩效应

断路器模式

如图:

  • 正常情况下,断路器关闭,可正常请求依赖的服务。
  • 当一段时间内,请求失败率达到一定阈值(默认 5s 内 20 次失败),断路器就会打开。此时,不会再去请求依赖的服务。
  • 断路器打开一段时间后,会自动进入”半开”状态。此时,断路器可允许一个请求访问依赖的服务。如果该请求能够调用成功,则关闭断路器,否则继续保持打开状态。

断路器


Hystrix简介

HystrixNetflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提高系统的可用性与容错性。

Hystrix主要通过以下几点实现延迟和容错:

  • 包裹请求:使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的”命令模式”。
  • 跳闸机制:当某服务的错误率超过一定阈值时,Hystrix 可以自动或者手动跳闸,停止请求该服务一段时间。
  • 资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。
  • 监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
  • 回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
  • 自我修复:断路器打开一段时间后,会自动进入”半开”状态。断路器打开、关闭、半开的逻辑转换。

通用方式整合Hystrix

  1. 创建服务消费者,在pom文件中添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 创建启动类,添加@EnableHystrix或者@EnableCircuitBreaker注解;

  2. 创建 Controller:

@RestController
public class MovieRibbonController {

    private static final Logger LOGGER = LoggerFactory.getLogger(MovieRibbonController.class);

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @HystrixCommand(fallbackMethod = "findByIdFallback")
    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id) {
        return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
    }

    ...
    // 回退方法
    // 不想获得造成回退的原因,去除Throwable参数即可
    public User findByIdFallback(Long id, Throwable throwable) {
        LOGGER.error("进入回退方法,异常:", throwable);
        User user = new User();
        user.setId(-1L);
        user.setName("默认用户");
        return user;
    }
}
  1. 启动服务,当停止服务消费者,就会进入回退方法。

执行回退逻辑并不代表断路器已经打开。请求失败、超时、被拒绝以及断路器打开时都会执行回退逻辑。


该文章摘自《Spring Cloud 与 Docker 微服务架构实战(第二版)》

以上


文章作者: Qliang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Qliang !
评论
 上一篇
六、微服务容错处理之Feign使用Hystrix 六、微服务容错处理之Feign使用Hystrix
Spring Cloud默认已经为Feign整合了Hystrix,要想打开Hystrix支持。 Feign使用Hystrix 配置文件添加: feign: hystrix: enabled: true 编写Feign接口:
2019-01-23
下一篇 
三、微服务声明式REST调用之Feign 三、微服务声明式REST调用之Feign
Feign简介在负载均衡篇的示例中使用RestTemplate实现REST API调用: @GetMapping("/user/{id}") public User findById(@PathVariable Long id) {
2019-01-21
  目录