微服务系统熔断降级是门玄学?你真的理解Hystrix的思想内核么?
2023-10-08 09:56:04
分布式系统面临的问题:
在微服务架构里,一个系统会有很多的服务。如下图:
[图片]
上图请求需要调用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是一个强大的熔断降级库,它可以帮助开发人员轻松实现服务熔断和服务降级,从而提高分布式系统的稳定性和可用性。
参考资料: