Repository navigation
Website content zh cn overview mannual golang sdk sourcecode protocol
Go SDK 手册(版本需核对)。原文按来源版本保留;使用前请读 版本与升级。 来源:原文 · 提交
84b35ebdab20· 返回目录
相关示例:
- Triple RPC:dubbo-go-samples/rpc/triple
- 多协议服务:dubbo-go-samples/rpc/multi-protocols
- gRPC 互通:dubbo-go-samples/rpc/grpc
在当前 Dubbo Go 中,protocol 层是 invocation 模型和底层网络协议之间的桥梁。它一方面负责把 provider 暴露成网络服务,另一方面负责把 consumer 侧的引用转换成可调用的远程 invoker。
当前协议接口定义在 protocol/base/base_protocol.go:
type Protocol interface {
Export(invoker Invoker) Exporter
Refer(url *common.URL) Invoker
Destroy()
}它的职责很直接:
-
Export:把 provider 侧 invoker 暴露成网络服务 -
Refer:为目标 URL 创建 consumer 侧 invoker -
Destroy:销毁该协议持有的 invoker 和 exporter
此外还有一个可选能力:
type RegistryUnregisterer interface {
UnregisterRegistries()
}它主要用于优雅停机阶段,让协议在完整 teardown 之前,先把已经暴露出去的服务从注册中心摘除。
在 provider 侧,Dubbo Go 通常会经过下面这条链路:
-
server.Register(...)或server.RegisterService(...)创建 service metadata 和 invoker。 -
ServiceOptions.Export()选择 protocol 和 registry 行为。 - 具体协议实现调用
Export(invoker)。 - 暴露后的服务开始监听配置好的网络端点。
不同协议提供不同的传输层和编解码方式,但都会遵循同一个 Export 契约。
在 consumer 侧:
-
client.Dial...(...)构造 reference。 - 解析直连 URL 或注册中心 URL。
- 选中的协议实现调用
Refer(url)。 - 返回的 invoker 成为生成代码 stub 或泛化调用背后的可调用对象。
这也是为什么 protocol 层会同时服务于生成代码调用和基于注册中心的动态引用。
常用内置实现包括:
protocol/tripleprotocol/dubboprotocol/restprotocol/jsonrpc
其中 Triple 是当前新应用推荐使用的协议,支持 unary、streaming、metadata header/trailer、reflection,以及在线路层和 gRPC 互通。
如果你想看一个应用如何同时暴露多个协议端点,rpc/multi-protocols 是很合适的 sample。
Dubbo Go 还提供了位于 registry/protocol 的 registry-backed protocol 层。
它会协调:
- 服务 export
- 服务注册
- metadata 上报
- 订阅和 directory 刷新
所以实际运行时,很多 reference 并不是单纯的“protocol 调用”,而是“registry protocol + 具体业务协议”的组合。
原始 protocol 实现通常还会经过 protocol/protocolwrapper 的再次包装,尤其是 filter 链的接入。这样 protocol 调用就成为很多横切能力的集成点,例如:
- tracing
- metrics
- token/auth 校验
- 泛化调用支持
- 优雅停机
这也是为什么 protocol 包在接口层看起来很小,但在整个运行时调用链里非常关键。