arch_design - dinstone/focus GitHub Wiki

RPC原理

RPC 是远程过程调用(Remote Procedure Call)的缩写。远程指的是通过网络通信调用远程机器上的方法。而RPC框架的目的就是:让我们调用远程方法像调用本地方法一样。

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 调用过程

从上图的调用过程我们能够感受到,Focus的架构划分了5层:API层、代理层、调用层、协议层、传输层。其中API层是开放层,暴露给使用者,其它四层为内部分层,不对外开放,但对扩展者开放,扩展者可通过服务接口机制扩展框架能力。

分层模型

Focus 分层模型

  • 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传输协议。
⚠️ **GitHub.com Fallback** ⚠️