Hystrix介绍
在分布式系统中,存在大量的服务调用,服务调用组成了一个一个的调用链。如果其中某一个服务出现崩溃,而此时调用链上游累积的请求数量不断增多,最终导致整个链路的服务出现崩溃,这也是“服务雪崩”的一个简要理解。
在这种背景下,Hystrix出现了,Hystrix开源在github,目前已经处于维护状态。下面根据其官方解释,做一个翻译:
在分布式环境中,许多服务依赖关系中的一些不可避免地会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,可以帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止跨服务的级联故障以及提供后备选项来实现控制分布式服务之间的交互,所有这些都提高了系统的整体弹性。
Hystrix使用入门
新建一个测试模块hystrix-learn
,添加相关依赖,其pom文件内容如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath />
</parent>
<groupId>com.luozheng</groupId>
<artifactId>hystrix-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>rent-car-service</module>
<module>user-rent-car-service</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在hystrix-learn
模块中新增两个子模块。rent-car-service
模块作为服务提供者provider,user-rent-car-service
模块作为服务消费者consumer。
rent-car-service模块
首先,新增配置文件,添加相关配置,尤其不要忘了eureka的配置。
然后在启动类上通过注解开启EurekaClient:
最后,新增一个测试接口:
启动服务。
user-rent-car-service模块
由于我们要使用Hystrix,因此在本模块的pom文件中添加相应的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
接下来添加配置文件,需要注意的是我们要在配置中打开hystrix的开关:
在启动类上通过注解打开EurekaClient和FeignClients的配置。
然后新增一个接口类,作为rent-car-service
模块的FeignClient:
在注解@FeignClient
的属性中除了添加provider的应用名称外,还需指定发生熔断时的回调函数所在的类,该类是RentCarFeign
的实现类。当调用远程服务的“/rentCar”请求失败时,就会执行回调方法,执行我们自定义的逻辑。
下面是对应的Hystrix实现类:
添加一个测试接口:
启动服务后,先测试正常的情况:
然后将rent-car-service服务停掉,再次请求:
可以看到此时服务进行了熔断,执行了我们自定义的逻辑。