zoukankan      html  css  js  c++  java
  • dubbo源码之四——dubbo服务发布

    dubbo版本:2.5.4

    服务发布是服务提供方向注册中心注册服务过程,以便服务消费者从注册中心查阅并调用服务。

    服务发布方在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自己的配置抽象类(ServiceConfig)以外,还实现了一系列的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对象

    官方文档服务发布序列图

    发布活动图

     
  • 相关阅读:
    仿造email后缀自动添加功能(1)
    仿造email后缀搜索功能(2)
    取出input内的空格
    小知识点
    关于闭包
    js清除浏览器缓存的几种方法
    动态生成模板(模板生成器)
    安卓端调用h5界面js方法和ios端调用h5界面js方法
    linux 命令
    如何做个好员工
  • 原文地址:https://www.cnblogs.com/man-li/p/4323277.html
Copyright © 2011-2022 走看看