共计 1804 个字符,预计需要花费 5 分钟才能阅读完成。
作者:王铁举
CloudWeGo 子项目 Frugal 已正式开源。
我的项目定位 :Frugal 是一款 不必生成编解码代码 的基于 JIT 编译技术的高性能动静 Thrift 编解码器。
我的项目地址:https://github.com/cloudwego/frugal
Thrift 作为一个高性能编解码协定,在 CloudWeGo 里被宽泛应用。因为其必须生成数量较大的编解码代码,给我的项目开发治理和代码 Review 带去了诸多不便。Thrift 编解码库和 Go 语言编译器的应用,也给性能优化造成了妨碍。
因而,CloudWeGo 团队开发了 Frugal 我的项目。
在性能上,通过应用 JIT 编译技术,Frugal 带来了更强的编解码性能,能够达到 传统编解码形式的 5 倍 ;在易用性上,Frugal 不需生成编解码代码, 极大地改善了用户的应用体验。
01 Frugal 的特点
无需生成代码
传统的 Thrift 编解码形式,要求用户必须要学生成编解码代码,不仅减少了用户应用累赘,而且后续的变更可能带来大量的改变,导致代码 Review 难度大增。
通过 JIT 技术在运行时动静生成编解码机器代码,Frugal 能帮忙开发者防止这一问题。
高性能
在多核场景下,Frugal 的性能能够达到传统编解码形式的 5 倍!
用户通过应用 Frugal 不再须要生成编解码代码。团队基于 JIT 技术生成了比 Go 语言编译器性能更好的机器代码,使得 Frugal 在进行 Thrift 编解码时,比传统通过生成代码进行编解码的形式性能体现更佳。
稳定性
Frugal 的稳定性曾经通过了团队外部的严格验证。
团队应用了 Thrift 大仓库中的 Thrift 文件进行测试,总计 21307 个 Thrift 文件,全副通过了编解码测试。
02 用 Frugal 能够做什么?
配合 Kitex 应用
搭配 Kitex 框架应用,用户不需再生成大量的编解码代码,使仓库变得洁净整洁,Review 时也不必再带上一堆无意义的 Diff,性能也更加优越。
配合 Thriftgo 做 Thrift IDL 的编解码
如果只须要应用 Thrift 的编解码能力,同时也定义好了 IDL,那么只须要用 Thriftgo 生成 IDL 对应的 Go 语言 Struct,就能够轻松应用 Frugal 的编解码能力。
间接定义 struct 进行编解码
更简略的应用形式,能够间接定义好 Go 语言 Struct 后,给每个 Field 带上 Frugal 所需的 Tag,就能够间接应用 Frugal 进行编解码了。
03 使用手册
配合 Kitex 应用
- 更新 Kitex 到 Frugal_test 分支。
- 带上 -thrift frugal_tag 参数从新生成一次代码。
- 初始化 Client 和 Server 时应用 WithPayloadCodec(thrift.NewThriftFrugalCodec()) Option。
Client 示例:
Server 示例:
配合 Thriftgo 做 Thrift IDL 的编解码
- 编写 Thrift 文件。
当初假如咱们有如下 Thrift 文件,My.thrift:
- 应用 Thriftgo 生成代码。
定义好须要的 Thrift 文件后,在应用 Thriftgo 生成 Go 语言代码时应用 frugal_tag 参数。
示例:
- 应用 Frugal 进行编解码。
生成所须要的构造体后,间接应用 Frugal 进行编解码即可。
示例:
间接定义 Struct 进行编解码
- 定义 Struct。
当初假如咱们须要如下 Struct:
- 给构造体字段增加 Tag。
Frugal 中所须要的 Tag 是形如 frugal:”1,default,string”,其中 1 为字段 ID,default 为字段的 Requiredness,string 示意字段的类型。上述的 MyStruct 能够增加如下 Tag:
上面是残缺的类型示例:
- 应用 Frugal 进行编解码。
间接应用 Frugal 进行编解码即可。
示例:
04 瞻望
- 下一个版本 Kitex 将默认集成 Frugal,用户不再须要应用 Feature 分支来进行应用。
- Frugal 将继续进行 SSA 后端,包含 SIMD 指令优化等个性的实现,预计在后续版本,将会带来性能更大幅度的晋升。
我的项目地址
GitHub:https://github.com/cloudwego
官网:www.cloudwego.io
流动预报
5 月,CloudWeGo 社区第一期源码解读流动曾经上线,欢送大家继续关注并积极参与。流动地址:https://github.com/cloudwego/community/issues/24。