一、前期准备
先创建一个注册中心,一个消费者服务,一个生产者服务,由于之前写过,这里不多写了,请参考前面的博文。
使用springCloud构建微服务实战:https://blog.csdn.net/jiankang66/article/details/90084845
二、本篇主题
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提高系统的可用性和容错性。spring Cloud默认为Feign整合了Hystrix,在下面的操作中,不需要引入依赖了,前面已经引入过了Feign,在上篇的基础上接着操作。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
重点:Feign已经为我们集成了Hystrix,经过查证,原来feign集成hystrix需要配置开启,如果不开启,会报错,不会去回退页面的。
在配置文件application.properties中添加:
(1)因为不知道feign集成hystrix需要配置开启,我花费了三四个小时找bug,一直不能在服务失败后,回退页面并打印日志。
feign.hystrix.enabled=true
1、创建一个Feign接口SchedualServiceHi,并添加@FeignClient注解
(1)注解中的name值是我们调用的其他应用名。该应用名中必须有该类中地址的映射,否则会调用出错。
(2)fallbackFactory的值是调用出错时会去调用的方法。
@FeignClient(name= "myprovider",fallbackFactory = FeignClientFallbackFactory.class) public interface SchedualServiceHi { @RequestMapping("/index") String aa(); @RequestMapping("/bb") public boolean mmm(@RequestParam("name") String name, @RequestParam("pwd") String pwd); }
2、调用出错的类如下,消费者在调用提供者的方法出错时会返回调用这个类对应的方法,同时打印日志。
(1)该类需要实现FallbackFactory接口,并重写方法。
(2)接口的泛型为上面的Feign接口SchedualServiceHi。
(3)声明了打印日志的print属性,日志放在各个fallback方法中,不要直接放在create方法中。
(4)类上添加@component注解。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component public class FeignClientFallbackFactory implements FallbackFactory<SchedualServiceHi> { // 打印日志 private static final Logger print= LoggerFactory.getLogger(FeignClientFallbackFactory.class); @Override public SchedualServiceHi create(Throwable throwable) { return new SchedualServiceHi() { @Override public String mm() { print.info("fallback; reason was:",throwable); return "服务报错了"; } }; } }
三、测试结果
1、将注册中心,生产者,消费者运行,请求消费者的mindex地址,此时能够正确跳转。
2、当把provider关闭后,再次访问,页面会返回服务报错了,同时会打印错误原因日志如下:
(1)意思:客户服务异常,加载没有可用的myprovider服务,为客户端。
四、总结
以上,我们使用Hystrix实现了微服务的容错,同时发生回退时,打印出来错误日志。