arch_design - dinstone/focus GitHub Wiki
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 脱胎于之前实现的第一代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-compress # 压缩实现
│ ├── focus-compress-core
│ ├── focus-compress-gzip
│ ├── focus-compress-lz4
│ └── focus-compress-snappy
├── focus-core # RPC核心模型
├── 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。
可扩展的模块:
- serialize模块,负责序列化。当前已集成 json、protobuf、protostuff序列化。
- compress模块,负责压缩。当前已实现gzip、snappy、lz4压缩算法的集成。
- telemetry模块,负责logging、tracing、metric可观测性能力的集成。
- transport模块,负责网络连接和消息传输,实现RPC消息交互协议。当前已实现photon传输协议和http2传输协议。