前言:
在复杂分布式架构体系中,应用程序往往会有数十个依赖关系,而每个依赖关系在某些时候将不可避免的失败,造成当前服务不可用,而在高并发的环境下,当服务挂掉后,服务消费者依然在请求服务,这就会走造成当前服务的瘫痪,即便被重试唤醒,但面临堆积起来的大量服务请求,服务提供者会再次挂掉,这就是服务雪崩
服务雪崩~~>熔断机制
Hystrix是什么
是一个对微服务架构中的异常进行处理一个中间件,如服务雪崩;提高了分布是系统的容错性,不会因为某些服务模块的挂掉而影响整个系统的正常运行
Hystrix作用
- 基于命令模式的请求:解耦了请求者和接受者,使得发送出去的命令可以排队、异步执行。
- 资源隔离:用ConcurrentHashMap绑定commandKey和线程池,当某个功能运行不稳定或有问题时,服务的其他部分不受影响。服务恢复比较快。
- 熔断和服务降级:用ConcurrentHashMap绑定commandKey和HystrixCircuitBreaker类(断路器类),统计每次请求的结果并记录,根据结果判断是否开启断路器,自定义异常返回结果实现熔断降级。
一,服务熔断
@EnableCircuitBreaker 开启断路器,属于hystrix的包
1.导入依赖
<!--Hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.6.RELEASE</version> </dependency>
2.服务提供者controller层方法处加服务熔断注解,本质给方法加备选方案(当服务挂了,备选方案被调用)
@HystrixCommand(fallbackMethod = "备选方案方法名")
//提供Restful服务 @RestController public class DeptController { @Autowired private DeptService deptService; @GetMapping("/dept/get/{id}") @HystrixCommand(fallbackMethod = "hystrixGet") public Dept get(@PathVariable("id") Long id){ Dept dept = deptService.queryById(id); if(dept == null){ throw new RuntimeException("id=>"+id+"不存在该用户,或者信息无法找到~"); } return dept; } //熔断版的(本质,备选方法) public Dept hystrixGet(@PathVariable("id") Long id) { return new Dept() .setDeptno(id) .setDname("id=>"+id+"不存在该用户,或者信息无法找到~") .setDb_source("no this datasource in MySQL"); } }View Code
3.主启动类开启熔断器
@EnableCircuitBreaker //开启断路器,属于hystrix的包
@SpringBootApplication @EnableDiscoveryClient //服务发现,企业级协同开发 @EnableEurekaClient //开启eureka客户端,在服务启动后自动注册到指定的EurekaServer中 @EnableCircuitBreaker //开启断路器,属于hystrix的包 public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }View Code