架构

当前 Dubbo Go 架构

相关示例:

Dubbo Go 当前围绕几个运行时概念组织:应用实例、provider、consumer、protocol、registry、metadata 和治理扩展。现在的应用通常通过 dubbo.goserverclient 中的 API 入口构建;使用配置文件的场景仍然会走 config.RootConfig

主要运行层次

层次主要包职责
应用实例dubbo.go, options.go持有 application、protocol、registry、metadata、metrics、tracing、router、shutdown 等选项。
Provider APIserver注册 service handler,构造 service options,创建 invoker 并暴露服务。
Consumer APIclient创建 client,引用服务,创建生成代码服务或泛化服务,并发起远程调用。
Protocolprotocol/base, protocol/triple, protocol/dubbo, protocol/restProvider 侧将 invoker 转为网络服务,consumer 侧将 invoker 转为网络调用。
Registry 与发现registry, registry/protocol, registry/servicediscovery, registry/directory负责注册、订阅、服务发现和注册中心驱动的调用。
Metadatametadata, metadata/report, metadata/mapping负责服务定义、service-to-application 映射和 metadata 上报。
治理扩展filter, cluster, cluster/router, cluster/loadbalance, common/extension提供 filter、router、load balance、cluster 策略和扩展注册。

Provider 流程

当前 server API 下,provider 通常会经历以下流程:

  1. dubbo.NewInstance(...) 创建应用实例并初始化全局选项。
  2. ins.NewServer(...) 基于 application、protocol、registry、provider 选项创建 server。
  3. 生成代码或用户代码调用 server.Register(...)server.RegisterService(...)
  4. server 构造 ServiceOptions,记录服务 metadata,并创建 invoker。
  5. ServiceOptions.Export() 委托协议完成服务暴露。
  6. 如果配置了注册中心,registry/protocol 会协调服务 export、注册中心注册和 metadata 上报。

Triple 协议通过 protocol/triple 暴露服务。应用级服务发现路径则通过 registry/servicediscovery 注册应用实例和 metadata。

Consumer 流程

consumer 通常会经历以下流程:

  1. dubbo.NewInstance(...) 创建应用实例。
  2. ins.NewClient(...) 创建带有 registry、protocol、consumer、metadata、metrics、tracing、router 等选项的 client。
  3. 生成代码 client 调用 client.DialWithInfo(...),泛化调用使用 client.NewGenericService(...)
  4. client 构造 ReferenceOptions,并在需要时初始化 metadata report。
  5. 直连 URL 会直接进入目标 protocol;注册中心 URL 会进入 registry/protocol
  6. registry directory 接收地址变更,并在调用前应用 router、load balance 和 cluster 逻辑。

扩展加载

很多实现通过 Go 包初始化注册。导入:

import _ "dubbo.apache.org/dubbo-go/v3/imports"

会加载常用内置 protocol、registry、filter、router、metadata report、tracing exporter、metrics、load balance 和 cluster 策略。用户也可以只按需导入具体实现包。