zoukankan      html  css  js  c++  java
  • 断路器hystrix

      分布式系统中不可避免的会出现一些故障,因为服务间错综复杂的依赖关系,有时候一个服务出现问题后,会导致依赖于它的服务出现远程调度的线程受阻,给服务造成压力,当然同样的,祖父级调用者(暂且这么叫吧)当然也会因此受阻,依赖于祖父级调用者的应用也会被阻塞,,,,,这就是所谓的“雪崩”。
      hystrix,一般叫做断路器。它的直译应该是豪猪,一种浑身有刺,碰到危险时可以保护自己的动物,netflix团队将项目取名为hystrix也是这么个用意吧。观察一下,会发现hystrix的监控界面图标就是一个Q版的豪猪。
    --------------------------------------------------------------------------------------------------------------------------------
    hystrix的设计原则:
      1、防止单个服务的故障耗尽整个服务的servlet容器的线程资源。
      2、快速失败机制;如果某个服务出现了故障,则调用该服务的请求走快速失败通道,而不是线程等待。
      3、提供回退方案,在请求发生故障时,提供良好的回退方案。
      4、使用熔断机制,防止扩散到其它服务。
      5、提供熔断器的监控组件hystrix dashboard,可以实时监控熔断器状态。
    工作机制:
      断路器工作流程图如下:
      当一段时间内用户请求失败次数小于阈值的时候,说明服务正常,此时断路器是关闭的;当失败数达到或高于阈值的时候,说明服务出现了问题,此时断路器开启,所有请求执行快速失败,不再执行原业务代码;过一段时间后,原先隔离的服务可能恢复正常了,断路器会尝试进入半打开状态,执行正常业务代码;如果执行的请求失败了,则继续打开,请求走快速失败,若执行的请求成功了,则关闭断路器,执行正常业务代码。
    代码演示:
      1、pom内容:
      只是hystrix断路功能的话,
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
    

      就可以了,如果要查看监控页面,需要额外引入以下两个:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>
    
    2、启用注解:
      相应的,断路器跟监控分别需要注解:@EnableHystrix跟@EnableHystrixDashboard
    3、配置hystrix
      a、对于restTemplate配置:需要在方法上加@HystrixCommand注解,并声明快速失败函数,例如:
    @HystrixCommand(fallbackMethod = "sayError") //fallbackMethod为hystrix开启后执行的快速失败方法
    public PersonVo getPerson(){
        PersonVo personVo = null;
        personVo = restTemplate.getForObject("http://sms-module/sms/getPerson?phoneNumber=17301394307",PersonVo.class);
        return personVo;
    }
    
    public PersonVo sayError(){
        PersonVo vo = new PersonVo();
        vo.setName("lisi");
        return vo;
    }
    

      b、对于feign的配置:需要在@FeignClient注解中声明fallback对应方法所在的类,该类必须实现@FeignClient注解所修饰的接口,例如:

    @FeignClient(name = "sms-module",fallback = FeignHystrix.class)
    public interface FeignSmsClient {
        @RequestMapping(value = "/sms/getPerson")
        PersonVo queryPerson(@RequestParam("phoneNumber") String phoneNumber);
    }
    
      fallback的实现类:  
    @Component  //注意,这个实现类要纳入ioc管理
    public class FeignHystrix implements FeignSmsClient {
        @Override
        public PersonVo queryPerson(String phoneNumber) {
            PersonVo vo = new PersonVo();
            vo.setName("王五");
            return vo;
        }
    }
    
    3、测试
      分别启动eureka-server,sms-module跟我们搭建的hystrix服务,注意,hystrix服务在用feign的时候,要在配置文件注明feign.hystrix.enabled=true,使用feign的时候hystrix默认是关闭的。
      controller代码为:
    @RequestMapping("/demo")
    @RestController
    public class TestClientController {
        @Autowired
        FeignService feignService;
        @Autowired
        TemplateService templateService;
    
        @RequestMapping("/test")
        public PersonVo myGetPerson(){
            ServiceInstance instance = loadBalancerClient.choose("sms-module");
            System.out.println("本次执行的实例是:"+instance.getHost()+":"+instance.getPort());
            PersonVo personVo = templateService.getPerson();
            return personVo;
        }
    
        @RequestMapping("/test2")
        public PersonVo myGetPerson2(){
            PersonVo personVo = null;
            personVo = feignService.queryPerson("15611273879");
            return personVo;
        }
    }
    

      测试resttemplate跟feign正常访问:

      关闭sms-module,两个都因为访问不到资源而被hystrix保护,进入快速失败:

      再次启动sms-module,其它不作任何处理,过一段时间会发现两者又可以继续访问了。
    4、监控配置
      监控可以使用hystrix-dashboard或者turbine,两者的区别是dashboard只能监控单个服务,而turbine可以监控多个(需要在配置文件写监控哪些),可以看做是dashboard的高级版本,是netflix后来才开源的。
      为了对比,分两个服务进行搭建:
      a、需要的依赖:
      turbine所在服务:
    <!--监控相关-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-turbine</artifactId>
    </dependency>
    

      dashboard所在服务只依赖前两个starter

    b、开启注解
      在启动类配置注解@EnableHystrixDashboard跟@EnableTurbine,dashboard所在服务只配置第一个。
      在turbine项目,配置文件配置
    turbine:
      appConfig: feign-demo,turbine-demo   #这里是turbine要监控的服务名列表,逗号隔开,我本地turbine项目的服务名为feign-demo,hystrix项目的服务名为turbine-demo(项目名是从前边的学习一路过来的,这名字在这里比较容易混淆,,,,)
      clusterNameExpression: new String("default")
    

      其它代码共用上边hystrix的测试代码,在dashboard项目中将controller中url映射改为test3跟test4,相应的service方法名加222,启动项目分别访问http://localhost:port/hystrix

      页面三个框,分别填写http://localhost:8081/hystrix.stream、2000、dashboard-env跟http://localhost:8080/turbine.stream、2000、turbine-env,点击monitor stream,
      可能开始页面为空,访问http://localhost:8081/demo/test3、http://localhost:8081/demo/test4跟http://localhost:8080/demo/test、http://localhost:8080/demo/test2后再查看页面

      
      页面中各个监控数据的含义:
      
      很明显8081只显示了自己本服务的两个接口,而8080则显示了两个项目的所有接口,这就是dashboard跟turbine的区别,相比较来说,当然选择turbine了。
    --------------------------------------------------------------------------------------------------------------------------------
      先这样吧,更深的内容以后再补。
     
     

  • 相关阅读:
    我的JAVA之旅(二)初识JAVA
    ORACLE并发处理
    我的JAVA之旅(一)安装配置
    我的JAVA之旅(三) 元素语法
    改变一生的五句话
    InstallShield集成安装MSDE2000最小版本(三) fishout特许授权发布
    IS2009修改XML File 奕婷特许授权发布
    SQL Server中多个表格求出相同列和不同列(答案来自CSDN上SQL专家的回答)
    InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布
    Installshield停止操作系统进程的代码 IS6及以上版本适用
  • 原文地址:https://www.cnblogs.com/nevermorewang/p/9326442.html
Copyright © 2011-2022 走看看