• Spring Cloud断路器Hystrix


      在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器模式。

    什么是断路器

      断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。

      在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

    Netflix Hystrix

      在Spring Cloud中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

      接下来我们就以一个简单的例子,介绍一下Spring cloud Hystrix的使用

      首先在工程中添加spring cloud hystrix的依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

      在工程的启动类中加入@EnableCircuitBreaker开启熔断器功能

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public class Application {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
        public static void main(String[] args){
            SpringApplication.run(Application.class,args);
        }
    }

      这里也可以使用SpringCloud对应的@SpringCloudApplication注解来修饰启动类,从代码可以看到,该注解包含了其他的三个注解,也就以为着一个标准的SpringCloud程序包含着服务发现和熔断机制。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public @interface SpringCloudApplication {
    }

      新增ComputeService类,在使用ribbon消费服务的函数上增加@HystrixCommand注解来指定回调方法

    @Service
    public class ComputeService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "addServiceFallback")
        public String addService(){
            return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
        }
    
        public String addServiceFallback() {
            return "error";
        }
    }

      提供rest接口的Controller改为调用ComputeService的addService

    @RestController
    public class ConsumerController {
    
        @Autowired
        private ComputeService computeService;
    
        @RequestMapping(value = "/add", method = RequestMethod.GET)
        public String add() {
            return computeService.addService();
        }
    
    }

      验证断路器的回调

    Feign使用Hystrix

      注意这里说的是“使用”,没有错,我们不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix,我们可以在未做任何改造前,尝试下面你的操作:

    • 依次启动eureka-server、compute-service、eureka-feign工程
    • 访问http://localhost:1111/可以看到注册中心的状态
    • 访问http://localhost:3333/add,调用eureka-feign的服务,该服务会去调用compute-service的服务,计算出10+20的值,页面显示30
    • 关闭compute-service服务,访问http://localhost:3333/add,我们获得了下面的报错信息
    Whitelabel Error Page
    
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    
    Sat Jun 25 22:10:05 CST 2016
    There was an unexpected error (type=Internal Server Error, status=500).
    add timed-out and no fallback available.

      如果您够仔细,会发现与在ribbon中的报错是不同的,看到add timed-out and no fallback available这句,或许您已经猜到什么,看看我们的控制台,可以看到报错信息来自hystrix-core-1.5.2.jar,所以在这个工程中,我们要学习的就是如何使用Feign中集成的Hystrix。

      使用@FeignClient注解中的fallback属性指定回调类

    @FeignClient(value = "compute-service", fallback = ComputeClientHystrix.class)
    public interface ComputeClient {
    
        @RequestMapping(method = RequestMethod.GET, value = "/add")
        Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
    
    }  

      创建回调类ComputeClientHystrix,实现@FeignClient的接口,此时实现的方法就是对应@FeignClient接口中映射的fallback函数。

    @Component
    public class ComputeClientHystrix implements ComputeClient {
    
        @Override
        public Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b) {
            return -9999;
        }
    
    }

      再用之前的方法验证一下,是否在compute-service服务不可用的情况下,页面返回了-9999。

      

  • 相关阅读:
    Chapter 4
    Chapter 3
    chapter 2
    Python编程指南 chapter 1
    BASE64 编码和解码
    生成 PDF 全攻略【2】在已有PDF上添加内容
    IDEA 和 Eclipse 使用对比
    web 前端常用组件【06】Upload 控件
    聊聊 Web 项目二维码生成的最佳姿势
    依附大系统 【数据实时获取】解决方案
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8682345.html
Copyright © 2020-2023  润新知