辉夜的博客

繁花似锦,辉夜如昼

0%

RPC框架设计侧重点, 特色和架构调研

Volo调研

Volo 是字节跳动服务框架团队研发的轻量级、高性能、可扩展性强、易用性好的 Rust RPC 框架,使用了 Rust 最新的 GAT 特性。

特色-易用性

具体来说,这个框架使用了motore中间件, 而其使用GAT语法完成了高效的异步接口

Rust不支持一个async trait, 一般的解决方法是使用Box(类似智能指针)来完成这件事情, 但这会带来额外的开销并且降低代码可读性. 有一个使用宏完成用Box实现异步接口的Crate

具体细节可能需要进一步理解一些Rust的语言特性

架构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
├─volo          RPC框架的通用组件
│ └─src
│ ├─discovery #服务发现:一些接口,一种简单实现(返回静态单链表)
│ ├─loadbalance #负载均衡:同上(加权随机)
│ ├─net #网络链接: probe创建套接字,dial建立连接,incomming进行监听,conn进行读写
│ └─util #工具: buf_reader
| #
├─volo-build #编译用
│ └─src
├─volo-cli #用户界面
│ └─...
├─volo-grpc #grpc框架
│ └─src
│ ├─client #客户端底层组件
│ ├─codec #编解码器
│ ├─layer #待调研,类似某种封装tonic/src/metadata
│ │ └─loadbalance
│ ├─metadata
│ ├─server #服务端底层组件
│ └─transport
... #从tonic/src/中copy并修改了一些文件,完成rpc的请求响应相关工作
├─volo-macros #宏
│ └─src
└─volo-thrift #thrift框架
└─src
├─client
│ └─layer
├─codec
├─protocol
└─transport
├─pingpong
└─pool

如何用Volo的特色实现grpc
架构图

erpc

传输层(串口),嵌入式,代码生成(结合nanopb)

erpc项目地址及其详细文档

侧重点

嵌入式,轻量化

框架图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
├─erpcgen           #代码生成工具
├─erpcsniffer
│ └─src
├─erpc_c #基础架构
│ ├─config #config.h配置文件
│ └─infra
| ├─ erpc_arbitrated_client_manager.cpp
| ├─ erpc_arbitrated_client_manager.hpp
| ├─ erpc_basic_codec.cpp #基础编解码器
| ├─ erpc_basic_codec.hpp
| ├─ erpc_client_manager.cpp
| ├─ erpc_client_manager.h
| ├─ erpc_client_server_common.hpp
| ├─ erpc_codec.hpp #编解码器抽象定义
| ├─ erpc_common.h #状态码枚举类型的定义
| ├─ erpc_crc16.cpp
| ├─ erpc_crc16.hpp
| ├─ erpc_framed_transport.cpp
| ├─ erpc_framed_transport.hpp
| ├─ erpc_manually_constructed.hpp
| ├─ erpc_message_buffer.cpp
| ├─ erpc_message_buffer.hpp
| ├─ erpc_message_loggers.cpp
| ├─ erpc_message_loggers.hpp
| ├─ erpc_pre_post_action.cpp
| ├─ erpc_pre_post_action.h
| ├─ erpc_server.cpp
| ├─ erpc_server.hpp #Service和Server的抽象接口,注册移除服务,处理信息等
| ├─ erpc_simple_server.cpp #
| ├─ erpc_simple_server.hpp
| ├─ erpc_static_queue.hpp #数组实现的队列
| ├─ erpc_transport.hpp #Transport
| ├─ erpc_transport_arbitrator.cpp
| ├─ erpc_transport_arbitrator.hpp
| ├─ erpc_version.h
| ├─ infra.dox
│ ├─port #便于移植
│ ├─setup #C语言接口
│ └─transports #支持不同通信方法的工具类
├─erpc_python
│ └─erpc
...
  • rtos上的 protobuf-c
  • erpc 传输层 nanopb
  • volo 语法特性
  • motan dubbo 事件逻辑