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, 如下:

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

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

  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/youcoding/p/13383488.html
Copyright © 2011-2022 走看看