1.1对于Hystrix服务熔断我们首先要知道什么是Hystrix
Hystrix是一个应用于处理分布式系统的延迟和容错的开源库,Hystrix可以保证在一个依赖出问题的情况下,不会导致整个体系服务失败,提高了分布式系统的弹性
1.2Hystrix致力于解决的问题--服务雪崩
在分布式架构中会有多个为你服务层级调用而形成的调用链路,例如:在这个链路中某个服务发生异常,请求阻塞,用户的请求就不会得到响应,则tomcat这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞。
2.1Hystrix解决服务雪崩的手段
①线程隔离
②服务降级
往往这两种手段是同时进行的
2.2Hystrix解决服务雪崩的原理
①Hystrix为每一个调用服务分配小的线程构成一个线程池,如果线程池已满 Hystrix会立即开启熔断调用服务将立即被拒绝,默认情况不会采用线程排队加速判定时间
②用户的请求将不直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,请求超时,则会进行降级处理
-
断路器状态监控:Hystrix 会监控对远程服务或依赖的调用情况,包括请求成功率、失败率等指标。当失败率超过一定阈值时,Hystrix 断路器会打开,停止向远程服务发送请求。
-
快速失败:一旦断路器打开,所有对该服务的请求将立即失败,而不是等待超时。这可以减轻对故障服务的负载,避免大量请求同时涌入导致服务雪崩。
-
降级处理:在断路器打开的情况下,Hystrix 提供了降级处理机制,可以执行备选逻辑或返回默认值,以确保系统能够继续提供有限的服务能力。
-
半开状态恢复:当断路器打开一段时间后,Hystrix 会尝试进入半开状态,允许部分请求通过并检测服务是否已经恢复。如果发现服务正常,断路器将关闭;否则,继续保持打开状态。
-
熔断器自我修复:断路器在触发后会经过一段时间后自动重置(半开状态),并允许少量流量通过以测试服务的恢复情况。这种自我修复机制有助于避免服务长时间处于不可用状态。
*降级服务会优先保证核心服务
Hystrix服务降级的情况为 线程池已满或者更请求超时
接下进行代码演示:
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
开启熔断:在启动类上添加@EnableCirCuitBreaker注解:
@EnableFeignClients
@EnableCircuitBreaker
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AccountApplication {
public static void main(String[] args) {
SpringApplication.run(AccountApplication.class, args);
}
}
编写降级逻辑:给用户一个友好提示
@FeignClient(name = "statistics-service", fallback = StatisticsServiceClientFallback.class)//fallback = StatisticsServiceClientFallback.class 表示当Feign客户端调用失败时,将会使用StatisticsServiceClientFallback 类中的方法作为降级处理
public interface StatisticsServiceClient {
@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
void updateStatistics(@PathVariable("accountName") String accountName, Account account);
fallback = StatisticsServiceClientFallback.class 表示当Feign客户端调用失败时,将会使用StatisticsServiceClientFallback 类中的方法作为降级处理
在StatisticsServiceclientFallback这个类中编写降级后的处理:
@Component
public class StatisticsServiceClientFallback implements StatisticsServiceClient {
private static final Logger LOGGER = LoggerFactory.getLogger(StatisticsServiceClientFallback.class);
@Override
public void updateStatistics(String accountName, Account account) {
LOGGER.error("Error during update statistics for account: {}", accountName);
}
}
熔断器的三个状态:1.关闭状态 2.打开状态 3.半开状态
1.关闭状态 : 服务一切运行正常
2.打开状态 :服务熔断
3.半开状态 : 当服务熔断一段时间之后,熔断会进入半开状态对服务进行试探 判断服务是否可以重新正常进行,在配置文件中可以设置这段时长。