fegin 调用逻辑
restTemplate=>ClientHttpRequest=>AbstractBufferingClientHttpRequest=>InterceptingClientHttpRequest
=>ClientHttpRequestInterceptor=>LoadBalancerInterceptor=>BlockingLoadBalancerClient
RestTemplate
restemplate 默认绑定
SimpleClientHttpRequestFactory
实际调用
public class BlockingLoadBalancerClient implements LoadBalancerClient
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
String hint = this.getHint(serviceId);
LoadBalancerRequestAdapter<T, DefaultRequestContext> lbRequest = new LoadBalancerRequestAdapter(request, new DefaultRequestContext(request, hint));
Set<LoadBalancerLifecycle> supportedLifecycleProcessors = this.getSupportedLifecycleProcessors(serviceId);
supportedLifecycleProcessors.forEach((lifecycle) -> {
lifecycle.onStart(lbRequest);
});
//根据实例id 选择实例执行
ServiceInstance serviceInstance = this.choose(serviceId, lbRequest);
if (serviceInstance == null) {
supportedLifecycleProcessors.forEach((lifecycle) -> {
lifecycle.onComplete(new CompletionContext(Status.DISCARD, lbRequest, new EmptyResponse()));
});
throw new IllegalStateException("No instances available for " + serviceId);
} else {
// 执行具体访问操作
return this.execute(serviceId, serviceInstance, lbRequest);
}
}