高性能 RPC 框架 Focus 架构解析
2023 年 9 月 24 日,Focus 发布了 1.0.0 版本。对于 1.0 来说,意味着架构的稳定,现在对 Focus 的架构做一个简单的分析。
RPC 原理
RPC 是远程过程调用(Remote Procedure Call)的缩写。远程指的是通过网络通信调用远程机器上的方法。而 RPC 框架的目的就是:让我们调用远程方法像调用本地方法一样。
RPC 的一般调用过程如下:
基于如上 RPC 调用原理,随着软件架构的演进,RPC 框架也有了长足的发展,根据能力可以清晰的划分出 3 代:
第一代:简单的 RPC 调用,满足基本的信息交换目的。代表框架有:xml-rpc、json-rpc、soap-rpc。
第二代:具有服务治理、服务发现能力的 RPC 框架。代表框架有:dubbo、sofa-RPC、zRPC。
第三代:具有跨语言、跨环境、跨平台能力的服务网格。代表框架有:SOFA-Mesh、Istio、Kuma。
Focus 架构
Focus 脱胎于之前实现的第一代 RPC 框架:Json-RPC、Notify 和第二代 RPC 框架JRPC。可用于移动端、云端编程环境。
架构原则
零侵入。RPC 框架代码无需侵入业务代码,业务代码无需,简化使用、保持相互隔离和演进。
跨环境。考虑移动端、云端编程模型的差异,最小化核心包及依赖,功能组件模块化、可插拔,按需加载。
跨语言。在微服务架构模式下,跨语言成为 RPC 框架必须具备的一个特性。而跨语言会给架构带来很大的挑战,如 API 易用性、序列化的兼容、性能问题会对框架的优雅实现提出挑战。
得益于之前 RPC 框架实现所积累的经验,Focus 在架构上很好的解决了以上问题。
在这里,给自己动手实现 RPC 框架的同学一些建议,开发一个好用、高性能的工业级框架,一般会经历三个阶段:功能试错、架构增强、性能优化。
功能试错阶段:先考虑都有哪些功能,将要实现哪些功能,这些功能的可能实现方案有哪些?使用场景及使用方式有哪些?
架构增强阶段:在可扩展性、兼容性、易维护性等方面持续打磨,思考如何在实现层面落地架构设计。
性能优化阶段:对序列化、编解码、传输协议、对象创建、线程模型等做优化处理。
”书读百遍,不如手过一遍“,相信你动手实践一遍后,会对 RPC 框架、网络编程、OOD&OOP、框架设计理解的更深刻。
架构设计
调用过程
从上图的调用过程我们能够感受到,Focus 的架构划分了 5 层:API 层、代理层、调用层、协议层、传输层。其中 API 层是开放层,暴露给使用者,其它四层为内部分层,不对外开放,但对扩展者开放,扩展者可通过服务接口机制扩展框架能力。
分层模型
API 层: 为服务消费和服务发布提供 API,管理整个框架的资源。
代理层:构建服务引用 stub 和服务实现 stub。引用 stub 收集请求信息发起调用,实现 stub 调用服务接口实现完成请求处理。
调用层:实现服务调用,关注服务发现、路由、负载均衡、限流、熔断、可观测性等服务治理能力。
协议层:抽象 RPC 协议对象,考虑协议序列化和压缩方式。
传输层:将抽象的 RPC 协议对象编解码成传输字节,交由相应的传输对象做信息交换。
工程模型
核心模块:最小化核心包及依赖,功能组件模块化、可插拔,按需加载。
focus-core,focus-client,focus-server,focus-serialize、focus-transport。
可扩展的模块:
clutch 模块,负责服务注册发现。当前已实现了 nacos、zookeeper、consul、polaris 接入。
serialize 模块,负责序列化。当前已集成 json、protobuf、protostuff 序列化。
compress 模块,负责压缩。当前已实现 gzip、snappy、lz4 压缩算法的集成。
telemetry 模块,负责 logging、tracing、metric 可观测性能力的集成。
transport 模块,负责网络连接和消息传输,实现 RPC 消息交互协议。当前已实现 photon 传输协议和 http2 传输协议。
评论