SpringCloud之Ribbon客户端负载应用及原理分析
SpringCloud之Ribbon客户端负载原理分析(一)-LoadBalancerInterceptor原理分析
SpringCloud之Ribbon客户端负载原理分析(二)-RibbonLoadBalancerClient原理分析
SpringCloud之Ribbon客户端负载原理分析(三)-ILoadBalancer原理分析
本文主要内容:
了解RibbonLoadBalancerClient的处理流程及部分功能实现原理
- RibbonLoadBalancerClient如何存储和获取到LoadBalancer的
- 如何通过LoadBalancer获取Server实例(简略)
- 如何包装请求数据,并发送到目标服务器
一、前述
1.1、前文提要
上篇文章对LoadBalancerInterceptor原理分析:Spring Cloud Ribbon会为每一个增加了@LoadBalanced的Restemplate,设置一个LoadBalancerInterceptor负载均衡拦截器。
当restemplate发送请求时,LoadBalancerInterceptor会拦截请求数据,并封装成一个LoadBalancerRequest后,交由LoadBalancerClientt(即:RibbonLoadBalancerClient)进行处理。
二、RibbonLoadBalancerClient源码分析
LoadBalancerInterceptor调用LoadBalancerClient.execute()方法,实际会进入RibbonLoadBalancerClient..execute()方法
,此方法会完成以下内容:
getLoadBalancer(serviceId)方法
:根据serviceId获取一个loadBalancer负载均衡器getServer(loadBalancer, hint)方法
:通过loadBalancer负载均衡器,获得一个Server服务实例,Server中会存储一个服务节点的元数据,比如:host、port、isAliveFlag等属性new RibbonServe方法
:将Server包装成RibbonServer(即:ServiceInstance)execute()方法
:将Request请求数据发送到RibbonServer(ServiceInstance)服务器端
@Override
public <T> T execute(String serviceId, LoadBalancerRequest<T> request)
throws IOException {
return execute(serviceId, request, null);
}
public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint)
throws IOException {
// 1、获取一个ILoadBalancer负载均衡器
ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
// 2、从ILoadBalancer获取一个Server服务实例
Server server = getServer(loadBalancer, hint);
if (server == null) {
throw new IllegalStateException("No instances available for " + serviceId);
}
// 3、将Server包装成RibbonServer(即:ServiceInstance)
RibbonServer ribbonServer = new RibbonServer(serviceId, server,
isSecure(server, serviceId),
serverIntrospector(serviceId).getMetadata(server));
// 4、将Request请求数据发送到RibbonServer服务端
return execute(serviceId, ribbonServer, request);
}
下面我们来逐一分析这四个方法
2.1、getLoadBalancer(serviceId)方法
getLoadBal