zoukankan      html  css  js  c++  java
  • Spring Cloud 框架 -- Hystrix 的基本介绍与使用

    基本介绍

    Hystrix 叫做断路器/熔断器。

    微服务系统中,整个系统出错的概率非常高,因为在微服务系统中,涉及到的模块太多了,每一个模块出错,都有可能导致整个服务出错,当所有模块都稳定运行时,整个服务才算稳定运行。

    我们希望在整个系统中,某个模块无法正常工作时,能够通过我们提前配置的一些东西,来使整个系统正常运行,即单个模块出问题,不影响整个系统。

    基本用法

    首先创建一个新的 Spring Boot 模块,然后添加依赖:

    项目创建成功后,添加如下配置,将 Hystrix 注册到 Eureka 上:

    spring.application.name=hystrix
    server.port=3000
    eureka.client.service-url.defaultZone = http://localhost:1111/eureka
    

    然后,再在启动类上添加如下注解,开启断路器,同时提供一个 RestTemplate 实例:

    @SpringBootApplication
    @EnableCircuitBreaker
    public class HystrixApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixApplication.class, args);
        }
    
        // 提供一个RestTemplate 实例
        @Bean
        @LoadBalanced
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    启动类上的注解,也可以使用@SpringCloudApplication代替:

    //@SpringBootApplication
    //@EnableCircuitBreaker
    @SpringCloudApplication
    public class HystrixApplication {
     ....
    }
    

    注解@SpringCloudApplication是一个复合注解,包括如下各种注解:

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    

    即,可以用一个 @SpringCloudApplication 代替上面三个注解。

    这样,Hystrix 配置就完成了。

    接下来提供 Hystrix 的接口:

    @Service
    public class HelloService {
        @Autowired
        RestTemplate restTemplate;
    
        // 在这个方法中,我们将发起一个远程调用,去调用 provider 中提供的 /hello 接口
        // 但是这个调用可能会失败
        // 我们在这个方法上添加 @HystrixCommand, 配置 fallbackMethod 属性
        // 这个属性表示该方法调用失败时的临时替代方法
    
        @HystrixCommand(fallbackMethod = "error")
        public String hello(){
                // 注意,这个服务名一定要大写!!!!
            return restTemplate.getForObject("http://PROVIDER/hello",String.class);
    
        }
    
        /*
        * 注意,这个方法要和 fallbackMethod 一致
        * 方法返回值也要和对应的方法一致
        * @return
        * */
    
        public String error(){
            return "error";
        }
    }
    

    再来一个 HelloController 方法:

    @RestController
    public class HelloController {
        @Autowired
        HelloService helloService;
    
        @GetMapping("/hello")
        public String hello(){
            return helloService.hello();
        }
    }
    

    结果演示

    1、启动注册中心 Eureka

    2、在端口 1113 和 1114 分别启动两个生产者 provider

    3、启动 hystrix (充当消费者角色)

    4、打开 eureka 后台:http://localhost:1111 , 查看各个服务的注册情况:

    5、访问 hystrix :http://localhost:3000/hello :

    不停地刷新,它就会在 11131114两个端口之间切换。

    6、关闭端口为 1114 的 provider,再刷新 http://localhost:3000/hello

    它就会在 1113 端口 和 error 之前切换,最后稳定在 1113 端口。

    解释:当端口号为1114 的 provider 停止服务后,在 eureka 得知这一消息,最后 hystrix 得知这一消息,中间会间隔几秒甚至十几秒钟。而在中间间隔内,hystrix 仍然会去访问 1114 端口,从而就会报错, 为了用户体验,不出现错误页面,就可以利用 @HystrixCommand(fallbackMethod = "error") 自定义一个备用方案,从而在 provider 服务无法访问时 启用备用服务。

    这就是 Hystrix 的服务降级。

    异常处理

    当发起服务调用时,如果不是 provider 的原因导致请求失败,而是 consumer 中本身代码有问题导致的请求失败,这个时候,也会自动进行服务降级,只不过这个时候降级,我们还需要知道是哪里异常了。

    如下所示,如果 hello 方法中,执行时抛出异常,那么一样也会进行服务降级,进入到 error 方法中,在 error 方法中,我们可以获取异常的详细信息:

    public class HelloService {
        @Autowired
        RestTemplate restTemplate;
    
        // 在这个方法中,我们将发起一个远程调用,去调用 provider 中提供的 /hello 接口
        // 但是这个调用可能会失败
        // 我们在这个方法上添加 @HystrixCommand, 配置 fallbackMethod 属性
        // 这个属性表示该方法调用失败时的临时替代方法
    
        // 方法调用失败,临时调用的方法(也称为服务降级)
        @HystrixCommand(fallbackMethod = "error")
        public String hello(){
            int i = 1/0;
            // 调用 Eureka 实例 一定要大写,否则会报错,谨记!!
            return restTemplate.getForObject("http://PROVIDER/hello",String.class);
    
        }
    
        /*
        * 注意,这个方法要和 fallbackMethod 一致
        * 方法返回值也要和对应的方法一致
        * @return
        * */
    
        public String error(Throwable throwable){
            return "error" +throwable.getMessage();
        }
    }
    

    启动 hystrix ,访问:http://localhost:3000/hello, 如下:

    如上图,自动进行了服务降级。

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    不能对同一张表先查询后更新的解决方案
    Maven的一些常用命令
    在sql中使用函数,遇到net.sf.jsqlparser.parser.ParseException异常
    2017年秋季遇到的兼容问题总结
    最近关于css样式重构的一点心得体会
    CSS Modules使用方法
    上传图片获取base64位编码
    移动端自适应莫名其妙撑开高度的问题
    解决ie8下页面刚出现时候的晃动问题
    解决ie8下面placeholder显示问题
  • 原文地址:https://www.cnblogs.com/youcoding/p/13383488.html
Copyright © 2011-2022 走看看