目录
前言
在上面两篇有关dubbo服务发布和服务消费的过程中我们主要讲述了如何将所有的配置文件转换为对应的Dubbo URL,虽然也提及了ProxyFactory和Invoker但是也是浅尝辄止,对于服务发布或者消费具体原理并没有介绍,这里我们使用一篇(不一定)来探究一个dubbo的服务发布和远程的rpc模块,通过对这个模块的学习将使我们对服务的发布和调用更加清晰。
此篇博文重点介绍服务发布的详细介绍, dubbo版本基于2.6.2
一、rpc模块常用类
- Invoker类是Dubbo核心模型类,dubbo进行rpc调用的具体调用执行类,是其dubbo核心基础、对于服务方它是服务调用提供者,对于消费方它是服务的远程调用。该对象是通过ProxyFactory对象创建而来。在dubbo中默认实现为JavassistProxyFactory。
- Protocol:该类是dubbo进行底层服务之底层通讯协议,dubbo默认使用dubbo协议使用更高效的netty框架进行通信。
- 对于服务提供者执行export方法:启动xxxServer,将服务执行对象【invoker】暴露在网络中
- 对于服务消费者调用refer方法:创建xxxClient,封装为调用对象【invoker】供consumer调用
二、服务提供者
这里我们先通过服务提供者的相关服务发布过程了解其相关逻辑,话不多说上代码
//1、创建代理对象Invoker(AbstractProxyInvoker)
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
//2、AbstractProxyInvoker对象包装成DelegateProviderMetaDataInvoker 添加了一个本身ServiceConfig实例作为metadata
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
//3、服务发将服务执行对象【invoker】以对应的协议(dubbo协议)暴露在网络中
Exporter<?> exporter = protocol.export(wrapperInvoker);
exporters.add(exporter);
如上代码在ServiceConfig的export中最终将服务注册发布出去,首先下通过ProxyFactory(实现类为:JavassistProxyFactory)getInvoker获取服务调用实体对象Invoker