系列目录(持续更新。。。)
Spring Cloud之一:注册与发现-Eureka工程的创建
Spring Cloud之二:服务提供者注册到Eureka Server
Spring Cloud之三:Eureka Server添加认证
Spring Cloud之四:使用Feign实现微服务间的交互
目录
Hystrix干什么用的?
Feign中使用Hystrix的降级
1、在IUserFeignClient增加代码
2、在IUserFeignClient增加fallbackFactory参数
3、IUserFeignClient完整代码
4、pom增加阿里云hystrix依赖
5、yml配置文件开启hystrix
6、测试
注意:该篇的实现是基于本系列使用的spring cloud版本,由于spring cloud版本众多,一些yml配置和pom包的引用可能会有所差异。
首先,总结下我们前面构建的项目:
项目 | 端口 | |
eureka-pass |
7200 | 服务发现与注册中心 |
user | 7101 | 微服务:用户模块 |
order | 7102 | 微服务:订单模块 |
基于上面的项目,上篇中我们在订单模块(order)里面使用Feign调用了用户模块(user)里面的接口。
但是,如果用户模块(user)因为某种原因响应慢或者模块服务挂了,导致无法及时响应订单模块(order)的请求,这时候订单模块(order)就会一直等待用户模块(user)的响应(一定时间后可能最终失败),这样就导致程序缓慢。这种情况是致命的,严重的情况可能会造成系统的崩溃。
举个例子:我们要向A模块请求一个接口,A模块请求B模块,B模块请求C模块,如下:
A->B->C
这时候如果C模块无法正常响应B模块,B模块也就无法正常响应A模块,这样也就导致了系统的级联故障。
Hystrix就是为了解决上述问题的一个工具类库,它是一个容错库,用于防止级联故障,从而提升系统的可用性。
Hystrix具备如下功能:
1、防止单个接口异常导致整个微服务故障。
2、快速失败,如果服务出现故障,服务的请求快速失败,线程不会等待。
3、服务降级(FallBack),降级简单说就是“退而求其次”,访问不了,就自己设定一个返回方案,下面主要通过阐述这个功能来带大家入门。
4、熔断机制,防止故障的扩散,导致整个服务瘫痪。
5、服务监控,提供了Hystrix Bashboard仪表盘,实时监控熔断器状态
那么,我们如何整合Hystrix呢?其实,上篇我们使用的Feign本身就已经集成了Hystrix功能。
在上一篇文章中,我们在订单模块(order)集成了Feign,项目机构如下:
通过Feign接口调用异常或超时需要触发降级,有两种方式来实现降级
1、通过 @FeignClient(fallback=…)来指定托底类
2、通过@FeignClient(fallbackFactory=…)来指定托底类
这两种方式的区别在于第1种没办法打印出异常日志的,而第二种是可以打印出异常日志的。推荐使用第2种方式,下面将演示第2种方式的实现(第一种方式在最后的完整代码里,我也会体现)。
class UserFallbackFactory implements FallbackFactory {
private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);
@Override
public IUserFeignClient create(Throwable cause){
return new IUserFeignClient() {
@Override
public String getInfo() {
//记录日记
UserFallbackFactory.LOGGER.error("调用异常:"+cause);
return "我已经挂了";
}
};
}
}
下面的代码是第1、2步骤后,IUserFeignClient文件的最终代码
package cn.laocheng.user.feignClient;
import cn.laocheng.user.model.TestModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
fallback方式
//@FeignClient(name="user",fallback = UserFallback.class)
//fallbackFactory方式
@FeignClient(name="user",fallbackFactory = UserFallbackFactory.class)
public interface IUserFeignClient {
/**
* feign调用无参数的Get请求
* @return
*/
@RequestMapping(value = "/getInfo",method = RequestMethod.GET)
public String getInfo();
}
//@Component
//class UserFallback implements IUserFeignClient{
// public String getInfo() {
//
// return "我已经挂了";
// }
//}
@Component
class UserFallbackFactory implements FallbackFactory {
private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);
@Override
public IUserFeignClient create(Throwable cause){
return new IUserFeignClient() {
@Override
public String getInfo() {
//记录日记
UserFallbackFactory.LOGGER.error("调用异常:"+cause);
return "我已经挂了";
}
};
}
}
我们这里使用的是阿里云hystrix,所以要增加下面的依赖
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.2.6.RELEASE
feign: circuitbreaker: enabled: true
依次启动下列三个项目
项目 | 端口 | |
eureka-pass |
7200 | 服务发现与注册中心 |
user | 7101 | 微服务:用户模块 |
order | 7102 | 微服务:订单模块 |
访问:http://localhost:7101/getInfo
浏览器显示:
这个其实在上篇已经演示过。
停止user模块
重新访问:http://localhost:7101/getInfo
浏览器显示