1 调用流程图
在spring cloud alibaba中,nacos discover提供了对ribbon的支持,其方式和eureka client对ribbon的支持一样,而ResTemplate客户端负载均衡又是依赖ribbon,下图是看完源码后画的一张简要的流程图:
2 流程图的源码分析
2.1 调用从RestTemplate到LoadBalancerInterceptor
从RestTemplate:getForObject()
一路断点到 doExecute()
方法
protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
Assert.notNull(url, "URI is required");
Assert.notNull(method, "HttpMethod is required");
ClientHttpResponse response = null;
try {
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
catch (IOException ex) {
…………
}
finally {
if (response != null) {
response.close();
}
}
}
在request处端点可以发现request对象里的List<ClientHttpRequestInterceptor> interceptors
中已经包含了LoadBalancerInterceptor
这拦截器。
接着从request.execute()
一路断点到executeInternal()
@Override
protected final ClientHttpResponse executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException {
InterceptingRequestExecution requestExecution = new InterceptingRequestExecution();
return requestExecution.execute(this, bufferedOutput);
}
private class InterceptingRequestExecution implements ClientHttpRequestExecution {
private final Iterator<ClientHttpRequestInterceptor> iterator;
public InterceptingRequestExecution() {
this.iterator = interceptors.iterator();
}
@Override
public ClientHttpResponse execute(HttpRequest request, byte[] body) throws IOException {
if (this.iterator.hasNext()) {
ClientHttpRequestInterceptor nextInterceptor = this