写点什么

高性能 RPC 框架 Focus 架构解析

作者:dinstone
  • 2023-10-26
    北京
  • 本文字数:2020 字

    阅读完需:约 7 分钟

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-client # 客户端API│   ├── focus-client-core│   ├── focus-client-http2│   └── focus-client-photon├── focus-clutch # 服务注册发现│   ├── focus-clutch-consul│   ├── focus-clutch-core│   ├── focus-clutch-nacos│   ├── focus-clutch-polaris│   └── focus-clutch-zookeeper├── focus-compress  # 压缩实现│   ├── focus-compress-core│   ├── focus-compress-gzip│   ├── focus-compress-lz4│   └── focus-compress-snappy├── focus-core  # 核心模型├── focus-polaris # Polaris服务治理平台集成│   ├── focus-polaris-client│   └── focus-polaris-server├── focus-serialize # 序列化实现│   ├── focus-serialize-core│   ├── focus-serialize-json│   ├── focus-serialize-protobuf│   └── focus-serialize-protostuff├── focus-server   # 服务端API│   ├── focus-server-core│   ├── focus-server-http2│   └── focus-server-photon├── focus-starter   # spring-boot集成│   ├── focus-client-starter│   └── focus-server-starter├── focus-telemetry # 服务可观测性├── focus-transport # 传输层实现│   ├── focus-transport-core│   ├── focus-transport-http2│   └── focus-transport-photon
复制代码


核心模块:最小化核心包及依赖,功能组件模块化、可插拔,按需加载。


  • 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 传输协议。

用户头像

dinstone

关注

天命之谓性,率性之谓道,修道之谓教。 2008-11-12 加入

一个热爱编程的架构师,在网络编程方面有一些惨痛经验。

评论

发布
暂无评论
高性能 RPC 框架 Focus 架构解析_RPC_dinstone_InfoQ写作社区