高性能动态 Thrift 编解码器 — CloudWeGo 子项目 Frugal 正式开源

本文主要是介绍高性能动态 Thrift 编解码器 — CloudWeGo 子项目 Frugal 正式开源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:王铁举

CloudWeGo 子项目 Frugal 已正式开源。

项目定位:Frugal 是一款不用生成编解码代码的基于 JIT 编译技术的高性能动态 Thrift 编解码器。

项目地址:https://github.com/cloudwego/frugal

Thrift 作为一个高性能编解码协议,在 CloudWeGo 里被广泛使用。由于其必须生成数量较大的编解码代码,给项目开发管理和代码 Review 带去了诸多不便。 Thrift 编解码库和 Go 语言编译器的使用,也给性能优化造成了阻碍。

因此,CloudWeGo 团队开发了 Frugal 项目。 

在性能上,通过使用 JIT 编译技术,Frugal 带来了更强的编解码性能,可以达到传统编解码方式的 ;在易用性上,Frugal 不需生成编解码代码,极大地改善了用户的使用体验。 

01 Frugal 的特点

无需生成代码

传统的 Thrift 编解码方式,要求用户必须要先生成编解码代码,不仅增加了用户使用负担,而且后续的变更可能带来大量的改动,导致代码 Review 难度大增。

通过 JIT 技术在运行时动态生成编解码机器代码, Frugal 能帮助开发者避免这一问题。

高性能

在多核场景下,Frugal 的性能可以达到传统编解码方式的 倍!

用户通过使用 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

这篇关于高性能动态 Thrift 编解码器 — CloudWeGo 子项目 Frugal 正式开源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234291

相关文章

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

无需邀请码!Manus复刻开源版OpenManus下载安装与体验

《无需邀请码!Manus复刻开源版OpenManus下载安装与体验》Manus的完美复刻开源版OpenManus安装与体验,无需邀请码,手把手教你如何在本地安装与配置Manus的开源版OpenManu... Manus是什么?Manus 是 Monica 团队推出的全球首款通用型 AI Agent。Man

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...