avatar

目录
2、spring cloud ribbon源码分析

、RestTemplate调用原理

1、调用restTemlate.get()

2、进入RestTemplate的拦截器

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class InterceptingClientHttpRequest{

private class InterceptingRequestExecution implements ClientHttpRequestExecution

@Override
public ClientHttpResponse execute(HttpRequest request, byte[] body) throws IOException {
if (this.iterator.hasNext()) {
ClientHttpRequestInterceptor nextInterceptor = this.iterator.next();
return nextInterceptor.intercept(request, body, this);
}
else {
...省略
}
}

}

3、 进入LoadBalancerInterceptor 拦截器,其中LoadBalancerClient的实现一般为RibbonLoadBalancerClient

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
final ClientHttpRequestExecution execution) throws IOException {

final URI originalUri = request.getURI();
String serviceName = originalUri.getHost();
Assert.state(serviceName != null,"Request URI does not contain a valid hostname: " + originalUri);
return this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));

}
}
}

4、进入ribbon的客户端负载均衡实现,RibbonLoadBalancerClient.execute()方法

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class RibbonLoadBalancerClient implements LoadBalancerClient {

public T execute(String serviceId, LoadBalancerRequest request, Object hint) throws IOException {
// 获取所有实例列表
ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
// 按照负载均衡算法选择1个实例
Server server = this.getServer(loadBalancer, hint);
if (server == null) {
throw new IllegalStateException("No instances available for " + serviceId);
}
else {
RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
# 向选择的实例真正发送请求
return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);
}
}

}
文章作者: calebzhao
文章链接: https://calebzhao.github.io/2019/12/29/2%E3%80%81spring-cloud-ribbon%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 calebzhao的博客
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论