• (转)Dubbo扩展点实现细节


    实现细节

    (+) (#)

    初始化过程细节

    (+) (#)

    解析服务

    • 基于dubbo.jar内的META-INF/spring.handlers配置,Spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler。
    • 所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
    • 在ServiceConfig.export()或ReferenceConfig.get()初始化时,将Bean对象转换URL格式,所有Bean属性转成URL的参数。
    • 然后将URL传给Protocol扩展点,基于扩展点的Adaptive机制,根据URL的协议头,进行不同协议的服务暴露或引用。

    暴露服务

    (1) 只暴露服务端口:

    • 在没有注册中心,直接暴露提供者的情况下,即:
      • <dubbo:service regisrty="N/A" /> or <dubbo:registry address="N/A" />
    • ServiceConfig解析出的URL的格式为:
      • dubbo://service-host/com.foo.FooService?version=1.0.0
    • 基于扩展点的Adaptive机制,通过URL的"dubbo://"协议头识别,直接调用DubboProtocol的export()方法,打开服务端口。

    (2) 向注册中心暴露服务:

    • 在有注册中心,需要注册提供者地址的情况下,即:
      • <dubbo:registry address="zookeeper://10.20.153.10:2181" />
    • ServiceConfig解析出的URL的格式为:
      • registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")
    • 基于扩展点的Adaptive机制,通过URL的"registry://"协议头识别,就会调用RegistryProtocol的export()方法,将export参数中的提供者URL,先注册到注册中心,再重新传给Protocol扩展点进行暴露:
      • dubbo://service-host/com.foo.FooService?version=1.0.0
    • 基于扩展点的Adaptive机制,通过提供者URL的"dubbo://"协议头识别,就会调用DubboProtocol的export()方法,打开服务端口。

    引用服务

    (1) 直连引用服务:

    • 在没有注册中心,直连提供者的情况下,即:
      • <dubbo:reference url="dubbo://service-host/com.foo.FooService?version=1.0.0" />
    • ReferenceConfig解析出的URL的格式为:
      • dubbo://service-host/com.foo.FooService?version=1.0.0
    • 基于扩展点的Adaptive机制,通过URL的"dubbo://"协议头识别,直接调用DubboProtocol的refer()方法,返回提供者引用。

    (2) 从注册中心发现引用服务:

    • 在有注册中心,通过注册中心发现提供者地址的情况下,即:
      • <dubbo:registry address="zookeeper://10.20.153.10:2181" />
    • ReferenceConfig解析出的URL的格式为:
      • registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")
    • 基于扩展点的Adaptive机制,通过URL的"registry://"协议头识别,就会调用RegistryProtocol的refer()方法,基于refer参数中的条件,查询提供者URL,如:
      • dubbo://service-host/com.foo.FooService?version=1.0.0
    • 基于扩展点的Adaptive机制,通过提供者URL的"dubbo://"协议头识别,就会调用DubboProtocol的refer()方法,得到提供者引用。
    • 然后RegistryProtocol将多个提供者引用,通过Cluster扩展点,伪装成单个提供者引用返回。

    拦截服务

    • 基于扩展点的Wrapper机制,所有的Protocol扩展点都会自动套上Wrapper类。
    • 基于ProtocolFilterWrapper类,将所有Filter组装成链,在链的最后一节调用真实的引用。
    • 基于ProtocolListenerWrapper类,将所有InvokerListener和ExporterListener组装集合,在暴露和引用前后,进行回调。
    • 包括监控在内,所有附加功能,全部通过Filter拦截实现。
  • 相关阅读:
    网页登陆注册认证
    把git上的larave项目通过SourceTree安装上再通过composer安装依赖库
    Mysql依赖库Boost的源码安装,linux下boost库的安装
    oracle date 和 timestamp区别
    easyUI datagrid 分页参数page和rows
    问题:org.hibernate.LazyInitializationException: failed to lazily initialize
    Struts2返回JSON数据的具体应用范例
    错误Batch update returned unexpected row count from update [0]; actual row count: 0;
    SSH2+proxool 出现No suitable driver found for proxool.mysqlProxool
    Proxool Provider unable to load JAXP configurator file: proxoolconf.xml
  • 原文地址:https://www.cnblogs.com/guazi/p/6929890.html
Copyright © 2020-2023  润新知