1. 为什么要支持多协议?
既然应用之间的通信都是通过 RPC 来完成的,而能够完成 RPC 通信的工具有很多,比如像 Web Service、Hessian、gRPC 等都可以用来充当 RPC 使用。这些不同的 RPC 框架都是随着互联网技术的发展而慢慢涌现出来的,而这些 RPC 框架可能在不同时期会被我们引入到不同的项目中解决当时应用之间的通信问题,这样就导致我们线上的生成环境中存在各种各样的 RPC 框架。
很显然,这种混乱使用 RPC 框架的方式肯定不利于公司技术栈的管理,最明显的一个特点就是我们维护 RPC 框架的成本越来越高,因为每种 RPC 框架都需要有专人去负责升级维护。
为了解决早期遗留的一些技术负债,我们通常会去选择更高级的、更好用的工具来解决,治理RPC框架混乱的问题也是一样。为了解决同时维护多个 RPC 框架的困难,我们肯定希望能够用统一用一种 RPC 框架来替代线上所有的 RPC 框架,这样不仅能降低我们的维护成本,而且还可以让我们在一种 RPC 上面去精进。
2. 方案
在线上环境中兼容多种RPC(远程过程调用)协议的主要目标是确保不同协议间的服务能够相互通信和协作。以下是一些建议,以实现多种RPC协议的兼容性:
- 协议网关:使用协议网关在不同RPC协议之间进行转换。协议网关可以把一个协议的请求转换为另一个协议的请求,从而实现不同协议间的互通。例如,将gRPC请求转换为JSON-RPC请求。
- 服务抽象:将服务抽象成通用的接口,以便不同的RPC协议实现可以共享相同的服务定义。通过将服务定义与具体的RPC协议解耦,可以更容易地支持多种协议。
- 适配器模式:在服务实现中使用适配器模式,使得不同的RPC协议可以使用同一套后端代码。适配器可以根据需要将不同协议的请求和响应转换成统一的格式,以便后端处理。
- 微服务架构:通过将系统划分为多个独立的微服务,可以为每个服务选择最合适的RPC协议。这种方式可以在保持整个系统的可扩展性和可维护性的同时,允许不同的服务使用不同的RPC协议。
- 统一服务注册和发现:为了实现不同RPC协议之间的服务发现和负载均衡,需要使用统一的服务注册和发现机制。这可以通过使用类似于Consul、Etcd或Zookeeper等服务注册中心实现。
- 监控和跟踪:确保跨多种RPC协议的分布式跟踪和监控。选择一种支持多种协议的监控工具,如Prometheus或Jaeger,以便收集和分析来自不同协议的性能指标和调用链信息。
- 文档和示例:编写清晰的文档和示例,以演示如何在同一系统中使用不同的RPC协议。这将帮助开发人员更容易地理解和实现多协议兼容性。
通过遵循以上建议,可以在线上环境中实现多种RPC协议的兼容性。然而,实际操作中可能会遇到不同的挑战,因此在设计和实施过程中,需要根据具体需求和场景进行调整。
3. 总结
在我们日常开发的过程中,最难的环节不是从 0 到 1 完成一个新应用的开发,而是把一个 老应用通过架构升级完成从 70 分到 80 分的跳跃。因为在老应用升级的过程中,我们不仅需要考虑既有的功能逻辑,也需要考虑切换到新架构上的成本,这就要求我们在设计新架构的时候要考虑如何让老应用能够平滑地升级,就像在 RPC 里面支持多协议一样。
在 RPC 里面支持多协议,不仅能让我们更从容地推进应用 RPC 的升级,还能为未来在RPC里面扩展新协议奠定一个良好的基础。所以我们平时在设计应用架构的时候,不仅要考虑应用自身功能的完整性,还需要考虑应用的可运维性,以及是否能平滑升级等一些软性能力。