SpringCloud Hystrix
⒈Hystrix是什么?
Hystrix使一个用于处理分布式系统的延迟和容错的开源库。在分布式系统里,许多依赖不可避免的因服务超时、服务异常等导致调用失败,Hystrix能够保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
⒉断路器&服务熔断
“断路器”本身使一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似于熔断保险丝),向服务调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息,当检测到该节点的微服务调用响应正常后恢复调用链路。在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用达到一定的阈值(默认是5秒内20次调用失败),就会启动熔断机制。
⒊示例
①在服务提供者项目中添加Hystrix starter依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework.cloud</groupId> 11 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 12 </dependency>
②在服务提供者项目中对控制器中的Action方法指定熔断调用方法
1 package cn.coreqi.controller; 2 3 import cn.coreqi.entities.User; 4 import cn.coreqi.service.UserService; 5 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.RestController; 9 import java.util.List; 10 11 @RestController 12 public class UserController { 13 @Autowired 14 private UserService userService; 15 16 @GetMapping("/users") 17 @HystrixCommand(fallbackMethod = "getUsersFallback") //一旦服务消费者远程调用该方法失败并抛出错误信息后,Hystrix会自动调用@HystrixCommand注解fallbackMethod属性中标注的方法返回 18 public List<User> getUsers(){ 19 throw new NullPointerException(); 20 //return userService.getList(); 21 } 22 23 public List<User> getUsersFallback(){ 24 return null; 25 } 26 }
③在主程序启动类上添加@EnableCircuitBreaker注解
1 package cn.coreqi; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; 6 import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 7 8 @SpringBootApplication 9 @EnableEurekaClient //启用Eureka客户端功能 10 @EnableCircuitBreaker //对Hystrix熔断机制的支持 11 public class SpringbootcloudserviceproviderApplication { 12 13 public static void main(String[] args) { 14 SpringApplication.run(SpringbootcloudserviceproviderApplication.class, args); 15 } 16 17 }
⒋服务降级
服务器整体资源快不够了,将某些服务先关掉,待渡过难关再开启回来,服务降级处理是在服务消费者实现完成的,与服务提供者没有关系
⒌示例
①在服务消费者配置文件中开启
1 feign.hystrix.enabled=true
②编写回退方法
1 package cn.coreqi.fallbackfactory; 2 3 import cn.coreqi.entities.User; 4 import cn.coreqi.service.UserService; 5 import feign.hystrix.FallbackFactory; 6 import org.springframework.stereotype.Component; 7 8 import java.util.ArrayList; 9 import java.util.List; 10 11 @Component 12 public class UserServiceFallbackFactory implements FallbackFactory<UserService> { 13 @Override 14 public UserService create(Throwable throwable) { 15 return new UserService() { 16 @Override 17 public void addUser(User user) { 18 19 } 20 21 @Override 22 public void delById(Integer id) { 23 24 } 25 26 @Override 27 public void modifyUser(User user) { 28 29 } 30 31 @Override 32 public User getById(Integer id) { 33 return null; 34 } 35 36 @Override 37 public List<User> getList() { 38 List<User> userList = new ArrayList<>(); 39 userList.add(new User(0,"Error","Error",0)); 40 return userList; 41 } 42 }; 43 } 44 }
③在@FeignClient注解中指定fallbackFactory的属性值
1 package cn.coreqi.feign; 2 3 import cn.coreqi.entities.User; 4 import cn.coreqi.fallbackfactory.UserServiceFallbackFactory; 5 import org.springframework.cloud.openfeign.FeignClient; 6 import org.springframework.web.bind.annotation.GetMapping; 7 8 import java.util.List; 9 10 @FeignClient(value = "USER-PROVIDER",fallbackFactory = UserServiceFallbackFactory.class) //指定微服务实例名称 11 public interface UserFeignClient { 12 @GetMapping("/users") //指定调用微服务的服务地址 13 public List<User> getList(); 14 }
⒍服务监控-Hystrix Dashboard
Hystrix提供了准实时的调用监控(Hystrix Dashboard),Hystrix 会持续的记录所有通过Hystrix 发起请求的执行信息,并以统计报表和图形的形式展示给用户,Netfilx通过hystrix-metrics-event-stream项目实现了对以上指标的监控,Spring Cloud也提供了对Hystrix Dashboard的整合,对监控内容转化为可视化界面。
7示例
①新建监控项目添加依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework.cloud</groupId> 11 <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> 12 </dependency>
②配置文件中指定运行端口
1 server.port=9001
③主程序启动类添加@EnableHystrixDashboard注解
1 package cn.coreqi; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; 6 7 @SpringBootApplication 8 @EnableHystrixDashboard 9 public class HystrixDashboardApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(HystrixDashboardApplication.class, args); 13 } 14 15 }
④对所有需要监控的服务提供者项目添加以下依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-actuator</artifactId> 4 </dependency>
⑤访问监控项目web管理地址
http://localhost:9001/hystrix