基本介绍
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
:
不停地刷新,它就会在 1113
和1114
两个端口之间切换。
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
, 如下:
如上图,自动进行了服务降级。
每天学习一点点,每天进步一点点。