相关示例:
在当前 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 侧 invokerDestroy:销毁该协议持有的 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。Refer(url)。这也是为什么 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 层。
它会协调:
所以实际运行时,很多 reference 并不是单纯的“protocol 调用”,而是“registry protocol + 具体业务协议”的组合。
原始 protocol 实现通常还会经过 protocol/protocolwrapper 的再次包装,尤其是 filter 链的接入。这样 protocol 调用就成为很多横切能力的集成点,例如:
这也是为什么 protocol 包在接口层看起来很小,但在整个运行时调用链里非常关键。