之前一篇文章《Dubbo服务提供者发布及注册过程源码分析》已经介绍了Dubbo服务端的服务注册及发布过程,这篇文章将会介绍Dubbo服务端是如何接受请求以及响应请求的。
本文还是以Consumer-Provider的Demo为例,分析接收请求及响应请求的具体流程,在Dubbo服务端发布服务之后,它将会监听一个端口等待接收客户端的请求,当接收到请求后,会经过入站处理器进行处理,我们知道在发布服务的时候设置了NettyServerHandler
入站处理器,接收到请求之后,会经过NettyServerHandler#channelRead()
方法来获取请求的消息,我们来看一下它的实现:
1 |
|
在之前一篇文章《Dubbo消费者调用过程源码分析》讲到,在创建代理的时候会生成调用对象invoker,这个时候就会绑定集群策略,我们来看生成invoker的代码,在类ReferenceConfig#createProxy(Map<String, String> map)
方法中:
1 | //直接在配置文件中配置url,实现直接通信(如果既配置了直连地址又配置了注册中心的地址,则自动忽略注册中心的地址) |
我们总结出三种生成集群策略的入口,当urls的长度为1时,此时该url可能为注册中心的地址也可能是服务的直连地址,则进一步执行invoker = refprotocol.refer(interfaceClass, urls.get(0));
;当urls的长度不为1时,此时可能为多个注册中心的地址或者多个服务直连地址,当为多个注册中心的地址时,会执行:
1 | URL u = registryURL.addParameter(Constants.CLUSTER_KEY, AvailableCluster.NAME); |
当为多个直连地址时,则执行:invoker = cluster.join(new StaticDirectory(invokers));
,下面将对这三种方式进行详细的分析。
Dubbo提供了四种负载均衡策略:Random LoadBalance(加权随机负载均衡)、RoundRobin LoadBalance(加权轮询负载均衡)、LeastActive LoadBalance(最少活跃数负载均衡)、ConsistentHash LoadBalance(一致性hash负载均衡),下面将分别分析这四种负载均衡策略的源码。
先来看一下RandomLoadBalance类的源码:
1 | public class RandomLoadBalance extends AbstractLoadBalance { |
随机加权轮询算法还是比较容易理解的,下面继续分析RoundRobin LoadBalance。
Update your browser to view this website correctly. Update my browser now