Dubbo 架构简述

本贴最后更新于 2561 天前,其中的信息可能已经东海扬尘

全局入口 spring schema handler

spring handler:com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,定义了不同元素的解析器与映射的类。比如 dubbo:reference 对应 ReferenceBeandubbo:service 对应 ServiceBean

provider 侧

  • 读取 spring 配置,dubbo 会将 spring xml 中的 dubbo:service 元素通过预先定义好的解析器封装成一个 ServiceBean,这是一个 service 的入口。

  • ServiceBean 实现了 spring 的 ApplicationListener 接口,用来监听 spring 上下文事件。Dubbo 响应了 ContextRefreshedEvent 事件,在上下文刷新之后执行导出 provider 动作。

  • 执行导出操作,需要两个信息:

    1. 通信协议信息,用来指定 consumer 和 provider 间的通信方式以及信息。
    2. 注册中心信息,用来往对应的注册中心注册 provider url。
  • com.alibaba.dubbo.config.ServiceConfig#doExportUrls 生成 registry URL 以及 provider URL,并将 provider URL 作为 registry URL 的 export 参数绑定。根据 registry URL 的协议 registry://拿到对应的 RegistryProtocol并调用其 export 方法。

  • com.alibaba.dubbo.registry.integration.RegistryProtocol#export 主要完成两件事情:

    1. 作为 provider,使用定义好的通信协议来暴露服务,如 dubbo,http,rmi 等。
      • registry URL 的 export 参数来获取 provider URL
      • 通过 provider URL 的协议来获取其对应的协议处理类并调用 export 方法。
    2. 使用 registry URL 中的 registry 参数作为注册中心协议替换原来的**
      • 通过新的 registry URL 的协议头,拿到相应的 com.alibaba.dubbo.registry.Registry 实例并调用其 com.alibaba.dubbo.registry.RegistryService#register 方法,比如向 zookeeper 新建临时节点。
  • 以上,就是 provider 侧的执行流程简述。

consumer 侧

  • 同样的,dubbo 会将 dubbo:reference 封装成一个 ReferenceBean,但与 provider 不同,consumer 实现了 org.springframework.beans.factory.FactoryBean 接口,初始化的流程推迟到了调用 org.springframework.beans.factory.FactoryBean#getObject 时。
  • 生成 registry URL,暂时指定协议为 registry://,并将实际协议作为 registry 参数的值绑定在 URL 上。
  • 通过 registry URL 的协议 registry://,得到相应 RegistryProtocol,然后调用其 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 方法来获取 provider 引用。
  • 更新 registry URL 协议。
  • 通过 registry URL 获取相应的 com.alibaba.dubbo.registry.Registry
  • 使用 registry URL 和接口类型来生成相应的 com.alibaba.dubbo.registry.integration.RegistryDirectory
    • RegistryDirectory 通过 registry URL 和接口类型来命名。
    • RegistryDirectory 用来封装所有的 invoker 地址信息以及路由信息等。
    • 负责通过 provider URL 中的协议信息获取相应的链接协议处理类并调用 refer()方法以获取 Invoker对象。
  • 生成订阅 URL,协议为 consumer://,通过 registry URL 获取相应的注册中心,向注册中心注册 consumer URL
  • 调用对应的注册中心的 subscribe 方法,com.alibaba.dubbo.registry.RegistryService#subscribe
  • 最终,会将 provider URL 保存到相应的 RegistryDirectory 中 com.alibaba.dubbo.registry.integration.RegistryDirectory#notify。可以查看 com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe

请求调用

  • 默认使用 JDK 动态代理模式来获取实际执行类。

  • 实际执行对象则是 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 返回的 Invoker 对象。

  • 最终会执行 com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke 方法。

  • 从 RegistryDirectory 中获取 Invoker List

  • 通过负载均衡从 Invoker List 中获取一个 Invoker。

  • 拿到对应的链接协议 Invoker 实例,执行远程调用。

  • 注意,consumer 实例是由 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 生成的,而用来执行远程链接处理远程协议的**refer()**方法则是由 RegistryDirectory 负责调用的。

以上只是 dubbo 架构很小的一部分,更多的信息大家可以通过阅读 dubbo 源码获取 dubbo 源码地址

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 595 关注
  • registry
    4 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...