dubbo版本2.7.14。
使用源码包的子工程dubbo-demo-annotation为例。使用默认配置,启动项目。
1. 核心组件的UML类图
2. 运行时的数据结构
3. InvokerInvocationHandler
consumer端带@DubboReference注解的引用,实际注入的是一个由字节码技术构造的代理对象,是一个InvokerInvocationHandler对象。
该类继承自jdk的InvocationHandler。
- invoker 此处是MigrationInvoker
- consumerModel 是一个数据实体对象,包含接口信息、接口方法信息。
- url。
- protocolServiceKey 接口类全限定名+协议(默认dubbo)
4. MigrationInvoker
实现接口MigrationClusterInvoker。
invoker 此处是MockClusterInvoker。
invoke方法会获取一个可用的Invoker,完成调用。
MigrationClusterInvoker
提供发现服务列表、刷新服务列表的能力。
继承自接口ClusterInvoker。ClusterInvoker实现接口
提供获取注册中心、获取Directory能力。
继承自Invoker。
5. MockClusterInvoker
directory 此处是RegistryDirectory。
invoker。
继承自ClusterInvoker,invoke方法中有对mock配置的判断:
- no mock(无mock配置),走常规调用;
- force:direct mock(mock && 强制),走mock调用;
- fail-mock(mock && 不强制),走常规调用。如果有异常,走mock调用。
6. RegistryDirectory
继承自 DynamicDirectory,提供把url转化为Invoker的能力。
urlInvokerMap, key是url,value是Invoker,此处是内部类RegistryDirectory.InvokerDelegate。
7. Invoker
RegistryDirectory.InvokerDelegate
继承自InvokerWrapper。InvokerWrapper
继承自Invoker接口,内部代理了一个Invoker,此处是FilterNode。FilterNode
继承自Invoker接口,为rpc调用增加Filter的业务逻辑。
invoker 代理的Invoker,此处是AsyncToSyncInvoker。
next 下一个FilterNode节点。
filter 当前节点要执行的Filter。AsyncToSyncInvoker
继承自Inovker接口,内部代理了一个Inovker,此处是DubboInvoker。
该类提供把rpc调用转化为同步的能力:invoke方法中,对于sync模式的rpc调用结果对象Result,调用Result.get(long timeout, TimeUnit unit)方法,该方法调用jdk接口方法CompletableFuture.get(long, TimeUnit),阻塞住用户线程。一直到consumer接收到provider返回的结果,正常唤醒用户线程;或者等待超时,异常唤醒。DubboInvoker
继承自抽象类AbstractInvoker,实现了Invoker接口。
clients, dubbo框架内部的consumer客户端,此处是ReferenceCountExchangeClient。
index, 一个计数器,用于记录上次使用的client。
version。
destroyLock, invoker销毁时使用。
invokers, 所有Invoker的集合。invoker销毁时,把自身移除出该集合。
invoke方法中会从clients中挑选一个,执行rpc调用。
8. ReferenceCountExchangeClient
继承自ExchangeClient,内部代理了一个ExchangeClient,此处是HeaderExchangeClient。
9. HeaderExchangeClient
继承自ExchangeClient。
client, 此处是基于netty4框架编写的NettyClient。
channel,此处是HeaderExchangeChannel。
构造函数中会使用client作为参数,new 一个HeaderExchangeChannel。
request方法调用channel的同名方法。
10. HeaderExchangeChannel
继承自ExchangeChannel。
channel, 是NettyClient,作为构造函数的参数传入。
request方法最终调用channel对象(NettyClient)的send(Object message)方法
11. NettyClient
继承自AbstractClient,进而继承自AbstractEndpoint,进而继承自AbstractPeer。
bootstrap, netty4框架的Bootstrap 。
channel, netty4框架的Channel。
从AbstractPeer继承 send(Object message)方法,该方法调用send(Object message, boolean sent),这是一个抽象方法。
NettyClient实现了send(Object message, boolean sent)方法,方法内调用netty4框架的接口方法ChannelOutboundInvoker.writeAndFlush(Object),向provider发出一个rpc调用。