一.核心类
LoadBalanceManager 负载均衡的管理器
LoadBalance 负载均衡的抽象
Client 负载均衡调度的对象
二.核心类讲解
2.1 LoadBalanceManager类
核心对象,存储着service&group的组合键 和 负载均衡器的 kv对象
private static Map<String, LoadBalance> loadBalanceMap = new ConcurrentHashMap<String, LoadBalance>();
初始化流程
初始化过程中起了两个线程,用来监控Client的调度参数,这个和Pigeon的调度策略有关。在负载均衡过程中有两个重要的参数weight , capcity
weight是一个相对值,代表者不同机器处理能力的,这个值在服务注册时指定
capcity代表了能处理的请求数量,在之前的请求处理过程中也有描述
因为RPC服务通常处于一个或者多个分布式集群中,需要开启两个线程分别监听这两个参数的改动,从而影响负载均衡的结果
2.2 LoadBalance
负载均衡的接口定义
public Client doSelect(List<Client> clients, InvokerConfig<?> invokerConfig, InvocationRequest request,
int[] weights);
RandomLoadBalance 实现
代码比较简单,依赖random和weight的一个简单的负载均衡器的实现。个人感觉这里的代码执行效率比较低,改为map的映射来实现更加高效
2.3 Client
Client<C extends Channel> {
InvocationResponse write(InvocationRequest request) ;
void processResponse(InvocationResponse response);
}
2.4 执行流程
LoadBalance loadBalance = loadBalanceManager.getLB(serviceKey);
Client client = loadBalance.select(clients,config,request,weightArray);
Response response = client.write(requset);
client.processResponse(response);
真正的执行流程是责任链模式,因此这里仅仅是简化了一个执行流程,将负载均衡的过程梳理清楚
三.补充
负载均衡本质上是一种保证各个服务器提供者之间消费公平的一中路由策略. 避免部分机器过饱和或者部分机器过于饥饿。
所有的代码在Pigeon的route包内
Region也是路由包中的一个重要的组成部分,Region是机房的抽象。RPC的请求耗时组成中网络传输耗时是一个重要的组成部分
public List<Client> getPreferRegionClients(List<Client> clientList, InvocationRequest request);