文章目录
一、Hystrix熔断器
1. 雪崩效应
雪崩效应是指在一个系统中,当某个组件或节点发生故障或失效时,其影响会逐渐扩散并导致其他组件或节点也相继发生故障或失效,最终导致整个系统崩溃的现象。这种效应类似于雪崩时雪坡上的雪一片片地崩落,最终形成大规模的雪崩。
2. 什么是Hystrix?
Hystrix通过将每个服务调用封装在一个独立的线程中,并为每个服务调用设置超时时间和容错策略,以防止由于某个服务调用的故障或延迟导致整个系统的阻塞,避免雪崩效应。当某个服务调用失败时,Hystrix会快速失败并服务降级,返回一个备用的响应,而不会等待超时。
此外,Hystrix还提供了实时的监控和统计功能,可以用于监测系统的健康状况和性能指标,并通过仪表盘展示给开发人员和运维人员。
3. Hystrix功能介绍
-
故障隔离(Fault Isolation):Hystrix使用线程池隔离每个服务调用,使得一个服务调用的故障不会影响到其他服务调用。这种隔离可以防止故障的扩散,提高系统的稳定性。
-
熔断(Circuit Breaker):Hystrix通过熔断机制来防止故障的持续发生。当某个服务调用的故障率超过设定的阈值时,Hystrix会自动打开熔断器,后续的请求将被快速失败,而不会继续尝试调用该服务,从而避免资源的浪费和系统的崩溃。
-
降级(Fallback):Hystrix提供了降级机制,当某个服务调用失败或超时时,可以通过指定备用的逻辑进行降级处理,返回一个预先定义好的默认响应,保证系统的可用性。
-
限流(Concurrency Limiting):Hystrix可以对服务调用进行限流,通过设定最大并发数来控制系统的负载,避免过多的请求导致系统资源耗尽。
-
实时监控和统计(Metrics Monitoring):Hystrix提供了实时监控和统计功能,可以收集和展示系统的健康状况和性能指标,如请求的成功率、失败率、响应时间等,帮助开发人员和运维人员及时发现和解决问题。
-
缓存:Hystrix的缓存功能可以实现在同一请求的多次调用中共享结果,从而减少对下游系统的请求次数,提高系统性能。
4. Hystrix的工作机制
客户端发起服务调用,在执行服务调用之前,Hystrix会先检查熔断器的状态,如果是关闭状态,服务调用会正常执行;如果熔断器处于打开状态,服务调用会被快速失败和服务降级,直接返回一个预先定义好的默认响应;
一段时间以后(withCircuitBreakerSleepWindowInMilliseconds=5s),保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,如果这些请求成功返回结果,Hystrix会将电路关闭,恢复到正常状态(Closed)。如果这些请求仍然失败或超时,Hystrix会重新打开电路,继续保持熔断状态。
二、实战
1. 导入依赖
在springcloud-parent
下的springcloud-order-server
子项目导入Hystrix依赖,和Ribbon配合使用;
注意:
可以不用导包,在spring-cloud-starter-netflix-eureka-client包中已经存在:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2. 配置类开启Hystrix
主配置类通过 @EnableCircuitBreaker 标签开启熔断功能,默认开启,可不写:
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //开启Hystrix熔断
public class OrderServerApplication {
//配置一个RestTemplate ,Spring封装的一个Restful风格的http客户端 工具
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main( String[] args ) {
SpringApplication.run(OrderServerApplication.class);
}
}
3. OpenFeign使用Hystrix
通过feign.hystrix.enabled=true
开启Hystrix:
feign:
hystrix:
enabled: true #开启熔断支持
ribbon:
ReadTimeout: 1000 #请求处理的超时时间
SocketTimeout: 1000
ConnectTimeout: 1000 #请求连接的超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000 #hystrix超时,置thread和semaphore两种隔离策略的超时时间
4. Fiegn接口熔断-fallbackFactory方式
在springcloud-pay-server
项目中新建:
UserFeignClient 接口:
//Feign根据服务名能够在注册中心找到目标服务的通信地址
@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFallback.class)
public interface UserFeignClient {
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id")Long id);
}
编写托底类,工程方式的托底类需要去实现 FallbackFactory接口 ,并指定泛型为“”Feign客户端接口(UserFeignClient )。:
@Component
public class UserFeignClientFallback implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable throwable) {
return new UserFeignClient() {
@Override
public User getById(Long id) {
//打印错误信息到控制台
throwable.printStackTrace();
//降级
return new User(-1L,"","系统繁忙,请稍后重试");
}
};
}
}
5. 启动测试
启动 springcloud-eureka-server
、springcloud-user-server
、springcloud-pay-server
; 访问:http://localhost:8761/pay/1
观察浏览器是否正常拿到结果,然后关闭 springcloud-user-server
工程,观察浏览器是否返回托底数据。