[apache/dubbo]获取一个服务在一次调用发生时的两端(consumer和provider)的dubbo协议版本号(dubbo或revision或release)

2023-12-14 760 views
3

如果当前程序作为consumer,怎么获取本次调回目标provider的版本号(dubbo或revision或release) 如果当前程序作为provider,怎么获取本次调回来源consumer的版本号(dubbo或revision或release)

回答

9

实现一个 Filter(注意是 Filter 不是 ClusterFilter),通过 invoker.getUrl().getParameter("revision") 获取

需要 consumer 侧实现 Filter 把版本号发到 attachment

3

非常感谢您的解答。 如题,我们的实际场景是 dubbo 升级,现网的服务(微服务,几百个)使用的是低版本的dubbo,为了保证服务平滑兼容,我们需要一个一个的升级,但是要求在升级过程中,如果一个dubbo api的所有provider和consumer只要存在低版本的dubbo,那么协议就制动降级切换到低版本,当一个dubbo api的provider和consumer全部升级完成之后,协议自动切换到高版本。

所以我们需要在升级的服务中,针对已升级的服务,定制以下逻辑 如果本次调用是consumer侧,那么就获取provider的release 版本号,与当前consumer的release 版本号对比 如果本次调用是provider侧,那么就获取consumer的release 版本号,与当前provider的release 版本号对比

根据对比结果对协议做降级处理。

但是现在,我们的难点就在于,没有找到一个办法,完成以下逻辑: 在consumer侧获取provider的release 版本号(或dubbo 版本号) 在provider侧获取consumer的release 版本号(或dubbo 版本号)

5

你的降级是指降到其他 RPC 协议还是都是 Dubbo 协议

1

consumer 侧获取按照 url 那个逻辑应该是没问题的;provider 的话可以尝试从 attachment/attribute 里面获取下版本

7

都是dubbo 协议。老版本是dubbox的,新版本是dubbo 3的,因为编解码不同,所有需要兼容,平滑升级

7

在provider侧,编解码的时候,尝试过过一下方法,都没有获取到有用信息

  • Channel.getAttribute
  • channel.getUrl().getAttribute
  • channel.getUrl().getParameter (consumer侧不做任何设置,以及现在consumer进行设置,都没有获取到有用信息)
8

你是需要在解码的过程中处理?

4

我记得 dubbox 协议是兼容的呀