本文档适合服务已经运行在 dubbo 协议之上的老用户,请先参考上一篇文档 如何从 Dubbo2 升级到 Dubbo3 完成框架版本升级,然后遵循以下步骤以最小改动平滑迁移到 triple 协议。
以下是协议升级的架构图,展示了平滑升级过程中不同 Dubbo 应用的状态:
按先后顺序,升级基本步骤如下:
dubbo://host:port/DemoService?preferred-protocol=tri
)preferred-protocol=tri
优先调用 triple 协议@DubboReference(protocol="tri")
调用 triple 协议preferred-protocol
首选协议等功能,需要 Dubbo 3.3.0+ 版本!假设我们有以下应用配置,即在 20880 端口发布 dubbo 协议:
dubbo:
protocol:
name: dubbo
port: 20880
我们需要增加两个配置项,如下所示:
dubbo:
protocol:
name: dubbo
port: 20880
ext-protocol: tri
preferred-protocol: tri
其中,
ext-protocol: tri
指定在原 20880 端口上额外发布 triple 协议,即单端口双协议发布。preferred-protocol: tri
会随注册中心同步到 Consumer 侧,告诉 consumer 优先使用 triple 协议调用preferred-protocol: tri
配置仅在 3.3.0 及之后版本支持,所以即使 provider 配置了这个选项,对于 3.3.0 版本即之前的 consumer 消费端并不会生效,还是会调用 dubbo 协议。提供端完成步骤一配置并重启后,消费端根据版本与配置不同,可能处于以下三种状态之一:
1. 消费端是 3.3.0 及之后版本
此类消费端会自动识别提供者 url 上的 preferred-protocol: tri
标记,如果发现此标记,则消费端自动使用 triple 协议调用服务,否则继续使用 dubbo 协议。
2. 消费端是 2.x 或 3.3.0 之前版本
由于低版本 Dubbo 框架不能识别 preferred-protocol: tri
参数,因此这部分消费者不受提供者端多协议发布的任何影响,继续调用 dubbo 协议。
3. 消费端是 2.x 或 3.3.0 之前版本,且额外指定要调用的协议
与第 2 种情况基本一致,只是这时用户可以明确的为某些服务指定使用哪种 rpc 协议,如:
@DubboReference(protocol="tri")
private DemoService demoService;
或者
<dubbo:reference protocol="tri" />
在配置了 protocol="tri"
后,服务的调用会使用 triple 协议。需要注意的是,在配置 protocol="tri"
之前,一定要确保提供端已经发布了 triple 协议支持,否则调用将会失败。
preferred-protocol=tri
进行自动切换,需要两边版本都升级到 3.3.0+ 才支持。步骤一、二操作起来非常简单,并且保证了过程平滑,通过单端口双协议、消费端自动切换保证了整个升级过程的平滑。
平滑升级意味着我们要经历一个中间态,即在某一段时间内,集群内 dubbo 协议、triple 协议共存(有些服务间通信是dubbo协议、有些服务间通信是triple协议)。如何才能推进达成终态目标那,即所有服务调用都使用 triple 协议?我们推荐使用以下两种方式达成目标: