最近在优化性能,之前是拿过来就用的,基本上不怎么了解,这篇是记录了在使用时的方法和一些遇到的问题
入门使用
1.引包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.启动类使用注解 @EnableFeignClients
3.创建及实现
fallback
@FeignClient(name="SituationService", url = "",
fallback = VhcCurrentSituationFallback.class)
public interface SituationFeginClient {
@RequestMapping(method = RequestMethod.POST, value = "/getRoutesInfo")
Map<String,Route> queryRoutesInfo(@RequestBody List<String> routeNos);
}
@Component
@Slf4j
class VhcCurrentSituationFallback implements SituationFeginClient{
@Override
public SituationResponse getSituationInfo(List<String> routeNos) {
log.info("调用查询公交信息接口失败!");
SituationResponse data = VhcCurrentSituationResponse.builder()
.routeName("未知")
.busName(busName)
.build();
return data;
}
}
fallbackFactory(使用工厂可以了解调用的错误信息)
@FeignClient(name = "route-resource", url = "${urls.api}/v1/routes",fallbackFactory = RouteServiceFallback.class)
public interface RouteService {
@RequestMapping(method = RequestMethod.POST, value = "/getRoutesInfo")
Map<String,Route> queryRoutesInfo(@RequestBody List<String> routeNos);
}
@Component
@Slf4j
public class RouteServiceFallback implements FallbackFactory<RouteService> {
@Override
public RouteService create(Throwable throwable) {
return new RouteService() {
@Override
public Map<String, Route> queryRoutesInfo(List<String> routeNos) {
log.info("调用getRoutesInfo失败!");
log.info("错误信息={}",throwable.getMessage());
Map<String, Route> routeMap = new HashMap<>();
routeMap.put("K1", toBuildRoute());
routeMap.put("K2", toBuildRoute2());
return routeMap;
}
};
}
toBuildRoute返回的是 Route实体
fallback实现类 需要注册到容器内(使用@Component)
HystrixTargeter.targetWithFallback
方法实现了@FeignClient.fallback
处理逻辑(需要看源码)
注:
1.GetMapping不支持
2. @PathVariable(value = "name") String name
基础配置
超时的配置(默认1s)
原因:
1.在项目中主要是各个系统之间的调用有时间上的延迟,所以配置了超时;还有就是使用熔断时偶尔会出现第一次超时的问题。
feign client 超时配置(未开启熔断时有效,开启熔断后没有作用 ,见例3)
例1:
调用方法4s
feign:
hystrix:
enabled: false
没有超时配置
不会报超时异常
例2
调用的方法4秒
feign:
hystrix:
enabled: false
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
超时异常
调用的方法4秒
feign:
hystrix:
enabled: false
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 7000
不会报超时异常
例3:
调用方法时间4s
验证1:
feign:
hystrix:
enabled: true
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
请求后会抛出timeout
验证2:
feign:
hystrix:
enabled: true
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 7000
请求后会抛出timeout
这个配置不起作用(在网上找得例子,但是应该不是feign-client的配置)
feign:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
熔断没有开启feign的超时配置是可用的,但是熔断开启后feign的超时配置不可用,因为hytrix的默认超时配置生效了,有冲突。
熔断开启的配置
feign:
hystrix:
enabled: true
熔断开启后 hystrix的超时配置(二选一,首选方法2)
方法1
hystrix:
command:
default:
execution:
timeout:
enabled: false
方法2
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
感:用了两天测试超时配置的各种情况,挺浪费时间的;然后还没有看源码,啊,源码的重要性;下一篇应该是对熔断的局部关闭还有主要的性能配置