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
这里如果删除后,Invoker 正常构造,会导致在 RPC 调用过程中发现无法找到 SPI,导致 RPC 流量调用失败。这里是个尽早报错的操作。如果升级版本需要切换 Transport 这种的建议使用 version 标记接口,避免低版本的 consumer 使用这部分地址。
原回答者GitHub用户AlbumenJ
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。