Hystrix的几种模式的使用
通常我们在进行远程服务调用的时候,为了让某些服务发生了错误或者表现不佳的时候,能够不影响到另外的一些服务,引入了一个所谓的
“所谓的客户端弹性模式”,这个模式的目的就是为了让客户端能够快速的失败,而不消耗诸如线程池或者数据库之类的资源,,并且可以
防止远程服务的问题在服务与服务之间传播,导致批量服务挂掉
客户端弹性模式有这样几种:
- 客户端负载均衡(client load balance):
将服务端的服务实例(集群)的物理位置物理位置缓存在客户端,当服务消费者需要调用该服务的时候,负载均衡器就会从它维护的服务实例(集群)中返回一个给客户端调用,这种模式就是Ribbon提供的功能,其它三种都是Hystrix提供的功能 - 断路器模式(circuit breaker):
确保服务客户端不会重复调用失败的服务 - 后备模式( fallback):
当服务调用失败的时候,后备模式询问是否有可执行的方案 - 舱壁模式(bulkhead):
隔离服务客户端上不同的服务调用,以确保表现不佳的服务不会耗尽客户端所有资源
后面三种客户弹性模式都是Hystrix能够实现的
首先说说自己的环境,使用的是spring-boot 和spring -cloud-hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
如果我们想让Hystrix生效,需要将@EnableCircuitBreaker或者@EnableHystrix 加入到引导类上,是Hystrix能够生效
- 断路器模式
其实断路器模式超级简单,原理就是 当我们调用服务超过指定时间,那么就将该服务断开,避免异常会在其他服务之间蔓延,导致其他服务不可用
简单测试代码如下
@GetMapping ("/circuit")
@HystrixCommand
public String circuit(@RequestParam int num,@RequestParam long sleepTime) {
// 这个工具类,就是让想成sleep指定的的时间,然后返回一个RandomNum
int runLong = TimeOutUtils.randomlyRunLong(num, sleepTime)