• springcloud-断路器hystrix


    Netflix的创造了一个调用的库 Hystrix 实现了断路器在微服务架构中,通常有多层服务调用。

    底层服务出现故障可能导致用户级联故障。当调用特定服务达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通话。在开路的情况下,可以使用备用的方法进行处理。如下图:

     当服务B挂掉或者访问超时后,调用Fallback

    1、pom依赖:

         <dependency>
                <!-- hystrix 断路器 -->
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.7</version>
            </dependency>

    注意:一定要加上commons-lang3的依赖,不然在访问的时候,会报找不到 org.apache.commons.lang3.Validate 类的异常

    2、入口加上@EnableCircuitBreaker注解,启动断路器

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker //开启断路器
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    
    }

    3、使用RestTemplate调用远程服务

    @RestController
    public class IndexController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/find/{id}")
        public UserEntity findById(@PathVariable Long id) {
            return restTemplate.getForObject("http://service-provider/find/" + id, UserEntity.class);
        }
    
        /**
         * 测试hystrix
         * 
         * 1、调用远程服务超时后,断路器打开,调用getOneFallBack (如果远程服务挂了,会立马调用getOneFallBack,超时时间不起作用)
         * 2、超时时间为2000毫秒(默认1秒)
         */
        @GetMapping("/getOne/{id}")
        @HystrixCommand(fallbackMethod = "getOneFallBack", commandProperties = {
                @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") })
        public UserEntity getOne(@PathVariable Long id) {
            UserEntity user = restTemplate.getForObject("http://service-provider/find/" + id, UserEntity.class);
            return user;
        }
    
        /**
         * 参数跟返回类型必须跟上面的一样,不然会报找不到该方法的错
         */
        public UserEntity getOneFallBack(Long id) {
            UserEntity user = new UserEntity();
            user.setId("1000");
            user.setAge(12);
            return user;
        }
    
    }

    @HystrixCommand由名为“javanica”的Netflix contrib库提供 。Spring Cloud在连接到Hystrix断路器的代理中使用该注释自动包装Spring bean。断路器计算何时打开和关闭电路,以及在发生故障时应该做什么。该注解属性较多,下面讲解常用的几个:

      1、fallbackMethod 降级方法

       2、commandProperties 普通配置属性,可以配置HystrixCommand对应属性,例如采用线程池还是信号量隔离、熔断器熔断规则等等

     对于hystrix的配置,也可以在yml文件中配置。如:

    hystrix:
      command:
        default:
          execution:
            timeout:
              enabled: true #是否开启超时(默认开启)
            isolation:
              thread:
                timeoutInMilliseconds: 5000 #超时时间(默认1000毫秒)

    测试结果:

      1、service-provider正常时,返回结果正常

      2、service-provider挂掉时,立马调用降级方法 getOneFallBack

      3、service-provider的rest服务设个断点,即调用远程服务超过设置的超时时间(先读commanProperties,没配置再读yml文件配置)后,开始 调用getOneFallBack

    Hystrix仪表板

    只要启用了hystrix功能,就会暴露一个端点hystrix.stream 。访问 http://localhost:18082/hystrix.stream 可以查看详细的数据

    注:这个页面会实时不断输出新的内容(如果有的话),首次访问的话,会看到一直ping...,但是没有任何内容,说明这时服务对应的方法没人调用,可以访问getOne方法后,再来看这个页面。

    显然,一堆密密麻麻的文字,没有人会喜欢看,spring-cloud早就想到这一点了,提供了一个hystrix-dashboard的功能,可以用图形化的界面来解读这些数据。

    具体做法:

    1、增加pom依赖:

         <dependency>
                <!-- hystrix-dashboard 断路器仪表板 -->
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            </dependency>

    2、在入口开启仪表板

    3、启动成功后,访问 http://localhost:18082/hystrix,出现仪表板首页:

    4、配置好后,点击 Monitor Stream按钮,出现监控数据:

    每个指标的含义如下图:

  • 相关阅读:
    机器学习与深度学习资料
    JVM调优实战
    Spark on Yarn下JVM的OOM问题及解决方式
    Centos环境下部署游戏服务器-简介
    新华网,要厚道
    物联网操作系统在运营商领域推广的理论分析
    Android基础之Activity launchMode详解
    《高效程序员的修炼》读后感
    Java科普之算法剖析
    Java科普之基础知识回顾
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/9345635.html
Copyright © 2020-2023  润新知