1、开启配置
feign 默认是支持hystrix的,它没有默认打开。需要在配置文件中配置打开它,在配置文件加以下代码:
feign:
hystrix:
enabled: true
#开启feign当中的hystrix
如果是ribbon需要添加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
feign就自带了,不需要麻烦了
2、超时设置
default:是默认的全局的超时时间
前面我们asset微服务里面调用user微服务,参考微服务feign调用,写了一个接口,这个可以为dms-user单独配置一个超时时间
feign:
hystrix:
#开启feign当中的hystrix
enabled: true
client:
config:
default:
#不设置connectTimeout会导致readTimeout设置不生效
#超时时间默认为1s
#建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
connectTimeout: 3000
# 指建立连接后从服务端读取到可用资源所用的时间
readTimeout: 6000
dms-user:
connectTimeout: 3000
readTimeout: 6000
超时时间如何配置,我个人认为
- 不要配置太大,一般是压测90%的3倍就足够了,有人设置个60s,200s,拖累自己,不如早早释放掉
- 要将慢操作的接口和正常接口分开,比如ocr,上传,第三方接口调用,这些接口要单独组建微服务
3、降级配置
在原来的FeignClient接口里面添加一个fallback,这个方法是实现本接口即可
package cn.dms.service.feignClient;
import cn.dms.service.hystric.UserServiceHystric;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "dms-user",fallback = UserServiceHystric.class)
public interface UserService {
@RequestMapping(value = "/user/private/findUser",method = RequestMethod.GET)
String findUser(@RequestParam(value = "name") String name);
}
package cn.dms.service.hystric;
import cn.dms.service.feignClient.UserService;
import org.springframework.stereotype.Component;
@Component
public class UserServiceHystric implements UserService {
@Override
public String findUser(String name) {
return "对不起:"+name;
}
}
我们尝试把user的2个服务都干掉,看看他返回什么?
原本起了2个user服务,分别端口为:28082,28083
杀掉28082,之后,范围,得到结果是
对不起
28083
对不起
28083
。。。。
28083
28083
在短时间内,还是给28082分配了请求,时间长了一点,就全去28083了
看起来我的停机比较暴力,直接kill -9 不太优雅,需要学习优雅停机的方法
再把28083也杀掉
对不起
对不起
对不起
这就直接降级了
4、限流
限流的目的是为了保护系统不被大量请求冲垮,通过限制请求的速度来保护系统。
在电商的秒杀活动中,限流是必不可少的一个环节。
限制高并发,请求进行排队,一秒处理N个请求,有序的进行。
Hystrix的资源隔离策略有信号量(SEMAPHORE) 和线程池(THREAD)