Hystrix
熔断器
使用到的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.0.RC1</version>
</dependency>
主启动类添加注解
@EnableHystrix
现在只是启动了 Hystrix ,真正使用
方法级别的注解,@HystrixCommand注解,指明熔断处理类 fallbackMethod 参数要一致:
@GetMapping("/find/{id}")
// 一旦调用服务方法失败并抛出错误信息后,会自动调用 @HystrixCommand 标注的 fallbackMethod 指定的方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept get(@PathVariable("id") Long id) {
Dept dept = deptService.findById(id);
if (null == dept) {
throw new RuntimeException("该ID: " + id + " 没有对应的信息");
}
return dept;
}
public Dept processHystrix_Get(@PathVariable("id") Long id) {
return new Dept().setDeptno(id).
setDname("该ID: " + id + " 没有对应的信息, null -- @HystrixCommand").
setDb_source("no this database in MySQL");
}
Feign 中集成了 Hystrix 可以使用类级别的熔断处理,Feign 中集成了 Hystrix 指定服务降级的 key 是 fallbackFactory
@FeignClient(value = "MICROSERVICECLOUD", fallbackFactory = DeptClientServiceFallback.class)
public interface DeptClientService {
@PostMapping("/dept/add")
public boolean add(@RequestBody Dept dept) ;
@GetMapping("/dept/find/{id}")
public Dept get(@PathVariable("id") Long id) ;
@GetMapping("/dept/list")
public List<Dept> list() ;
}
熔断类,实现_FallbackFactory_接口
@Component
public class DeptClientServiceFallback implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public boolean add(Dept dept) {
return false;
}
@Override
public Dept get(Long id) {
return new Dept().setDeptno(id).
setDname("该ID: " + id + " 没有对应的信息, FallbackFactory<DeptClientService>").
setDb_source("no this database in MySQL");
}
@Override
public List<Dept> list() {
return null;
}
};
}
}
服务监控 HystrixDashboard
添加的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId>
</dependency>
主启动类的注解
@EnableHystrixDashboard
被监控的类需要添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置很简单,只要是使用了 Hystrix 的都可以被监控,主要是查看监控信息
注意点:
1. Finchley.RC1 版本的 Spring Cloud 的访问路径类似:http://localhost:8001/actuator/hystrix.stream
需要在端口和 hystrix.stream 中间添加 actuator
2. springcloud 的Finchley.RC1 版本中监默认是关闭的,需要在配置中打开
#暴露全部的监控信息
management:
endpoints:
web:
exposure:
include: "*"
3. 在 spring cloud Finchley.RC1 版本中使用 Hystrix ,需要添加 @EnableHystrix
4.解决无法引如 hystrixdashboard 的问题
先加入如下依赖:
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId>
</dependency>
上面两个依赖配合才引入了dashboard,完成后可以删除上面的改为下面的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>