Dubbo 代码结构整理
先上张图,可以看到dubbo的模块划分和层次划分有一定对应关系,我的水平评价不出代码好坏,但是很喜欢这种代码结构。
1.每一层的功能
Service:需要暴露的接口。服务端会实现接口暴露服务,客户端会将接口反射之后调用远程服务。
Config:xml配置文件中各种标签所属的java类。
Proxy:使用javassist、或者jdk动态代理生成的类,以及stub和local功能的实现。服务端的AbstractProxyInvoker会调用接口的真正实现类,同时会将Invoker用Export包装起来从而可以注册和暴露服务;客户端的Proxy中的invoker是AbstractClusterInvoker包装起来的AbstractInvoker(包含各种Protocol实现的远程调用的Invoker,如:dubbo的DubboInvoker,thrift的ThriftInvoker等)。
Registry:注册中心相关。
Cluster:负载均衡相关,如:failover、failfast、failback等。
Monitor:监控相关,有线程每分钟向MonitorService服务发送每个方法的调用次数。
Protocol:包含dubbo、hessian、rmi、webservice等通讯协议以及注册协议。
Exchange:定义了Server和Client的相关操作。此外,会调用编解码相关ChannelHandler对ChannelHandler进行包装,并启动心跳客户端线程HeartbeatTask。
Transport:包装Server和Client。提供两个方法,分别用来让服务端暴露服务和客户端连接服务端。有mina、netty、grizzly三种实现。并且会在构造方法中调用ChannelHandlers.wrapInternal() 包装ChannelHandler,处理multiMessage、心跳服务端以及加入线程池。
Serialize:序列化,使用hessian实现。