Rust能不能做后端开发语言?( 二 )


$HOME/.cargo然后在新建的config文件中加入国内镜像的信息 , 例如使用gitee的镜像的话 , 文件内容如下:
[source.crates-io]replace-with='crates-cn'[source.crates-cn]registry=""不过使用之后 , 发现gitee的index并不是最新的 , 就像最新的Rocket版本0.4.5就没有被收入 , 所以换成了中科大的镜像 , 文件内容可以改成相应的git链接 , 如下
[source.crates-io]replace-with='ustc'[source.ustc]registry=""虽然说Rust没有自己的专属IDE , 不过Editor+插件的方式基本可以雷同于IDE , 而且整体开发环境的配置还是非常直观的 。
Rust能不能做后端开发语言?文章插图
VS Code的Rust插件
RESTful vs GraphQL通过Rust实现RESTful规范的接口 , 整体来说还是比较直观的 , Rust下比较流行的第三方Web开发框架都会支持路由功能 , 虽然不同的框架支持的方式不同 , 不过本质上都是通过挂载一个根路径 , 然后通过框架支持的Macro来将不同路径来指向不同函数来处理 , 我是用Rocket来做这个RESTful接口的Demo的 , 除了Rocket服务器启动和根目录挂载基本上 , 就是三行如下的代码就可以设置好一条路径:
#[get("/herb/")]pub fn get_herb(uid:i32) -> Result, String> {//数据连接和业务逻辑}当然可以将所有路由放在一个模块内 , 然后在主程序内调用 , 类似如下的启动Rocket服务器就可以运行了
fn main() {rocket::ignite().mount("/", routes![routes::get_herb]).launch();}
Rust能不能做后端开发语言?文章插图
RESTful接口demo的测试结果
对于GraphQL来说设置上会稍微复杂一点 , 需要通过第三方的GraphQL库来实现 , 我使用了Juniper , 同时尝试了另一个Web开发框架Actix-Web , 整体开发效率还是非常快的 , 主要还是得益于Rust的Macro机制 , 基本上很多方法都通过Macro来关联到了相应的对象上 , 直接在需要的地方调用就可以了 。 不过对于GraphQL要多一步设置Schema的过程 , 不过对于处理函数的添加还是比较直观的 , 比之前使用Go的时候要更便于维护 。 在设置完Schema之后 , 只需要在RootQuery中添加相应的函数就能实现不同的业务逻辑 , 如下面包含两个函数 , 调用全部对象和查询单一对象的函数:
#[juniper::object]impl QueryRoot {fn herbs() -> Vec {use crate::schema::herbs::dsl::*;let connection = establish_connection();herbs.limit(100).load::(let connection = establish_connection();herbs.filter(uid.eq(_uid)).load::( --tt-darkmode-bgcolor: #161616;">经过这两个不同规范的 , Rust高开发效率的特性非常好的体现了 , 只要熟悉了Rust语言规范之后 , 整体开发效率还是非常高的 , 很多代码会通过Macro机制省略了 。 如果选择Rust的话 , 感觉使用GraphQL的机会会更高 , 毕竟RESTful和GraphQL之间的开发成本差不多 , 那么GraphQL的自由度就更高了 。
数据库连接
Rust能不能做后端开发语言?文章插图
Diesel使用起来还是比较方便的
我使用了Diesel这个比较流行的数据库连接框架 , 是设置和初始化的过程中 , 体现出了Rust比较类似其他系统语言的地方 , 在安装了Diesel命令行工具之后 , 只需要通过下面几行命令行就能直接设置好数据库以及migration的配置
//安装diesel_cli , 最后的参数是根据使用的数据库来设置的>cargo install diesel_cli --no-default-features --features mysql//将数据库连接数据添加到项目根目录的.env文件中>echo DATABASE_URL=mysql://username:password@localhost/database_name > .env//然后设置就可以了>diesel setup