Rust 从入门到放弃,再入门到贡献 nacos-sdk-rust

news2024/12/24 10:45:54

Rust 从入门到放弃,再入门到贡献 nacos-sdk-rust

Rust 上手难度大?我想是的。从文章标题便可知一二,小编水平有限经历了多次入门,得来的经验之谈。本文不涉及详细的技术剖析,仅表达入门的心路历程,供客官参考。

1、初次入门

初听 Rust 性能彪悍,内存安全,对比 C 来的保证不会有内存泄漏;也就是说 Rust 有 C 同等的性能而又保证了内存安全。牛!!!故而尝试开启了初次入门之旅。

当时从多方搜索引擎中涉猎 Rust 相关话题和知识,ATA、知乎、Bilibili、科学上网等。

也不记得是在哪个渠道,看到说 Rust + WebAssembly 是下一代云计算的未来。

于 2022-01-17 写了如下的第一行 Rust 代码
Rust_Wasm

涉猎的资料五花八门,断断续续零零碎碎,也没有持续地编码参与项目开发,对所有权、生命周期这些核心概念没有领悟,宣告了初次入门失败

2、再次入门

历经了很长一段在放弃与相关话题的持续关注之间,还是好奇心作怪,发现最佳入门辅助手册 《Rust语言圣经(Rust Course)》,仅代表小编自我观点(英文水平不足等等)。

多次翻阅『圣经』,Rust 基础入门、所有权/借用、特征对象、生命周期、异步编程、Cargo 包管理等。搭配看一些开源社区的项目:sentinel-rust/skywalking-rust/opentelemetry-rust/dubbo-rust/… 于实际项目中的运用。

skywalking-rust 知道 tonic 的使用及查看其构建 api,发觉作为 grpc 客户端并不需要 build_server 只留 build_client,故而笔者提交了第一行 Rust Chore(tonic-build): set tonic-build.build_server(false), do not build Server code.

『圣经』推荐了好几个不错的组件:

  • serde-rs/json 超高性能的通用序列化/反序列化框架,快到上天的 JSON 库,Rust 序列化 json 的事实标准。
  • tonic 完全 Rust 实现的 gRPC 客户端和服务器端。
  • tokio-rs/tokio 最火的异步网络库,除了复杂上手难度高一些外,没有其它大的问题。tokio 团队提供了多个非常优秀的 Rust 库,用户认可度很高。
  • tokio-rs/prost tokio 出品的 Protocol Buffers 工具,简单易用,文档详细。
  • tokio-rs/tracing 强大的日志框架,同时支持 OpenTelemetry 格式,无缝打通未来的监控。

感觉时机半熟,由此决定为 Nacos 开发 Rust 版的客户端,亦作为自己上手的目标去牵引持续下去。

3、nacos-sdk-rust

始于 2022-07-06,提交 README.md 说明 Nacos 客户端与服务端的交互逻辑,客户端需要实现的能力。

简要描述 client & server 的交互

请关注 proto/nacos_grpc_service.proto 并知晓构建出客户端侧的 stub,实现同步调用 service Request.request(),流式交互 service BiRequestStream.requestBiStream()。

tonic 创建与 Nacos-server 的 gRPC 双工长链接,serde/json 适配与 server 的交互序列化;

gRPC 交互的 Payload 和 Metadata 由 Protocol Buffers 序列化,具体的 Request/Response 实体 json 格式二进制数据维护于 Payload.body,类型名字符串维护于 Metadata.type 。

有了 gRPC 双工长链接,也有了数据序列化方式,那么就是对 Request/Response 的处理逻辑啦; 而 client 会接受 server 的主动调用,故可以实现一个通用的 RequestHandler 接受 server 的请求,根据 Request 类型分发到具体的处理实现并返回对应的 Response。

而 client 请求 server 的部分,则 do it …

以上交互务必参考 java nacos-client 和 nacos-server 的实现。

3.1、异步/跨线程是极大门槛

如上的简要描述中,模型定义及序列化,朴素的编码都能写出来,而难点在于 gRPC 的交互,客户端构建后如何跨线程被使用?既能在需要的时候拿到它发起调用,又能实时捕获到服务端返回的数据然后作出处理并回应?在所有权/生命周期等约束下,异步/跨线程等应该是个极大的门槛!

遇到了难题焦头烂额,期间中断了提交,有些消沉而又继续抱着『圣经』看看并在 tracing 订阅了解中看到 tokio-rust/console,好奇它是怎么和应用交互并能实时地返回信息显示在界面上?

阅读它的源码找准了关键点,tonic 发起于应用的交互然后并发线程 loop 取得 gRPC 持续地等待服务端推送数据,然后执行逻辑。搭配看起来就很牛,谁先返回则执行其分支的 tokio::select! { xx=>, yy=>, zz=> }

  • 分支1:等候 gRPC 服务端来的数据,使用 tx: Sender 将其发往 mpsc::channel
  • 分支2:等候 rx: Receiver 接收分支1中的数据并处理;
  • 分支3:以上两个分支均不执行,则处理一些日常逻辑。

俗话说参考借鉴(抄袭)tokio-rust/console 中这部分的逻辑(拷贝过来改改)能用!数据交互不堵塞,还会断线自动重连。

3.2、gRPC 交互改用

逻辑是写好了,发觉运行不起来!总是卡在了什么地方,研究了一段时间,看 tonic 的 api 粗浅理解每次发起请求只能丢进去一个有界的 stream 流,这点在 Nacos 的交互模式里会非常难(客户端发起 stream 请求后,客户端/服务端都不会 close 结束它,而是一直持有它用作后续服务端主动推通知)决定了当前不合适。挣扎了蛮久无界流则没能发出请求,有界流难道客户端要无限重发请求?

再从『圣经』知道 tikv/grpc-rs 也是优选的 gRPC 客户端,它 wrap 了 gRPC 官方 C++ 库,看看 api 感觉可以,便尝试了确实好用。所以替换 tonic 改用 tikv/grpc-rs

3.3、加入 nacos-group

从第一行 nacos-sdk-rust 开始,两个月处于学习中的断断续续提交,然后提案由 Nacos PMC 认可故而迁入 nacos-group;随即发布了第一版 nacos-sdk=0.1.1,支持配置获取与订阅、客户端自动重连。

后来有 @onewe 同学的加入负责服务注册模块功能的开发,和我“先能用”的想法不同,他要求高,直接就从宏入手,交互模型的通用部分由宏(nacos-macro)统一生成,模型和 grpc 交互都重新定义了一番。

在框架内自定义 Event 事件抽象中 @onewe 使用了 TypeId + Any,居然有反射的韵味!大哥我大受震惊,可真是个小宝贝。

小编思维局限于 loop tokio::select!{} 一直没能优化 gRPC 交互逻辑,后来也是由 @onewe 新构建了这部分,并能自动重连、解决同一地址 gRPC 默认复用同一链接的问题。

最后历经近百次提交,完善并发布了 nacos-sdk=0.2.x 配置管理/服务注册功能均可用,包括登陆鉴权、配置解密插件。
nacos-sdk-rust-contributors

4、总结

推荐入门辅助手册 《Rust语言圣经(Rust Course)》;
总的来说 Rust 入门需要花费一些时间,最好有持续的目标去牵引。参与开源社区 Rust 项目是个相对较好的方式,会有小伙伴与你一道前行。或许你还能收获一份友谊,虽友人素未谋面。

入门后方能发觉现代不少数据库都使用 Rust 语言开发,不限于分布式存算分离 HTAP 数据库 TiDB 之下 TiKV,云原生数仓 Databend,蚂蚁开源的 CeresDB,创业中的时序数据库 GreptimeDB;亦有很多其他基础设施,微内核虚拟化安全容器 Kata-Containers,隐私计算 Teaclave (Apache incubating) and so on…

大名鼎鼎的 Linus(竖中指.jpg)都已接纳 Rust on Linux,你不来试试嘛?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7配置nfs

NFS NFS 就是 Network FileSystem ,此系统可以让不同操作系统、不同主机通过网络彼此分享文件,可以将其视为一个文件服务器。使用NFS可以将远程NFS服务器的分享目录挂载到本地主机上,本地主机访问共享目录就是访问远程的NFS服务器。本地主机被称为客户端…

Nacos 简介与 本地调试环境搭建

目录 1、简介 2、Nacos架构 3、本地调试环境搭建 3.1 源码下载 3.3 单机启动 Nacos 3.4 集群方式启动:基于文件方式 4、Nacos源码模块介绍 5. 约定说明 1、简介 Nacos是Dynamic Naming and Configuration Service的首字母简称 Nacos由阿里巴巴开源&#x…

PyTorch入门

开发环境 ANACONDA 官网:Anaconda | The World’s Most Popular Data Science Platform cmd窗口验证安装成功 CUDA 官网:CUDA Toolkit Archive | NVIDIA Developer 选择匹配pytorch的版本下载安装 命令窗口验证安装成功 PyTorch 官网:…

【JavaSE】泛型

目录 一、泛型概念 二、泛型的语法 1、语法 2、实例化 4、泛型如何编译 5、泛型的上界 6、泛型方法 三、通配符 1、使用场景 2、使用 3、通配符的上下界 一、泛型概念 泛型就是适用于许多许多类型,是在jdk1.5引入的 二、泛型的语法 1、语法 class 类名&l…

Apache Hudi Table Query Types

目录 Table Types​ Query types​​​​​​​ Copy On Write Table Merge On Read ​​​​​​​Table & Query Types | Apache Hudi Hudi表类型定义了如何在DFS上对数据进行索引和布局,以及如何在这样的组织之上实现上述原语和时间线活动&#…

区块链入门的几个基本问题

目录前言比特币区块链区块链大揭秘抛砖引玉故事一故事二总结引人入胜侃侃而谈去中心化开放性不可篡改性相关技术共识机制共识机制的两大核心达成共识的主要过程(产生新区块的过程)工作量如何理解?Hash计算Bits和目标Hash值Merkle Root双花问题…

新手python学什么最吃香?

前言 今天跟大家聊聊Python的几个主要发展和就业方向,给准备学习Python的小伙伴解惑。 “ 我想学Python,但是学完Python后都能干啥?” “ 现在学Python,哪个方向最简单?哪个方向最吃香?” “ …… ” …

LeetCode题解 二叉树(五):226 翻转二叉树;101 对称二叉树;100 相同的树;572 另一个树的子树

226 翻转二叉树 easy 这道题有一段广为人知的传说:曾有人说Homebrew(适用于macOS和Linux的开源软件包管理器)的作者Max Howell,没有在白板上写出这道题目,被Google拒绝了。 至于是不是真的因为没做出来这道题就被拒绝…

深入浅出JVM之执行引擎的解释执行与编译执行

本篇文章围绕执行引擎,深入浅出的解析执行引擎中解释器与编译器的解释执行和编译执行、执行引擎的执行方式、逃逸分析带来的栈上分配、锁消除、标量替换等优化以及即时编译器编译对热点代码的探测 执行引擎 hotspot执行引擎结构图 执行引擎分为解释器、JIT即时编译…

大数据框架Hadoop篇之Hadoop入门

1. 写在前面 今天开始,想开启大数据框架学习的一个新系列,之前在学校的时候就会大数据相关技术很是好奇,但苦于没有实践场景,对这些东西并没有什么体会,到公司之后,我越发觉得大数据的相关知识很重要&…

Jmeter(二十二):硬件性能监控指标

硬件性能监控指标 一、性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况,最大的用户数 2.平均响应时间ART,找出时间较长的业务 3.每秒事务数TPS,服务器的处理能力 性能测试涉及的内容 1.客户端性能测试:web前…

洛谷——【入门2】分支结构

文章目录题单简介【深基1-2】小学数学 N 合一题目描述问题 1问题 2问题 3问题 4问题 5问题 6问题 7问题 8问题 9问题 10问题 11问题 12问题 13问题 14输入格式输出格式样例 #1样例输入 #1样例输出 #1提示AC代码【深基2.习6】Apples Prologue / 苹果和虫子题目描述输入格式输出格…

尝鲜:SpreadJS-en已出 16.0 SpreadJS-cn 16.0-23年1月出

此次版本更新将带来众多的增强功能,而其中新的文件结构尤为重要,是近几个版本中最重要的架构级更新! 其设计目标是 *减少 SSJSON 的体积,平均减小到原来 30% *提供按需加载(Lazyload)能力,相对…

【学习】https://gitee.com/DingJiaxiong

【学习】https://gitee.com/DingJiaxiong 文章目录【学习】<https://gitee.com/DingJiaxiong>0 前言1 Java SE2 Java Web3 Maven基础4 Git5 SSM框架6 MybatisPlus7 SpringBoot0 前言 事情是这样&#xff0c;我准备把之前所有的笔记都放到Gitee 上了 不用GitHub … 就别问…

Spring的AOP切面应用对【后台对接口增强】

目录&#x1f4da;简介&#xff1a;&#x1f4a8;切面表达式&#xff1a;&#x1f4ad;切面通知类型&#xff1a;&#x1f5fa;️创建项目演示&#xff1a;&#x1f3a2;创建项目&#xff1a;&#x1f383;添加依赖&#xff1a;&#x1f4a8;编写切面类&#xff1a;&#x1f68…

前端显示分页详解

我们在浏览页面的时候&#xff0c;是不是经常看到网页经常是以页面的形式给我们展现出来的&#xff0c;我们以淘宝的页面为例&#xff08;如下图&#xff09;&#xff0c;那这样按照页面呈现有什么好处呢&#xff1f;这篇文章让我们来深入探究了解这其中的奥秘。 优点&#xff…

泛型自动装箱

目录 前言 泛型 1.泛型的目的 2.泛型存在的意义和注意事项&#xff1a; 3.擦除机制 4.泛型的边界 5.泛型方法&#xff1a; 包装类&#xff1a; 前言 只要知道《》是啥意思&#xff0c;其他了解即可 泛型的上界 通配符简单知道就行 泛型 1.泛型的目的 指定当前的容器&am…

【JVM】浅析程序计数器与虚拟机栈

文章目录1. 程序计数器2. 虚拟机栈3. 栈内存溢出1. 程序计数器 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 程序计数器的作用是什么&#xff1f; 是记录下一条JVM指令的执行地址行号 程序计数器有什么特点&#xff1f; 线程私有的不会存在内存溢出 …

ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度传感器的子卡&#xff0c;插在这个板子上&#xff0c;然后写了一些有意思的应用程序。 硬件实现原理…

Linux——定制Linux

Linux启动流程 首先&#xff0c;Linux要通过自检&#xff0c;检查硬件设备有没有故障如果有多块启动盘的话&#xff0c;需要在BIOS选择启动磁盘启动MBR中的bootloader引导程序加载内核文件执行所有进程的父进程、老祖宗systemd欢迎界面 加载内核文件的关键文件 kernel文件&a…