1. 引入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
feign已经包含了ribbon和hystrix
2. feign调用其它服务
2.1 主feign调用接口
@FeignClient(name = "i5xforyou-biz-auth", fallback=AuthFeignClientHystrix.class)
public interface AuthFeignClient {
/**
* getMiniProgramInfo <br/>
* 获取小程序的基本信息 <br/>
*
* @author Mobile Web Group-lff
* @date 2018年3月22日 上午9:14:44
*
* @param mpId
* @return JsonPackage
*/
@RequestMapping(value = "/auth/miniprogram/info", method = RequestMethod.GET)
public JsonPackage getMiniProgramInfo(@RequestParam("mpId") String mpId);
}
@FeignClient注解:
- name为其它服务的服务名称
- fallback为熔断后的回调
服务间调用方法
- @RequestMapping中要写上其它服务的context-path
比如说i5xforyou-biz-auth的context-path设置如下:
server:
port: 31000
http2:
enabled: true
servlet:
context-path: /auth
请求要加上/auth前缀
- 参数要通过@RequestParam,@PathVariable,@RequestHeader来传递
2.2 熔断后的回调类
@Component
public class AuthFeignClientHystrix extends BaseClass implements AuthFeignClient {
/**
* Description: 获取小程序的基本信息
* @author: Mobile Web Group-lff
* @date: 2018年3月22日 上午9:17:35
*
* @see com.wuuxiang.i5xforyou.feign.AuthFeignClient#getMiniProgramInfo(java.lang.String)
*/
@Override
public JsonPackage getMiniProgramInfo(String mpId) {
log.error("调用i5xforyou-biz-auth的/miniprogram/info接口触发了断路由,入参mpId=" + mpId);
return JsonPackage.getHystrixJsonPackage();
}
}
- 实现主feign调用接口
- @Override对应的方法
2.3 熔断设置
#默认为false,如果想用断路由,要打开这个设置
feign.hystrix.enabled=true
#断路器线程池超时时间,这个值一定要比ribbon超时时间长,毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=16000
如果服务间调用方法超过设定的16000毫秒,就会触发断路由回调方法。
2.4 ribbon超时重试
当一个服务出现异常的时候,服务间调用可能会出现超时。当出现超时的时候,我们希望其重试几次,以提高系统的健壮性。
#重试机制开关,默认false
spring.cloud.loadbalancer.retry.enabled=true
#http建立socket超时时间,毫秒
ribbon.ConnectTimeout=5000
#http读取响应socket超时时间
ribbon.ReadTimeout=5000
#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=0
#重试负载均衡其他的实例最大重试次数,不包括首次server
ribbon.MaxAutoRetriesNextServer=2
#是否所有操作都重试,POST请求注意多次提交错误。
#默认true,设定为false的话,只有get请求会重试
ribbon.OkToRetryOnAllOperations=false
这样设定的话,服务间调用方法如果超过5s没有返回结果,就会重试其它实例,最多重试2个其它实例。也就是最多耗时5*3=15秒。断路由的超时时间要大于这个值。
ribbon.OkToRetryOnAllOperations要设定为false,不然容易出现超时成功,重复提交的问题,造成数据异常。
比如说有一个库存+2的post请求,服务间调用的时候虽然5s超时了,但是在第6秒的处理成功了,由于有ribbon超时重试设置,其会再重试2个其它实例,导致总共调用了3次服务间方法,最终库存被+6,造成数据异常。