返回

微服务系统熔断降级是门玄学?你真的理解Hystrix的思想内核么?

后端

分布式系统面临的问题:

在微服务架构里,一个系统会有很多的服务。如下图:

[图片]

上图请求需要调用A,H,I, P四个服务,如果一切顺利没有什么问题,倘若其中某一个服务,机房着火,不幸挂掉了。

[图片]

系统调用关系

如上图,若P服务挂了,必然导致I服务,进而H服务也挂了。这样,调用方的整个请求也就挂了。

显然,调用方并不知道到底是哪里挂了,它只知道自己这边调用一个服务挂了,这时该咋办?

服务降级:

服务降级(service degradation),是指当服务发生故障或性能不佳时,主动降低服务质量以保证服务可用。

具体措施包括:

  • 拒绝部分请求,比如,用户注册、充值等非必要业务,可以先降级掉。
  • 提供简化服务,比如,商品详情页只显示商品名称、价格,而不显示图片,毕竟图片加载慢。

服务熔断:

服务熔断(service circuit breaking),是指当服务发生故障或性能不佳时,暂时禁止访问该服务,直到服务恢复正常。

熔断的过程一般分为三个状态:

  • 正常状态 :服务正常运行,可以正常访问。
  • 熔断状态 :服务发生故障或性能不佳,禁止访问。
  • 半熔断状态 :服务经过一段时间后,重新允许少量请求访问,如果访问成功,则恢复正常状态,否则继续熔断。

Hystrix:

Hystrix是SpringCloud生态系统中一个强大的熔断降级库,它提供了丰富的功能来帮助开发人员实现服务熔断和服务降级。

Hystrix的核心思想是通过使用断路器来实现熔断降级。断路器是一个状态机,它可以根据服务的状态来决定是否允许请求访问服务。

断路器有三个状态:

  • 关闭状态 :断路器关闭,所有请求都将被拒绝。
  • 打开状态 :断路器打开,所有请求都将被允许访问服务。
  • 半开状态 :断路器半开,只有部分请求将被允许访问服务。

断路器会根据服务的状态来切换状态。当服务发生故障或性能不佳时,断路器会切换到关闭状态,禁止所有请求访问服务。当服务恢复正常后,断路器会切换到打开状态,允许所有请求访问服务。

为了防止断路器在服务恢复正常后立即打开,导致大量请求涌入服务,从而导致服务再次崩溃,Hystrix引入了半开状态。在半开状态下,断路器只允许少量请求访问服务。如果这些请求都成功了,则断路器会切换到打开状态。否则,断路器会继续保持关闭状态。

Hystrix还提供了一些其他功能,比如:

  • 线程池隔离 :Hystrix可以为每个服务创建一个单独的线程池,从而防止服务之间互相影响。
  • 命令模式 :Hystrix提供了命令模式,可以将服务调用包装成命令,从而简化服务调用的代码。
  • 监控和告警 :Hystrix提供了监控和告警功能,可以帮助开发人员及时发现服务问题。

使用Hystrix实现服务熔断和服务降级:

使用Hystrix实现服务熔断和服务降级非常简单,只需要在服务中引入Hystrix依赖,并在服务代码中使用Hystrix的注解即可。

以下是一个使用Hystrix实现服务熔断和服务降级的示例代码:

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String helloWorld() {
    return "Hello World!";
}

public String fallbackMethod() {
    return "Sorry, the service is currently unavailable.";
}

在上面的代码中,@HystrixCommand注解表示该方法是一个Hystrix命令,fallbackMethod属性指定了当该方法发生故障时要调用的降级方法。

helloWorld()方法发生故障时,Hystrix会自动调用fallbackMethod()方法,并返回Sorry, the service is currently unavailable.

总结:

Hystrix是一个强大的熔断降级库,它可以帮助开发人员轻松实现服务熔断和服务降级,从而提高分布式系统的稳定性和可用性。

参考资料: