Feign调用目标方法总体分为两种方式:直接调用 vs 融合服务治理。
服务治理主要基于两个指标【接口超时、接口异常】保护目标服务,相较于直接调用,Feign主要是在调用目标方法之前增强方式来实现服务治理涉及的降级 & 熔断功能。增强功能主要体现在JDK动态代理核心类InvocationHandler中,默认情况下选择FeignInvocationHandler,服务治理则选择FeignCircuitBreakerInvocationHandler。

1.FeignInvocationHandler
public class ReflectiveFeign extends Feign {
static class FeignInvocationHandler implements InvocationHandler {
// 表示具体的某个Feign客户端
private final Target target;
// 当前Feign客户端中所有目标方法 vs 目标方法对应的MethodHandler之SynchronousMethodHandler
private final Map<Method, MethodHandler> dispatch;
@Override
public Object invoke(Object proxy, Method method, Object[] args){
...
// 通过请求中目标方法在集合属性dispatch中获取对应的SynchronousMethodHandler
return dispatch.get(method).invoke(args);
}
}
Object executeAndDecode(RequestTemplate template, Options options) throws Throwable {
Request request = targetRequest(template);
Response response;
long start = System.nanoTime();
// 利用对应的client 请求真正目标方法
response = client.execute(request, options);
// ensure the request is set. TODO: remove in Feign 12
response = response.toBuilder().request(request).requestTemplate(template).build();
long elapsedTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
CompletableFuture<Object> resultFuture = new CompletableFuture<>();
asyncResponseHandler.handleResponse(resultFuture, metadata.configKey(), response,metadata.returnType(), elapsedTime);
...
}
}
2.FeignCircuitBreakerInvocationHandler
class FeignCircuitBreakerInvocationHandler implements InvocationHandler {
public Object invoke(final Object proxy, final Method method, final Object[] args){
...
String circuitName = circuitBreakerNameResolver.resolveCircuitBreakerName(feignClientName, target, method);
// Resilience4JCircuitBreaker
CircuitBreaker circuitBreaker = circuitBreakerGroupEnabled ? factory.create(circuitName,feignClientName):factory.create(circuitName);
Supplier<Object> supplier = asSupplier(method, args);
if (this.nullableFallbackFactory != null) {// 降级方法作为lambda表达式向下传递
Function<Throwable, Object> fallbackFunction = throwable -> {
Object fallback = this.nullableFallbackFactory.create(throwable);
try {
// 降级回调callback
return this.fallbackMethodMap.get(method).invoke(fallback, args);
}
catch (Exception exception) {
unwrapAndRethrow(exception);
}
return null;
};
return circuitBreaker.run(supplier, fallbackFunction);
}
return circuitBreaker.run(supplier);
}
private Supplier<Object> asSupplier(final Method method, final Object[] args) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
Thread caller = Thread.currentThread();
return () -> {// 初始化Supplier 跟 调用Supplier可能是不同线程
// 判断是否为异步请求
boolean isAsync = caller != Thread.currentThread();
try {
if (isAsync) {
// 如果是异步请求,则将requestAttributes继续向当前请求往下传递
RequestContextHolder.setRequestAttributes(requestAttributes);
}
// 承接默认InvocationHandler执行逻辑
return dispatch.get(method).invoke(args);
}finally {
if (isAsync) {
RequestContextHolder.resetRequestAttributes();
}
}
};
}
}
SpringCloud之Resilience4j熔断器源码解析