服务端暴露过程

- 在spring整合dubbo中,
NamespaceHandler
和DubboBeanDefinitonParser
完成解析工作,服务提供两个Bean,一个给本地spring容器,另一个交给dubbo - serviceBean实现了
AppliactionListener<ContextRefreshEvent>
,onApplicationEvent
方法监听ContextRefreshEvent
事件,spring bean
加载完成,发布ContextRefreshEvent
,执行export
方法。加载父类ServiceConfig export
方法暴露。
export()
doExport()
doExportUrls()
doExportUrlsFor1Protocol()
exportLocal()暴露本地服务 封装成exporter对象 exporterMap
暴露远程服务 封装成exporter对象 存入exporterMap 中
protected final Map<String, Exporter<?>> exporterMap = new ConcurrentHashMap<String, Exporter<?>>();
private void doExportUrls() {
List<URL> registryURLs = loadRegistries(true);
for (ProtocolConfig protocolConfig : protocols) {
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
}
}
- 首先获取properties里面所有注册的url地址,接着对每个协议对应不同的注册中心进行暴露,进行本地暴露、远端暴露,远端暴露的过程中包含Netty服务器的配置和启动、向zk服务器注册并订阅。
客户端引用过程
- 扫描配置文件,
ReferenceBean继承FactoryBean
从ReferenceConfig
的init()
开始,
init()
createProxy() 创建代理Invoker,最后利用FactoryBean.getObject()注入
createProxy
功能- 判断是否是本地JVM的服务
- 获取注册地址,判断是否是单个URL
- 注册消费者信息到注册中心中
- 订阅服务提供者、路由和配置的信息
- 加入Cluster,将Directory包装成Invoker
- 最后生成Invoker对象
Invoker作用
- 它是一个可执行的对象,能够根据方法的名称、参数得到相应的执行结果。
- 它里面有一个方法
Result invoke(Invocation invocation)
- Invocation是包含需要执行的方法和参数的重要信息,目前他有实现类RpcInvocation、MockInvocation
- 它的三种类型的Invoker
1)本地执行类的Invoker
service端:通过InjvmExporter来进行反射调用方法执行
2)远程通信类的Invoker
client端:通过DubboInvoker进行远程通信,发送要执行的接口给server端
server端:采用AbstractProxyInvoker代理执行,然后将结果返回
3)多个远程通信执行类的Invoker聚合成集群版的Invoker
client端:通过AbstractClusterInvoker来进行负载均衡,DubboInvoker进行远程通信,发送要执行的接口给server端:采用AbstractProxyInvoker代理执行,然后将结果返回
消费者网络发送过程
- 服务代理(创建InvokerInvacationHandler对象)
- –>服务降级–>集群容错(容错、目录查找、负载均衡)
- –>扩展点(监听器链。过滤器链)–>服务引用—>
- 编解码序列化–>网络传输(用来抽象netty和mina接口)
- –>服务端接受–>从exporterMap提取一个Invoker对象–>
- (javaassitProxyFactory.AbstractProxyInvoker).doInvoke
- –>真正实现的方法
接受过程相反