1.每一个层次之间基本通过spi的方式来生成调用的。
2service/config层
2.1服务发布通过serviceConfig来完成
服务消费通过referenceConfig来完成。
在创建这两个的过程中,还可以通过创建ProtocolConfig来指定协议,
MethodConfig来指定方法相关参数。
3proxy层。对于消费者而言,proxy作为消费者代理,将本地调用转换为wrapper类。
4.registry层。服务注册中心层。
5.cluster层。
当一个服务有多个提供者时,消费者需要有一定的路由,负债均衡,集群容错的考量。
6.monitor层用来统计rpc调用次数和调用耗时。
7.protocol层。主要封装了rpc调用逻辑,通过exporter,invoker的创建,完成服务的发布和引用。实现类是dubboProtocol.
- dubbo服务暴露源码流程
(1)容器创建完之后会触发ServiceBean(实现了applicationLIstener接口)类中的ContextRefreshedEvent事件,执行export()方法。
(2)export()方法会调用ServiceConfig中的doExport()方法,这个方法会调用doExportUrls()方法,进而doExportUrlsFor1Protocol()方法。
(3)doExportUrlsFor1Protocol()方法中会利用反射构造invoker,这个invoker封装了服务实现类注册的地址及端口相关信息。同时执行protocol.export()方法。
(4)protocol.export()中的protocol有两个实现类,这个是最关键的,一个是RegistryProtocol一个是DubboProtocol,调用这个方法的时候会首先调用RegistryProtocol类,RegistryProtocol类中的export()方法会调用doLocalExport()方法通知DubboProtocol执行openServer(url)方法进行服务的开启,其实就是开启一个netty服务。同时export()方法会调用ProviderConsumerRegTable.registerProvider()方法进行注册表的缓存以及服务的注册。
- dubbo服务发现源码流程
在ReferenceBean->getObject()->init()中会调用createProxy()方法用来创建代理对象。
在createProxy()中会执行一个refprotocol.refer()方法,这里refprotocol同样有两个实现类,一个是RegistryProtocol,一个是DubboProtocol
RegistryProtocol负责注册信息,订阅信息,构造invoker代理类,并将消费者对于的invoke缓存到注册列表中。
DubboProtocol主要负责connect/getClients()连接获取客户端,等待与服务端通信
dubbo服务调用源码流程