长沙做网站公司合肥网站建设司图
web/
2025/9/26 13:05:35/
文章来源:
长沙做网站公司,合肥网站建设司图,建立修仙大学,网站建设华网天下公司使用Rust有一段时间了#xff0c;期间尝试过使用Rust做后端开发、命令行工具开发#xff0c;以及做端侧模型部署#xff0c;也尝试过交叉编译、FFI调用等#xff0c;也算是基本入门了。在用Rust做后端接口开发时#xff0c;常常会找不到一些合适库#xff0c;而这些库在J…使用Rust有一段时间了期间尝试过使用Rust做后端开发、命令行工具开发以及做端侧模型部署也尝试过交叉编译、FFI调用等也算是基本入门了。在用Rust做后端接口开发时常常会找不到一些合适库而这些库在Java中却很常见于是在此汇总一下后Rust后端开发中常用的一些库。 基础框架 首先是基础web开发框架在Java中最常用的就是Spring了而Spring其实不单单是一个开发框架而是一整个完整的生态。其中的SpringBoot更是做了很好的封装屏蔽了非常多的细节这也导致了从Java系的web开发转到Rust时会遇到很多问题。而在Rust中显然没有向Spring一样完整的生态支持所以需要我们自己把各个模块组装在一起。 可选项axum、actix-web、warp、rocket 从使用方式和使用难度上来说大同小异axum和rocket可能会更容易上手一点个人目前使用rocket稍微多一点它也支持通过类似于Spring注解的方式来定义接口支持参数映射。但是它似乎没有和SpringBoot类似的参数校验工具比如校验最大最小值、参数长度等目前只能自己实现相关trait来校验了还没有发现一个很好用的校验库来实现自定义返回错误码的功能。 数据库 基本上主流的数据库Rust都是支持的都有Rust客户端而我们开发时更多关注的是ORM框架在Java中最常用的非MyBatis莫属了其实Rust中有一个类似于MyBatis的库叫做rbatis目前还没有尝试过看起来还不错也支持动态SQL只是从xml格式变为html感觉怪怪的。另一个比较常用的就是diesel性能确实不错支持流式处理也支持联表类型安全但是不怎么支持动态SQL所以针对一些复杂查询可能会写的比较费力。 可选项diesel、rbatis、sqlx 其实sqlx不能算作ORM框架但是它比较简单且灵活适合一些小项目使用吧。 缓存 缓存算是中间件了基本上就是看其是否有支持Rust的驱动或者SDK了。常用的Redis有Rust版本的驱动也叫redis。另一个是moka一个内存缓存库也很好用。 可选项redis、moka 除了以上两个常用的外其他缓存大部分也都有Rust版的驱动可以在crates.io上找到 池化 数据库连接、Redis连接以及其他涉及到网络连接的基本都会用到连接池Java里有Hikari、C3P0、DBCP等这些池化工具常常被用来做连接复用连接复用的好处一是能减少频繁创建连接带来的消耗二是可以限制连接数量在有限的系统资源下维持系统的稳定。而在Rust中最常用的一个池化工具就是r2d2它本身支持了许多连接的池化如redis、diesel、sqlx以及postgres和oracle等。我们也可以实现它的trait来管理自定义的需要池化的对象还是很方便的 可选项r2d2、deadpool 除了r2d2外还有一个就是deadpool它是支持异步的而r2d2目前看是同步的所以在并发性能上会有所提升。 多线程和异步 Rust支持async/await关键字来实现异步但这只是一个语法它需要一个异步的runtime来支持异步操作最常用的莫过于tokio了这个名字初次看到感觉也是有点怪怪的。大部分的需要异步的库都集成了tokio。要实现异步只需要为函数加上asnyc即可需要注意的是要对async函数使用.await才会触发执行否则是不会执行的而.await又需要在async中才可以使用所以层层嵌套到最外层到main函数它就需要是async的了我们可以使用#[tokio::main]来开启异步runtime。具体的tokio异步相关的一些问题后面会再总结一下。 可选项tokio 对于tokio中的spwan它和Java线程池中的submit提交一个任务类似spwan提交一个任务后由tokio去调度执行spwan会返回一个JoinHandle有多个任务时使用join!(task1,task2,…)来并发执行即可。使用上还是蛮简单的。 说到多线程那免不了线程间的通信有一个库叫crossbeam提供了一些原子包装类型以及线程安全的channel可以很方便的在多线程中交互比标准库中的channel好用一些。 错误处理 在Java中错误处理一般是自定义的Exception结合业务状态码封装一个统一的响应格式。在Rust中没有异常的概念虽然有panic但是正常来讲在后端服务中应该确保不会发生panic也就是必须要手动处理错误。Rust的每一个库都会有一个它自己的自定义的异常这些异常即Error会暴露给调用方来处理我们可以通过match来匹配指定的Error或者if let来处理对应的Error如果函数使用Result作为返回值还可将Error返回给外层或者用问号?来返回给外层。但是我们通常会使用多个库一个函数里会有多个不同类型的错误这就需要自定义个错误枚举来实现std下的Error给不同的Error类型包装成统一的自定义Error或者结合Boxdyn实现动态包裹Error。而这些操作也可以通过第三方的库来实现常用的就是anyhow。 可选项anyhow、eyre anyhow其实依赖于thiserror而thiserror提供了一些宏来包裹不同类型的错误用法也很简单。我们可以将std::result::Result替换为anyhow的Result返回anyhow!()或者bail!(“”)这样就可以将错误向外传递。 单元测试 Rust中的单元测试使用上比较简单#[test]即可开启测试对于异步的测试使用#[tokio::test]即可开启。需要注意的是如果使用IDE点击运行开始测试的话依赖的feature不会自动检测到可能会报错需要配置一下。其他测试库还没有常见用到后续有用到了再补充。 序列化/反序列化 主要是指Json的序列化和反序列化Java中有FastJson和JacksonRust中有serde_json。serde是一个通用的序列化和反序列化库支持常见的Json、Yaml但是好像不支持XML。使用上很简单在struct上加上#[derive(Serialize, Deserialize)]即可支持序列化和反序列化需要注意的是struct里边的字段也需要支持序列化和反序列化常用的基础数据类型是已经都实现了了的。 可选项serde、serde_json、serde_yaml 除了Json外还有protobufRust也支持叫做prost可以很方便的进行encode和decode它也支持从proto文件生成rs文件构建工具叫做prost-build我们可以在build.rs中配置需要生成的内容。 还有arrow格式这个是一种跨平台的数据格式Rust也是支持的如果需要跨进程传输数据可以使用这个。 消息队列 消息队列也算是中间件常用的kafka、rabbitmq、rocketmq等都有rust版的客户端实现。说到消息队列除了这几个外还有个库叫做zmq用来做网络通信也很不错简单易用支持多种TCP连接模式也支持IPC对于跨进程或者不同机器之间高效通信很适合。 可选项kafka、rabbitmq、rocketmq、zmq 日志 最后就是日志库了无论是Java还是Rust中日志库都很多Java中的Log4j可以对于Rust中的log库都定义了统一的接口有着不同的实现。常用的有env_logger、tracing、log4rstracing还未曾使用过不过看介绍似乎比较复杂一些而env_logger则相对简单很多。env_logger支持不同级别的日志输出支持按model过滤日志级别支持彩色日志但是不支持输出到文件。所以log4rs可能更适合它也支持通过yaml配置日志格式支持不同的输出支持滚动日志看起来是比较适合web后端日志的。 可选项tracing、env_logger、log4rs 其他 除了以上了解到库外还有其他一些使用到的库也记录一下。 rand随机数生成库image 图像处理imageproc实现了一些图像处理相关的算法base64base64编码解码chrono日期时间库这个很常用提供了大量的日期和时间操作APIonce_cell全局静态变量初始化。Rust中static类型不能像Java一样很方便的定义全局静态变量这个库提供了简单的静态变量初始化方式并且线程安全确保只被初始化一次。strum枚举遍历以及枚举值映射reqwest用于简单的http请求tokio-cron-scheduler定时任务dashmap简化并发编程中的hashmap带来的问题
Rust做Web开发有好处也有坏处先说好处。首先确实能够节约机器成本一个Rust包通常来说会比Jar包小很多而运行时占用的内存就比Java小的更多了能够减小5倍左右其次Rust写的程序确实会比Java稳定能够规避一些潜在的问题例如NPE等当然前提是不要到处unwrap否则一样会崩。另外对于客户端来说Tauri使用Rust构架如果做客户端开发前端使用Vue后端使用Rust还是很方便的。还有就是在部署层面Rust可以跨平台编译使用musl工具链编译后基本上可以部署到任何linux系统上对于需要支持不同平台的应用来说非常方便而对于Java来说还需要JVM的环境虽然Java21已经支持原生应用编译了但是依赖于泛型的框架来说编译可能还是有些坑的。
再说不好的地方一是学习成本Rust的确没有Java容易学尤其是对Java越熟悉的转Rust可能反而会比较麻烦因为很多概念两者并不相通这是学习成本并非开发成本因为如果熟悉了Rust的话开发速度其实并不慢我们更多需要的是在开发初期做好设计不论架构还是API否则后续修改起来还是比较痛苦的。所以这也就是Rust做Web开发的另一个不好的地方不能快速适应业务上的变化由于本身的语法限制你不能向Java一样运用各种设计模式来应对业务变化而需要花费更多的时间去衡量是否需要重构或者其他方案换句话说可能对于我们做开发的要求会变高考虑的东西也会变多比如改用String还是str不过从另一种角度看这也提高了我们的编程的严谨性和系统的稳定性吧。
最近也在尝试使用Rust在嵌入式设备上部署例如Yolo等模型以及一些大模型想尝试使用ONNX简化部署流程期间也遇到了很多问题比如OpenCV交叉编译、Rust的交叉编译、FFI调用、跨进程通信等问题。看起来有点混乱这些后续有时间再总结一下。本身是从5年的Java转Rust目前看Rust国内只有量化和区块链这两个方向稍微多一点其他的几乎没有岗位也是一脸迷茫期待后续Rust能够在不同领域发展起来多一些工作机会吧。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82206.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!