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

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

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

posted @ 2020-08-08 13:27  爱吃西瓜的番茄酱  阅读(351)  评论(0编辑  收藏  举报