开发者社区 > 云原生 > 正文

关于DubboProtocol#initClient() 中 client type校验问题

dubbo中用到了SPI技术,比如在Transporter 中,可以分别自定义server和client; 但在DubboProtocol#initClient() 有这样一段校验:

// client type setting. String str = url.getParameter(CLIENT_KEY, url.getParameter(SERVER_KEY, DEFAULT_REMOTING_CLIENT));

// BIO is not allowed since it has severe performance issue. if (str != null && str.length() > 0 && !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str)) { throw new RpcException("Unsupported client type: " + str + "," + " supported client type is " + StringUtils.join(ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions(), " ")); }

即client端如果没有配置,会默认使用server的配置。

这样会导致一个问题,即在生产环境中,如果有多个consumer业务方,如果provider先上线,会导致client端报"Unsupported client type: " ,只能等consumer端所有业务都上线后,才能上线provider端。

Transporter 分别配置了client 和server,目的就是可以分别配置,例如mynetty,如果有了上述检查,无法做到平滑上线。

此处检查,是否可以删除?删除后会导致什么后果?或者有什么平滑上线方案?

原提问者GitHub用户fsx379

展开
收起
大圣东游 2023-05-11 20:06:32 131 0
1 条回答
写回答
取消 提交回答
  • 这里如果删除后,Invoker 正常构造,会导致在 RPC 调用过程中发现无法找到 SPI,导致 RPC 流量调用失败。这里是个尽早报错的操作。如果升级版本需要切换 Transport 这种的建议使用 version 标记接口,避免低版本的 consumer 使用这部分地址。

    原回答者GitHub用户AlbumenJ

    2023-05-12 11:09:13
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载