Spring Cloud 应用篇 之 Hystrix 的基本使用





在微服务架构中,我们会将系统根据业务垂直拆分为很多服务,各个服务之间通过注册与订阅的方式相互依赖。但是由于网络出现不稳定或自身服务出现异常,导致调用故障或延迟,此时若并发量很大,可能会导致服务崩溃。断路器 Hystrix 就是解决此问题的。

(一)简介

Spring Cloud Hystrix 是基于 Netflix 的开源框架 Hystrix 实现的,它具有断路器、线路隔离等一系列服务保护功能。Hystrix 具备服务降级、服务熔断、请求缓存、请求合并以及服务监控等强大功能。

(二)基于 Ribbon 使用 Hystrix

1. 仍然是基于上一篇的工程,启动 eureka-service,spring-demo-service 

2. 修改 spring-demo-service-ribbon 的 pom 文件,添加 Hystrix 的依赖:


      
      
      
      
  1. <dependency>
  2. <groupId>org.springframework.cloud groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix artifactId>
  4. dependency>

修改启动类,添加 @EnableHystrix 注解开启 Hystrix 功能


      
      
      
      
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableHystrix
  4. public class ServiceRibbonApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceRibbonApplication.class, args);
  7. }
  8. @Bean
  9. @LoadBalanced
  10. RestTemplate restTemplate() {
  11. return new RestTemplate();
  12. }
  13. @Bean
  14. public IRule ribbonRule() {
  15. return new RandomRule(); //这里配置策略,和配置文件对应
  16. }
  17. }

修改 SpringDemoRibbonService


      
      
      
      
  1. @Service
  2. public class SpringDemoRibbonService {
  3. @Autowired
  4. RestTemplate restTemplate;
  5. @Autowired
  6. LoadBalancerClient loadBalancerClient;
  7. @HystrixCommand(fallbackMethod = "portFallback")
  8. public String port() {
  9. this.loadBalancerClient.choose( "spring-demo-service"); //随机访问策略
  10. return restTemplate.getForObject( "http://SPRING-DEMO-SERVICE/port", String.class);
  11. }
  12. public String portFallback() {
  13. return "sorry ribbon, it's error!";
  14. }
  15. }

在 port 方法上加上 @HystrixCommand 注解,对此方法开启熔断器功能,用 fallbackMethod 属性指定熔断回调方法。

启动 spring-demo-service-ribbon,访问 localhost:8381/hello,浏览器会正常显示:


关闭 spring-demo-service,再次访问 localhost:8381/hello,浏览器显示:

Spring Cloud 应用篇 之 Hystrix 的基本使用_第1张图片

即是熔断方法 portFallback 输出的一串字符。说明 spring-demo-service 出现异常或不可用时,spring-demo-service-ribbon 调用其接口失败,会直接调用熔断方法返回,而不会等待超时响应。

(三)基于 Feign 使用 Hystrix

Feign 自带熔断器功能,但是在 Dalston 版本之后,其默认是关闭的,需要手动打开。

1. 修改 spring-demo-service-feign 的 pom 文件,添加依赖


      
      
      
      
  1. <dependency>
  2. <groupId>org.springframework.cloud groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix artifactId>
  4. dependency>

2. 修改配置文件,添加下面的配置,打开 Feign 的熔断功能


      
      
      
      
  1. feign:
  2. hystrix:
  3. enabled: true

3. 修改 SpringDemoFeignService 接口,在 @FeignClient 注解中加入 fallback 即可。


      
      
      
      
  1. @FeignClient(value = "spring-demo-service", fallback = ErrorHystrix.class)
  2. public interface SpringDemoFeignService {
  3. @RequestMapping(value = "port", method = RequestMethod.GET)
  4. String hello();
  5. }

4. 创建上一步指定的 ErrorHystrix 类,实现 SpringDemoFeignService 接口,注入容器中


      
      
      
      
  1. @Component
  2. public class ErrorHystrix implements SpringDemoFeignService {
  3. @Override
  4. public String hello() {
  5. return "sorry, it's error!";
  6. }
  7. }

5. 启动 spring-demo-service-feign

浏览器访问 localhost:8382/hello,当 spring-demo-service 正常启动的时候,浏览器访问即正常显示调用,当 spring-demo-service 关闭或者出现异常的时候,浏览器会显示 fallback 指定类里的方法的返回值。截图这里就不贴了。

源码下载:https://github.com/shmilyah/spring-cloud-componets

转载自:https://blog.csdn.net/hubo_88/article/details/80578457




你可能感兴趣的:(springcloud)