博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo源码学习--服务是如何发布的
阅读量:5069 次
发布时间:2019-06-12

本文共 2778 字,大约阅读时间需要 9 分钟。

相关文章:

ServiceBean

ServiceBean 实现ApplicationListener接口监听ContextRefreshedEvent事件(容器加载完成事件)

public void onApplicationEvent(ApplicationEvent event) {        if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) {            if (isDelay() && ! isExported() && ! isUnexported()) {                if (logger.isInfoEnabled()) {                    logger.info("The service ready on spring started. service: " + getInterface());                }                export();            }        }

在容器加载完成后执行export(); 开始暴露

ServiceConfig 类

方法执行顺序:export() -> doExport() -> doExportUrls() -> doExportUrlsFor1Protocol();

export() 判断是否延迟发布,如果延迟发布会新建个Daemon线程然后调用doExport(), 否则直接调用doExport();

doExport() 给ServiceConfig 装载注册中心监控中心等。

doExportUrls()

private void doExportUrls() {        List
registryURLs = loadRegistries(true); for (ProtocolConfig protocolConfig : protocols) { doExportUrlsFor1Protocol(protocolConfig, registryURLs); } }
  1. 执行loadRegistries()遍历注册中心,根据注册中心、Dubbo版本、Pid等生成要发布的URL;

    URL示例: zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=ordercenter_serviceImpl
    &dubbo=2.8.4&pid=15836&registry=zookeeper&timestamp=1484018365125

  2. 遍历服务协议,为每个协议执行doExportUrlsFor1Protocol()

doExportUrlsFor1Protocol()

Invoker
invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));Exporter
exporter = protocol.export(invoker);
  1. 创建 Invoker
  2. 调用 protocol.export() 将Invoker 转换成Exporter
    1071030-20170110163705088-745154787.jpg

DubboProtocol类

方法执行顺序:export() -> openServer() ->createServer()

createServer() 通过Exchangers.bind() 创建 ExchangeServer

RegistryProtocol类

DubboProtocol export() 执行完成后最终返回上层包装类 RegistryProtocol类

RegistryProtocol export() 进行服务注册和变更订阅

public 
Exporter
export(final Invoker
originInvoker) throws RpcException { //export invoker final ExporterChangeableWrapper
exporter = doLocalExport(originInvoker); //registry provider final Registry registry = getRegistry(originInvoker); final URL registedProviderUrl = getRegistedProviderUrl(originInvoker); registry.register(registedProviderUrl); // 订阅override数据 // FIXME 提供者订阅时,会影响同一JVM即暴露服务,又引用同一服务的的场景,因为subscribed以服务名为缓存的key,导致订阅信息覆盖。 final URL overrideSubscribeUrl = getSubscribedOverrideUrl(registedProviderUrl); final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl); overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener); registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener); //.... }

暴露服务时序图

1071030-20170110163901775-237759552.jpg

转载于:https://www.cnblogs.com/javanoob/p/dubbo_services_export.html

你可能感兴趣的文章
python标准库——queue模块 的queue类(单向队列)
查看>>
display的值有哪些?
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
基于Lucene3.5.0怎样从TokenStream获得Token
查看>>
一网打尽各类Java基本数据类型转换
查看>>
FlowLayout布局
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>
深入浅出理解zend framework(三)
查看>>
python语句----->if语句,while语句,for循环
查看>>
javascript之数组操作
查看>>
LinkedList源码分析
查看>>
TF-IDF原理
查看>>
用JS制作博客页面背景随滚动渐变的效果
查看>>
JavaScript的迭代函数与迭代函数的实现
查看>>