Hystrix熔断器
扇出(级联调用)
分布式系统面临的问题
雪崩的解决方案
- 超时机制
- 断路器模式
Hystrix服务熔断
- 作用
- 服务的熔断
- 服务降级
- 服务限流
- 近实时监控
- 所解决的问题
- 是Netflix开源的一个延迟和容错库
- 用于隔离访问远程服务、第三方库
- 防止出现级联失败
服务熔断
1.使用的注解是:@HystrixCommand
2.应对雪崩的一种链路保护机制,一般存在服务端
3.当出现故障时会进行服务降级,进而熔断该节点的服务
4.默认缺省阀值是5秒失败20此
服务降级工作原理叙述(线程隔离,服务降级)
为每个服务都分配一个线程池,线程池已满的时候,后续的请求将会被直接拒绝,
虽然会返回一个错误信息,但不会使服务阻塞产生雪崩
- 触发条件
- 代码报错
- 超时
服务降级代码实现
-
导入依赖,向消费方导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
消费者的启动类上添加注解
@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public class ConsumerApplication { // ... } //以上三个注解可以使用一个@springCloudApplication代替
-
编写降级方法
@RestController @RequestMapping(value = "feign") public class FeignController { @Autowired private UserFeign userFeign; @GetMapping("{userName}") @HystrixCommand(fallbackMethod = "findByUserNameFallBack") public User findByUserName(@PathVariable("userName") String userName){ return userFeign.findByUserName(userName); } //降级方法 public User findByUserNameFallBack(String userName){ User user = new User(); user.setName("-1"); user.setNickName("暂停服务"); return user; } }
-
消费端yml文件的超时时间设置,同样会触发降级
hystrix: command: default: execution.isolation.thread.timeoutInMilliseconds: 2000 # 超时时间,如果超过这个时间将会触发降级,一般这个时间要大于等于ribbon的连接超时时间和通信处理时间
服务熔断工作原理
1.初始断路器处于closed状态
2.至少20次的请求成功率低于50%,触发断路器
3.断路器处于open状态,此时所有请求不可访问
4.5秒后断路器打开部分服务
5.监测部分服务短时间内的成功率是否大于50%
6.大于50%-->将断路器再次关闭,小于50%-->将断路器再次打开
服务熔断代码实现
- 基于上一个代码实践完成,模拟异常,在user服务内,加入一个判断条件,如果为true则抛出异常
@GetMapping("/{userName}") public User findByUserName(@PathVariable("userName") String userName){ if (userName.equals("error")){ throw new RuntimeException("出现异常啦!"); } return userService.findByUserName(userName); }
- 在消费端yml文件中对熔断阀值进行配置
hystrix: command: default: execution.isolation.thread.timeoutInMilliseconds: 2000 circuitBreaker: errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50% sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒 requestVolumeThreshold: 10 # 触发熔断的最小请求次数,默认20
- 重启服务,准备两个访问连接
http://localhost:8000/feign/zhangsan //必定成功 http://localhost:8000/feign/error //必定失败
- 检查,如果短时间内,失败率大于50%,则触发熔断器,此时正常的访问也会失败,等待10秒后,正常的访问将恢复正常