1. Hystrix 断路器
- Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败, 比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分 布式系统的弹性;
- "断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方 返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就 保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
1.1 服务熔断
- 熔断机制是应对雪崩效应的一种微服务链路保护机制;
- 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误" 的响应信息;当检测到该节点微服务调用正常后恢复调用链路;
新建microservicecloud-provider-dept-hystrix-8001
1// 参考 microservicecloud-provider-dept-8001 2 3// pom.xml 4<!-- hystrix --> 5<dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-hystrix</artifactId> 8</dependency> 9 10 11// application.yml 12eureka: 13 client: # 客户端注册进eureka服务列表内 14 service-url: 15 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka 16 instance: 17 instance-id: microservicecloud-dept8001-hystrix # 自定义hystrix相关的服务名称信息 18 prefer-ip-address: true # 访问路径可以显示IP地址 19 20 21// 修改DeptController 22@RestController 23public class DeptController { 24 25 @Autowired 26 private DeptService deptService; 27 28 @Autowired 29 private DiscoveryClient client; 30 31 @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET) 32 // 一旦调用服务方法失败并抛出错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法 33 @HystrixCommand(fallbackMethod="processHystrix_Get") 34 public Dept get(@PathVariable("id") Long id) { 35 Dept dept = this.deptService.get(id); 36 if(null == dept) { 37 throw new RuntimeException("该ID:"+id+"没有对应的信息"); 38 } 39 return dept; 40 } 41 42 public Dept processHystrix_Get(@PathVariable("id") Long id) { 43 return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,null -- @HystrixCommand") 44 .setDb_source("no this database in MySQL"); 45 } 46} 47 48 49// 修改主启动类DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker 50@SpringBootApplication 51@EnableEurekaClient // 本服务启动后,自动注册进eureka服务中 52@EnableDiscoveryClient // 服务发现 53@EnableCircuitBreaker // 对Hystrix熔断机制的支持 54public class DeptProvider8001_Hystrix_App { 55 56 public static void main(String[] args) { 57 SpringApplication.run(DeptProvider8001_Hystrix_App.class, args); 58 } 59} 60 61// 测试访问: 62// http://localhost:8082/consumer/dept/get/112

1.2 服务降级
-
服务降级:整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来;
-
服务降级处理是在客户端实现完成的,与服务端没有关系;
-
当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值;
// 修改microservicecloud-api工程 // 根据已有的DeptClientService接口,新建一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory @Component // 不要忘记添加 public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
1@Override 2public DeptClientService create(Throwable arg0) { 3 4 return new DeptClientService() { 5 6 @Override 7 public Dept get(long id) { 8 return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭") 9 .setDb_source("no this database in MySQL"); 10 } 11 12 @Override 13 public List<Dept> list() { 14 15 return null; 16 } 17 18 @Override 19 public boolean add(Dept dept) { 20 21 return false; 22 } 23 }; 24}}
// 修改microservicecloud-api工程, DeptClientService接口 // 在注解@FeignClient中添加 fallbackFactory 属性值 @FeignClient(value="MICROSERVICECLOUD-DEPT", fallbackFactory=DeptClientServiceFallbackFactory.class) public interface DeptClientService {
1@RequestMapping(value="/dept/get/{id}", method= RequestMethod.GET) 2public Dept get(@PathVariable("id") long id); 3 4@RequestMapping(value="/dept/list", method= RequestMethod.GET) 5public List<Dept> list(); 6 7@RequestMapping(value="/dept/add", method= RequestMethod.POST) 8public boolean add(Dept dept);}
// mvn clean // mvn install
// 修改microservicecloud-consumer-dept-feign 工程 // application.yml feign: hystrix: enabled: true
// 测试访问: // http://localhost:8082/consumer/dept/get/1 // 然后手动关闭工程:microservicecloud-provider-dept-8001

1.3 服务监控(hystrixDashboard)
新建工程microservicecloud-consumer-hystrix-dashboard
1// pom.xml 2<!-- hystrix和hystrix-dashboard 相关 --> 3<dependency> 4 <groupId>org.springframework.cloud</groupId> 5 <artifactId>spring-cloud-starter-hystrix</artifactId> 6</dependency> 7<dependency> 8 <groupId>org.springframework.cloud</groupId> 9 <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> 10</dependency> 11 12 13// application.yml 14server: 15 port: 9001 16 17 18// 主启动类: 19@SpringBootApplication 20@EnableHystrixDashboard 21public class DeptConsumer_DashBoard_App { 22 23 public static void main(String[] args) { 24 SpringApplication.run(DeptConsumer_DashBoard_App.class, args); 25 } 26} 27 28 29// 所有Provider微服务提供类(8001/8002/8003)都需要提供监控依赖配置 30// (8001/8002/8003)pom.xml 31<!-- actuator 监控信息完善 --> 32<dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-actuator</artifactId> 35</dependency> 36 37 38// 启动相关工程 39// microservicecloud-consumer-hystrix-dashboard // 访问: http://localhost:9001/hystrix 40// 3个Eureka集群 41// microservicecloud-provider-dept-hystrix-8001 42 // 访问: http://localhost:8001/dept/get/1 43 // 访问: http://localhost:8001/hystrix.stream 44

参考资料: