Volo新能力
如果无法正常显示,请先停止浏览器的去广告插件。
1. Volo 新能力
面向性能和易用性的框架迭代
王杰
Jie Wang
2. 目录 |Contents
Part 01
Volo 简介
Part 02
RPC 框架迭代
Part 04
Part 03
HTTP 框架迭代 Rust 生态及展望
3. 01
Volo 简介
致力于 Rust 微服务生态的高性能框架
4. Volo 目标 & 现状
目标
•极致性能
•易用性
•可扩展性
核心抽象
•codec/protocol/net
•sd/lb
•context
5. Volo 目标 & 现状
目标
•
•
•
极致性能
易用性
易扩展
实现
•
协议
•
•
•
•
中间件系统
•
•
•
•
•
限流
重试
超时
MLT
传输层
•
•
•
volo-thrift
volo-grpc
volo-http
TCP
TLS
Tokio Runtime
6. Volo 目标 & 现状
目标
•极致性能
•易用性
•易扩展
重要模块
•
pilota
•thrift
•protobuf
•metainfo
•volo-cli
•
volo.yml
7. Volo 优势 & 落地
优势
•
统一抽象
•协议
•治理
•传输
•高性能
•微服务工程化
落地
•多业务线
•多服务
•go -> rust 平均 CPU
收益 40% - 50%
8. 02
RPC 框架迭代
Protobuf Unknown Fields、Protobuf Options、Thrift Field
Mask
9. RPC 框架迭代
Protobuf Unknown Fields
•Google Protobuf 协议扩展
•贴合 Volo-build 现有生态,接入简单
•关注性能,全链路零拷贝
01
Protobuf Options
•Google Protobuf 协议扩展
•内置支持了用于控制生成代码的注解,对齐 pilota thrift 的实现
•关注易用性,提供自定义注解解析和获取的易用方法
02
Thrift Field Mask
•IDL Request 运行时动态裁剪能力
•对齐 Kitex 生态,支持 Thrift Path 解析器
•支持用户 API,并在生成代码中自适应裁剪
03
10. RPC 框架迭代——PB Unknown Fields
• Google PB Unknown Fields
Step 1 volo init 创建项目
定义
•老版本兼容新版本定义
•跨链路传递减少强制同步升级
• Volo 用户接入
•volo-cli 一键创建服务
•volo.yml 配置开启
• Volo 接口
•
_unknown_fields 字段
• 注意事项
•
新增的透传字段放到最后
Step 2 编辑 volo.yml 开启 keep_unknown_fields
11. RPC 框架迭代——PB Unknown Fields
12. RPC 框架迭代——PB Unknown Fields
13. RPC 框架迭代——PB Unknown Fields
演进方向:短路优化
•
优化思路:当读完所有已知字段后,后续所有的bytes 一次性载入
unknown fields 列表中
•
优化障碍:根据 pb 官方定义,repeated 字段的元素类型为 string、
bytes 或者 message,是不被要求连续出现的,而标量类型也可以标
注为非 packed 编码方式,这样也会允许不连续出现。
•
使用建议:把新增透传字段放在最后,序列号递增
14. RPC 框架迭代——PB Options
• PB Options 用途
•
•
pilota 注解:提供编解码控制能力
用户自定义注解:业务相关数据
• Volo 用户接入
•
•
•
volo-cli 一键创建服务
volo.yml 配置开启
proto idl 中使用注解
• Volo 接口
•
•
exts_{filename} mod
::pilota::pb::extension::*
• 注意事项
•
•
Step 1 volo init 创建项目
自定义注解需要规避 google 和
pilota 定义的注解 tag id
自定义注解可能需要使用
touch_all 配置
Step 2 编辑 volo.yml 开启 with_descriptor
15. RPC 框架迭代——PB Options
PB IDL
16. RPC 框架迭代——PB Options
pilota.rust_wrapper_arc_all = true
17. RPC 框架迭代——PB Options
pilota.proto
级别注解名(pilota.xxx)类型 作用
servicerust_wrapper_arc_allbool标注是否在生成代码中对所有的方法中的 request 和 response 结构体使用 Arc
messageserde_attribute_messagestring为消息添加 serde 的任意 attribute
name_messagestring指定生成代码中消息的名字
rust_wrapper_arcbool标注对某个字段是否使用 Arc
serde_attribute_fieldstring为字段添加 serde 的任意 attribute
name_fieldstring指定生成代码中字段的名字
rust_typestring指定生成代码中字段的类型
optional_repeatedbool指定 repeated 字段为 optional,会生成 Option<Vec>
serde_attribute_enumstring为 enum 添加 serde 的任意 attribute
name_enumstring指定生成代码中 enum 的名字
serde_attribute_enum_valuestring为 enum value 添加 serde 的任意 attribute
field
enum
enumvalue
18. RPC 框架迭代——PB Options
custom options
19. RPC 框架迭代——PB Options
PB File Descriptor & Extension Mod
20. RPC 框架迭代——PB Options
演进方向:pb custom options 的性能和可扩展性提升
•pb descriptor 在生成代码中提供更多易用方法
•pb custom options 的使用有些情况需要开启 touch_all,这样会带来 build 阶段
的性能损失,也带来了更大的代码体积,后续会沿用按需生成的方式来处理注解
•
在 pilota 中提供更多 hook 点
•
目前我们仅支持在 rir 层提供 plugin 能力,所以用户仅能在这一层获取自定义
注解,控制生成代码的行为
21. RPC 框架迭代——Thrift Field Mask
• Thrift Field Mask
•
•
•
减少传输带宽和编解码开销
gateway/proxy 服务统一 idl
字段权限控制
• Volo 用户接入
•
•
volo-cli 一键创建服务
volo.yml 配置开启
• Volo 接口
•
•
::pilota_thrift_reflect::*
::pilota_thrift_fieldmask::*
• 注意事项
•
使用全局缓存,减少 path 计算
开销对主路径的影响
Step 1 volo init 创建项目
Step 2 编辑 volo.yml 开启 with_descriptor 和 with_field_mask
22. RPC 框架迭代——Thrift Field Mask
Thrift Field Mask
• 构建:thrift path + thrift
descriptor
• 黑白名单模式
• 全局 cache
23. RPC 框架迭代——Thrift Field Mask
Thrift Path 定义
24. RPC 框架迭代——Thrift Field Mask
Thrift Descriptor
25. RPC 框架迭代——Thrift Field Mask
Thrift Field Mask - 动态裁剪
•
创建 rpc request 时,将对应的
fieldmask 设置到结构体中
•
生成代码中进行动态裁剪
26. RPC 框架迭代——Thrift Field Mask
Thrift Field Mask API
•path_in_mask
•get_path
•for_each_child
后续演进
•
fieldmask 序列化与传递
27. 03
HTTP 框架迭代
HTTP/2、连接池、Trace
28. HTTP 框架迭代
新功能:HTTP/2
•通过 feature 控制协议版本
•默认 feature 为 http1
01
客户端的易用性与性能
•关注性能,为客户端支持连接池
•优化 Client 封装方式,使用 BoxService 去除复杂泛型带来的编
02
程和调试负担
易用性:Trace
•
面向可观测性,提供了 SpanProvider
03
29. 04
Rust 生态与展望
volo、sonic-rs 等 rust 生态的演进方向
30. Rust 生态更新
sonic-rs 0.5
•多架构支持,ARM 支持
•新增 feature,例如 sort_keys, utf8-lossy
•提升 object 类型查询性能
01
faststr
•
实现 GDB/LLDB 调试插件
02
linkedbytes
•支持 io slice
•支持 concat 接口获取完整 bytes
03
31. Rust 生态展望
2025 年后续规划
RPC 框架
•协议扩展:Thrift MultiService、Thrift Streaming
•性能:Shmipc
•易用性:pilota-build 错误重构;完善服务发现和服务治理组件;
01
trace 优化
Rust 生态
•faststr 大小优化
•…
02
32. THANKS