• 【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对象

    官方文档服务发布序列图

    活动图

  • 相关阅读:
    大道至简第五章读后感
    课后作业1:字串加密
    String类中的equals()方法:
    构架之美读后感5
    构架之美读后感4
    构架之美读后感3
    构架之美读后感2
    构架之美读后感1
    关于联想y485p装win10显卡驱动问题
    软件需求与分析课堂讨论一
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/8109781.html
Copyright © 2020-2023  润新知