【DUBBO】Dubbo原理解析-服务发布
转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41651205
服务发布方在spring的配置文件中配置如下:
<bean id="demoService"class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
上面是在spring中配置的服务的具体实现,是spring中的一个普通的bean
<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService" ref=”demoService”/>
上面的配置spring容器在启动的过程中会解析自定义的schema元素dubbo转换成实际的配置实现ServiceBean ,并把服务暴露出去。
ServiceBean处理继承dubbo自己的配置抽象类以外,还实现了一系列的spring接口用来参与到spring容器的启动以及bean 的创建过程中去。由于spring的实例化ServiceBean是单例模式的,在Spring的容器ApplicationContext的启动过程 refresh过程中最后第二步会预先初始化单例的bean, 在bean的初始化过程会设置beanName, 设置容器applicationContext, 回调 InitializingBean的afterPropertiesSet
最后一步finishRefresh会触发ContextRefreshedEvent事件, 而ServiceBean实现了ApplicationListener接口监听了此事件, 而在之前一步实例化的ServiceBean注册了这个事件,所以ServiceBean的 onApplicationEvent(ApplicationEvent event)方法被触发, 在这个方法中触发了export方法来暴露服务。
ServiceConfig.doExportUrls()执行具体的export过程
1. loadRegistries(true)
checkRegistry如果xml中没有配置注册中,从dubbo.properties中读取配置,构建RegistryConfig对象并赋值
构建注册中心URL统一数据模式集合List<registryUrl>
2. 因为dubbo支持多协议配置,遍历所有协议分别根据不同的协议把服务export到不同的注册中心上去
a) 判断是否是泛型暴露
b) 根据协议构建暴露服务的统一数据模型URL
c) 配置的了monitor加载monitor,并给URL设置MONITOR_KEY
d) 给注册中regitryUrl设置EXPORT_KEY值为前面构建的暴露服务url
e) 根据服务具体实现,实现接口以及regitryUrl从代理工厂ProxyFactory获取代理Invoker(继承于AbstractProxyInvoker),它是对具体实现的一种代理
f) Protocol.export(invoker) 暴露服务invoker
Invoker包含上一步传入的RegistryUrl, registryUrl的protocol值为registry
ProtocolListenerWrapper和ProtocolFilterWrapper对于协议为REGISTRY_PROTOCOL直接跳过,最终由RegistryProtocol处理export的过程
RegistryProtocol暴露服务过程
这里传入的Invoker是由RegistryUrl从ProxyFactory得到的Invoker
1. 从Invoker获取providerUrl,在获取cacheKey, 根据cacheKey获取本地缓存的ExporterChangeableWrapper(exporter代理,建立返回的exporter与 protocol export出的exporter的对应关系), 如果存在返回。
2. 如果不存在,根据传入的 Invoker获取providerUrl, 在构建InvokerDelegete(originInvoker, providerUrl)
3. Protocol.exprot(invokerDelegete) 根据providerUrl 的协议(一般是dubbo协议)通过Protocol的设配类暴露服务,得到exporter
4. 利用providerUr导出的exporter和invoker构建对象ExporterChangeableWrapper缓存到本地
5. 由Invoker得到registryUrl。
在根据registryUrl从RegistryFactory获取Registry, 获取RegistryUrl的注册中心协议,这里我们拿zooKeeper协议为例。由dubbo的扩展机制得到的是 ZookeeperRegistryFactory,得到注册器为ZookeeperRegistry
6. 由Invoker获取ProviderUrl在去除不需要在注册中心看到的字段得到registryProviderUrl
7. 注册中心(ZookeeperRegistry)注册registryProviderUrl
Registry.register(registryProviderUrl)
8. 由registryProviderUrl获取overrideSubscribeUrl,在构建OverrideListener
9. registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener) 注册中心订阅这个url, 用来当数据变化通知重新暴露, 哪zookeeper为例,暴露服务会在zookeeper生成一个节点,当节点发生变化的时候会触发 overrideSubscribeListener的notify方法重新暴露服务
10. 构建并返回一个新的exporter实例
DubboProtocol暴露服务的过程
1. 从invoker获取统一数据模型url
2. 由url构建serviceKey(一般由端口,接口名,版本,group分组)
如:com.alibaba.dubbo.demo.DemoService:20880 这个是由接口和端口组成的
3. 构建DubboExporter放入本地map做缓存
4. 根据url openserver。 查找本地缓存以key为url.getAddress如果没有ExchangeServer创建。设置heartbeat时间,设置编码解码协议
根据url和ExchangeHandler 绑定server并返回(具体如何绑定专题介绍)
5. 返回DubboExporter对象
官方文档服务发布序列图

活动图

【DUBBO】Dubbo原理解析-服务发布的更多相关文章
- 2、Dubbo源码解析--服务发布原理(Netty服务暴露)
一.服务发布 - 原理: 首先看Dubbo日志,截取重要部分: 1)暴露本地服务 Export dubbo service com.alibaba.dubbo.demo.DemoService to ...
- dubbo框架揭秘之服务发布
通常情况下是通过Spring配置的方式去实现服务的发布,为了方便调试,我就不采用Spring配置的方式. DemoService demo = new DemoServiceImpl(); Appli ...
- dubbo源码之服务发布与注册
服务端发布流程: dubbo 是基于 spring 配置来实现服务的发布的,对于dubbo 配置文件中看到的<dubbo:service>等标签都是服务发布的重要配置 ,对于这些提供可配置 ...
- Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)
前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程. 以源码中dubbo-demo模块作为切入口一步步走进Dubbo源码. ...
- Dubbo源码学习--服务发布(ProxyFactory、Invoker)
上文分析了Dubbo服务发布的整体流程,但服务代理生成的具体细节介绍得还不是很详细.下面将会接着上文继续分析.上文介绍了服务代理生成的切入点,如下: Invoker<?> invoker ...
- Dubbo源码学习--服务发布(DubboProtocol、Exporter)
在Dubbo服务发布的整体流程一文中,只是分析了服务发布的整体流程,具体的细节还没有进一步分析.本节将继续分析服务暴露的过程.在ServiceConfig中通过一句话即可暴露服务,如下: Export ...
- 【DUBBO】Dubbo原理解析-服务引用
服务引用是服务的消费方向注册中心订阅服务提供方提供的服务地址后向服务提供方引用服务的过程. 服务的应用方在spring的配置实例如下: <dubbo:referenceid="demo ...
- dubbo源码之四——服务发布二
dubbo版本:2.5.4 2. 服务提供者暴露一个服务的详细过程 上图是服务提供者暴露服务的主过程: 首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl ...
- Dubbo 系列(05-1)服务发布
目录 Dubbo 系列(05-1)服务发布 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 服务暴露整体机制 2. 源码分析 2.1 前置工作 2.2 ...
随机推荐
- Spring自定义注解扫描的实现
目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultPar ...
- cJSON序列化工具解读一(结构剖析)
cJSON简介 JSON基本信息 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于人阅读和编写.同时易于机器解析和生成.是一种很好地数据交换语言. 官方 ...
- 二十七 Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP
设置代理ip只需要,自定义一个中间件,重写process_request方法, request.meta['proxy'] = "http://185.82.203.146:1080&quo ...
- 【转】ftrace 简介
ftrace 简介 ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析. 最早 ftrace 是一个 function tracer,仅能够记录内核的函数 ...
- C# - Generics泛型,一图话c#泛型
一.一篇好文 https://www.cnblogs.com/yueyue184/p/5032156.html 二.一幅好图
- VMware虚拟机安装linux7并设置网络
1.下载VMware虚拟机 https://www.vmware.com/cn/products/workstation/workstation-evaluation.html 永久激活12位序列号: ...
- HighCharts 特性;Highcharts 环境配置
Highcharts Highcharts 是一个用纯JavaScript编写的一个图表库. Highcharts 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表 Highchart ...
- vuejs绑定img 的src
1.显示本地图片: <img src="../../common/images/auth-icon.png" /> 2.绑定变量: <img class=&q ...
- Spring整合hibernate:3、使用XML进行声明式的事务管理
配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- mysql function动态执行不同sql语句
create procedure cps() begin ) default 'user'; set strSql = concat('select * from ',table_user); pre ...