当一个服务不能使用时,该服务的调用者应该及时收到消息,而不是过一阵才收到服务未响应,这就是Hystrix断路器的作用。Hystrix断路器有两种级别,一种是某一个方法提供断路,另一种是某个接口中的方法全部提供断路。本文将介绍断路器的使用。
1、环境约束
- win10 64为操作系统
- idea2018.1.5
- maven-3.0.5
- jdk-8u162-windows-x64
2、前提约束
- 已经创建好一个注册中心并已启动 https://www.jianshu.com/p/0c4ac4b0c128
假设该注册中心端口为7561 - 已经在注册中心上注册了一个服务 https://www.jianshu.com/p/b730990d1daf
假设已经注册的服务名称为provider-service
3、操作步骤
3.1 方法断路
- 创建一个springcloud项目,包括springweb、eureka client、feign、hystrix模块,关键依赖如下:
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
注意:springboot的版本是2.1.8.RELEASE,springcloud的版本是Greenwich.SR2
- 设置application.properties
server.port=8002
eureka.client.service-url.defaultZone=http://localhost:7561/eureka
spring.application.name=consumer-service
- 在主启动类上面出@SpringBootApplication外加入以下注解:
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
- 在主启动类同级目录下,创建ProviderClient.java
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value="user-service")//此处user-service就是笔者provider的服务名称
public interface ProviderClient {
@GetMapping("/query")//此处/query就是憋着provider中的接口名称
String provider();
}
- 在主启动类同级目录下,创建ConsumerController.java
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ConsumerController {
@Resource
private ProviderClient providerClient;
@GetMapping("/consumer")
@HystrixCommand(fallbackMethod = "handler")
public String consumer() {
//当provider服务挂掉以后,这个方法会进入断路处理
return providerClient.provider();
}
@GetMapping("/consumer1")
public String consumer1() {
//当provider服务挂掉以后,这个方法不会进入断路处理
return providerClient.provider();
}
public String handler() {
return "providerClient中的服务不能访问到,hystrix被触发";
}
}
- 测试
(1)当provider启动成功,访问consumer以及consumer1接口都成正常访问。
(2)当provider没有启动,访问consumer接口将立刻执行handler方法,访问consumer1接口将进入异常。
3.2 接口断路
- 以操作完毕3.1为基础,在主启动类同级目录下创建ProviderClient1.java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value="provider-service",fallbackFactory = HystrixFactory.class)
public interface ProviderClient1 {
@GetMapping("/query")
public String provider();
}
- 在主启动类统计目录下创建ConsumerController1.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ConsumerController1 {
@Resource
private ProviderClient1 providerClient;
@GetMapping("/consumer3")
public String consumer() {
return providerClient.provider();
}
@GetMapping("/consumer4")
public String consumer1() {
return providerClient.provider();
}
}
- 在主启动类同级目录下创建HystrixFactory.java
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class HystrixFactory implements FallbackFactory<ProviderClient1> {
@Override
public ProviderClient create(Throwable throwable) {
return new ProviderClient1() {
@Override
public String provider() {
return "provider-service服务不能访问,hystrix被触发";
}
};
}
}
- 修改application.properties,加入以下内容:
feign.hystrix.enabled=true
- 重启,测试
(1)当provider启动成功,访问consumer3以及consumer4接口都成正常访问。
(2)当provider没有启动,访问consumer4以及consumer4接口都将立刻执行handler方法。
3.3 dashboard
hystrix有一个监控页面,需要借助actuator监控模块实现。
- 以操作完毕3.2为基础,加入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- 修改application.properties,加入以下内容
management.endpoints.web.exposure.include=*
management.endpoints.web.cors.allowed-origins=*
management.endpoints.web.cors.allowed-methods=*
- 重新启动,访问http://localhost:8003/hystrix,便看到以下界面:
hystrix dashboard界面
按图中所示进行操作,点击Monitor Stream,进入以下页面:监控界面
以上就是Hystrix断路器的使用。