1、介绍
当使用微服务架构时,由于服务间的调用关系错综复杂,难以避免的出现了分布式系统中的故障和延迟。为了保证系统的可用性和稳定性,我们需要在服务之间添加一些保护措施,比如熔断、降级、限流等。
Hystrix是Netflix开源的一种容错框架,主要是为了解决复杂分布式系统中服务之间的网络延迟、超时、故障等问题,达到快速失败并迅速恢复的效果,从而提高整个分布式系统的可用性和稳定性。Spring Cloud Alibaba集成了Hystrix,提供了丰富的注解和配置,可以轻松实现服务的熔断和降级。
2、什么是服务熔断与降级?
2.1 目的:
服务熔断和降级是微服务架构中常用的容错机制,主要为了保证系统的可用性和稳定性。
2.2 服务熔断:
在分布式系统中,当某个服务或者系统出现异常或者故障时,通过断路器(Circuit Breaker)自动切换到备选方案,暂时屏蔽不可用服务的调用请求,防止由于某个服务的故障导致整个系统的崩溃。当服务恢复正常后,断路器会自动恢复,继续提供服务。
2.3 服务降级:
在高并发流量过载、系统资源不足等情况下,通过牺牲部分功能来保证核心功能的正常运行。当系统负载达到一定程度时,可以关闭某些非关键性服务,或者返回一个固定的响应结果,从而减轻系统的压力。当系统负载下降时,再逐步开启这些被降级的服务。
服务熔断和降级虽然都是为了保证系统的可用性和稳定性,但是它们的触发条件和处理方式有所不同。服务熔断主要针对服务的失效或超时等异常情况,通过断路器来控制服务的调用流量;而服务降级主要针对资源紧张、高并发压力等情况,通过牺牲部分服务来保证核心功能的正常运行。使用服务熔断和降级机制可以有效地避免因为某一个服务的故障或异常导致整个系统的崩溃,提高系统的稳定性和可用性。
3、如何使用?
3.1 在你的pom.xml文件中添加Hystrix依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
3.2 在启动类上添加@EnableCircuitBreaker注解,以启用Hystrix断路器
@SpringBootApplication @EnableCircuitBreaker public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
3.3 yml 文件配置 (不强制,根据实际情况修改)
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5000 //配置Hystrix断路器的超时时间 可以通过设置hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds属性来配置Hystrix断路器的超时时间,单位为毫秒。例如,下面的配置将Hystrix的超时时间设置为5000毫秒:
3.4 例子
注意: 在需要进行容错处理的方法上,添加@HystrixCommand注解,并指定fallbackMethod属性,以指定故障发生时调用的备选方法。
例如,下面是一个 RestController ,使用Hystrix熔断器来保护对 /orders/{id} 的调用:
@RestController public class OrderController { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private OrderService orderService; @GetMapping("/orders/{id}") @HystrixCommand(fallbackMethod = "fallbackMethodForGetOrderById") public Order getOrderById(@PathVariable Long id) { logger.info("Getting order with id {}", id); return orderService.getOrderById(id); } public Order fallbackMethodForGetOrderById(Long id, Throwable ex) { logger.warn("Fallback method called for getOrderById with id {} : {}", id, ex.toString()); return null; } }
讲解:
在上面的代码中,@HystrixCommand注解告诉Hystrix 为 /order/{id} 方法配置熔断器,并指定了一个名为“fallbackMethodForGetOrderById”的备选方法。如果 /order/{id} 方法抛出异常或超时,Hystrix将调用备选方法,并返回备选方法返回的结果。
总的来说,整合Hystrix非常简单,只需要添加依赖、启用注解和使用@HystrixCommand注解就可以了。不过需要注意的是,Hystrix已经停止维护了,如果你想要使用更先进的容错技术,可以考虑使用Resilience4j等其他库。