Hystrix简介
- Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。
Hystrix能做什么
- 在通过第三方客户端访问(通常是通过网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制
- 在分布式系统中防止级联失败
- 快速失败(Fail fast)同时能快速恢复
- 提供失败回退(Fallback)和优雅的服务降级机制
- 提供近实时的监控、报警和运维控制手段
Hystrix 设计原则
- 防止单个依赖耗尽容器(例如 Tomcat)内所有用户线程
- 降低系统负载,对无法及时处理的请求快速失败(fail fast)而不是排队
- 提供失败回退,以在必要时让失效对用户透明化
- 使用隔离机制(例如『舱壁』/『泳道』模式,熔断器模式等)降低依赖服务对整个系统的影响
- 针对系统服务的度量、监控和报警,提供优化以满足近实时性的要求
- 在 Hystrix 绝大部分需要动态调整配置并快速部署到所有应用方面,提供优化以满足快速恢复的要求
- 能保护应用不受依赖服务的整个执行过程中失败的影响,而不仅仅是网络请求
Hystrix 使用
1.配置依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2.入口程序上增加@EnableCircuitBreaker注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
public class MicroserviceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceConsumerApplication.class, args);
}
}
3.配置文件配置hystrix默认超时时间,默认即为5000,如无特殊需求不要更改
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
基于Fegin的熔断
1.首先开启对全局Hystrix的支持,旧版中默认是开启,现在的版本则是默认false
- feign.hystrix.enabled = true
2.为feignClient添加fallback
@FeignClient(name = "microservice-provider", fallback = HystrixClientFallback.class)
public interface UserFeignClient {
@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
3.fallback 类要继承feignClient接口,并实现方法。如果feign访问其它微服务失败,则调用fallback 对应的方法返回默认值。
public class HystrixClientFallback implements UserFeignClient {
@Override
public User findById(Long id) {
User user = new User();
user.setId(0L);
return user;
}
}
controller 中实现熔断
- @HystrixCommand 指定融断方法 注意熔断器的方法一定和原方法的名称保持一致
- 下面的isolation表示findByFeginId与 findByIdFallback 在同一线程。不配置表示默认两个方法在不同的线程,其中findByIdFallback在隔离线程。
- findByFeginId方法如果访问失败,则调用fallbackMethod 方法取值
@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
private UserFeignClient userFeignClient;
@HystrixCommand(fallbackMethod = "findByIdFallback",commandProperties = @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"))
@GetMapping("/movief/{id}")
public User findByFeginId(@PathVariable Long id) {
return userFeignClient.findById(id);
}
public User findByIdFallback(Long id) {
User user = new User();
user.setId(6L);
return user;
}
Feign 采用FallbackFactory 实现熔断
1.feignClient
@FeignClient(name = "microservice-provider", fallbackFactory = HystrixClientFactory.class)
public interface UserFeignClient {
@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id); // 两个坑:1. @GetMapping不支持 2. @PathVariable得设置value
@RequestMapping(value = "/user", method = RequestMethod.POST)
public User postUser(@RequestBody User user);
}
2.fallbackFactory实现
- 使用fallbackFactory的好处是可以添加自定义的日志
- create返回的是实现feignClient接口的对象实例,这里简单借用一下上面基于Fegin的熔断的HystrixClientFallback方法
@Component
public class HystrixClientFactory implements FallbackFactory<UserFeignClient> {
private static final Logger LOGGER = LoggerFactory.getLogger(HystrixClientFactory.class);
@Override
public UserFeignClient create(Throwable throwable) {
HystrixClientFactory.LOGGER.info("fallback; reason was: {}", throwable.getMessage());
return new HystrixClientFallback();
}
}
局部关闭Hystrix支持
- Feign 默认支持Hystrix。Feign.Builder: HystrixFeign.Builder
- 关闭Hystrix的支持只需要修改feignClient的配置文件中的feignBuilder配置,如下:
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}
查看Hystrix状态
http://localhost:8032/hystrix.stream 查看Hystrix信息 http://localhost:8032/health 查看监控状态
使用Hystrix DashBoard查看Hystrix信息
- 由于Hystrix返回的信息是文本数据,不容易直观查看,需要进行整理分析。DashBoard就是对Hystrix信息的图形展现工具。
1.新建一个springboot项目
2.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
3.入口程序上增加@EnableHystrixDashboard注解
@EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashBoardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashBoardApplication.class, args);
}
}
4.配置端口
server.port= 8060
-
填写要检测的hystrix: http://localhost:8032/hystrix.stream,展现如下