ProjectX只是我现在正在做的一个项目的名字。我计划在整个项目中进行更多的尝试,并尽可能记录过程。如果你有兴趣,可以关注我。非常欢迎您给我或ProjectX您的建议。这次ProjectX在选择后端开发语言的时候,不会考虑自己的熟悉程度和之前的积累。希望能更客观的选择一门合适的后端语言。我也可以通过这个过程更多地了解后端。语言。目前计划尝试的后端语言有:PHP、JAVA、Node.js、Go、Rust、Ruby、Python。无案分享,都是耍流氓。我用这些语言做了一个简单的数据查询和返回的API接口,从服务器支持、开发环境搭建、RESTful路径设置、数据库连接、语言结构和文档社区丰富性六方面来说说我自己的感受。语言介绍与其他语言相比,Rust是最新的成员。由Mozilla于2014年4月9日首次发布。Rust是一种高级通用语言,也是为数不多的兼顾开发和执行效率的编程语言之一。Rust结合了脚本语言的语法结构和C语言编译执行的效率,并具有垃圾收集、数据类型和所有权系统等功能,因此可靠性和高性能运行是Rust的特点。虽然是一门非常年轻的编程语言,但Rust可以算是近几年最流行的编程语言。在5月份发布的StackOverflow2020开发者调查中,Rust被86.1%的开发者选为“最喜欢”的编程语言,比排名第二的TypeScript高出近20%。虽然Rust并不是一种专属的Web应用开发语言,但作为一种以安全着称的编辑语言,它其实非常适合Web开发。而且因为是编译型语言,编译器也可以在过程中对安全和稳定性问题进行提醒,作为后端网络开发是一个很好的优势。mozilla的Rust服务器支持Rust的通用库已经包含了TcpListener这样的网络通信库,可以通过调用std::net下的TcpListener直接监听Tcp端口,然后处理Request。在这方面,它比一些脚本编程语言要自由得多。作为一种流行的编程语言,Rust也有很多第三方HTTP库来支持Web开发,所以你不需要花时间从底层开始开发。许多Web开发框架都使用流行的库,如Hyper或Tide。Rust下也有很多web开发框架,比较流行的有Rocket、Actix-Web、Tower-web、Warp等框架。由于本人是Rust新手,所以会先从比较成熟的框架Rocket开始尝试demo,相关文档也会比较完善。不过根据网上的一些讨论,虽然Rocket或者Actix-Web比较流行,但是由于是基于比较老的hyperlibraries,可能不支持一些功能。例如,Rocket不支持Async/Wait函数。但总的来说,Rust对服务器的支持还是不错的,即使找不到合适的开发框架,也可以从底层开始开发,虽然有点浪费时间。RocketIDEVSEditorRust基本支持主流编辑器。Rust基本没有直接的IDE,而是通过插件的方式集成在一些IDE或者编辑器中。Rust基本支持主流编辑器。因为熟悉VSCode,所以直接通过VSCode安装了Rust插件,然后通过下面的shell安装了Rust和Cargo,开发环境就基本安装好了。curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shRust会通过Cargo处理依赖库,在编译时拉取,因为一些众所周知的网络问题,拉取率很慢。第三方库的注册网站crates.io需要换成国内镜像。要更改为国内镜像,请在cargo安装文件夹下创建一个新的配置文件。一般cargo的安装位置如下:$HOME/.cargo然后在新建的config文件中添加国内镜像信息。内容如下:[source.crates-io]replace-with='crates-cn'[source.crates-cn]registry="https://gitee.com/crates/crates.io-index.git"但是使用之后发现gitee的索引不是最新的,就像最新的Rocket0.4.5版本没有收录,所以换成了中国科学技术大学的图片,文件内容可以改为对应的git链接,如下[source.crates-io]replace-with='ustc'[source.ustc]registry="https://mirrors.ustc.edu.cn/crates.io-index"Rust虽然没有自己专属的IDE,但是编辑器+插件的方式基本可以基于IDE,整体开发环境的配置还是很直观的。VSCode的Rust插件RESTfulvsGraphQL通过Rust实现了RESTful规范的接口。总体来说还是比较直观的。Rust下比较流行的第三方web开发框架都支持路由功能。虽然不同的框架支持的方法不同,但本质上都是通过挂载一个根路径,然后通过框架支持的宏,将不同的路径指向不同的函数来处理的。我用Rocket做这个RESTful接口的Demo,除了Rocket服务端启动和根目录挂载。上面,下面三行代码可以设置一个路径:#[get("/herb/")]pubfnget_herb(uid:i32)->Result>,String>{//数据连接和业务逻辑}当然可以把所有路由放在一个模块中,然后在主程序中调用,类似下面启动Rocket服务端运行fnmain(){rocket::ignite().mount("/",routes![routes::get_herb]).launch();}RESTful接口demo的测试结果对于GraphQL的设置稍微复杂一些,需要通过第三方实现-派对GraphQL库。我用的是瞻博网络。同时尝试了另一个web开发框架Actix-Web。整体开发效率还是很快的,主要得益于Rust的Macro机制。基本上很多方法都是通过Macro关联到相应的对象,直接在需要的地方关联。就叫它吧。不过对于GraphQL来说,多了一步设置Schema流程,但是处理函数的增加还是比较直观的,而且比之前使用Go时更容易维护。设置好Schema后,只需要在RootQuery中添加相应的函数就可以实现不同的业务逻辑,如下图,有调用所有对象和查询单个对象两个函数:#[juniper::object]implQueryRoot{fnherbs()->Vec{usecrate::schema::herbs::dsl::*;letconnection=establish_connection();herbs.limit(100).load::(&connection).expect("Errorloadingmembers")}fnherb(_uid:i32)->Vec{usecrate::schema::herbs::dsl::*;letconnection=establish_connection();herbs.filter(uid.eq(_uid)).load::(&connection).expect("Errorloadingherbs")}}GraphQL接口demo的测试结果都通过了这两个不同的规范,很好的体现了Rust的高开发效率。只要熟悉Rust语言规范,整体开发效率还是很高的,通过Macro机制会省去很多代码。如果你选择Rust,你会觉得使用GraphQL的机会会更高。毕竟RESTful和GraphQL的开发成本差不多,所以GraphQL的自由度更高。数据库连接Diesel使用起来相当方便。我使用了Diesel,一种流行的数据库连接框架。在设置和初始化过程中,它表明Rust与其他系统语言相似。安装Diesel命令行工具后,只需要使用下面几行命令行直接设置数据库和迁移配置//安装diesel_cli,最后一个参数根据使用的数据库设置>cargoinstalldiesel_cli--no-default-features--featuresmysql//安装数据库在项目根目录的.env文件中添加连接数据>echoDATABASE_URL=mysql://username:password@localhost/database_name>.env//然后设置>dieselsetup这样diesel将连接到数据库服务器,如果数据库不存在,则会自动生成一个数据库。然后新建一个migration在数据库中添加表>dieselmigrationgeneratemigration_name这样在项目根目录的migrations文件下会生成一个以当前时间为前缀的文件夹。里面有两个文件,up.sql存放了新建表所需要的SQL语句,down.sql存放了up.sql中相关新建语句的销毁语句,例如://up.sqlCREATETABLEIFNOTEXISTSherbs(uidintPRIMARYKEYAUTO_INCREMENT,cn_namevarchar(255)NOTNULL,en_namevarchar(255)DEFAULTNULL,latin_namevarchar(255)NOTNULL,botanic_namevarchar(255)DEFAULTNused(255)NOTNULL,common_namejsonDEFAULTNULL,country_of_originjsonDEFAULTNULL,descriptiontext,harvest_seasonvarchar(255)DEFAULTNULL,grow_durationFAULTNULLs(255)Add_duration/FAULTNULLsAddsqlherbDRABLETNULLsDEFAULTNULL相应的SQL语句,运行如下命令基本设置Diesel>rundieselmigration使用以下命令重置数据库>dieselmigrationredoDiesel会直接根据数据库表的结构在项目根目录下的schema.rs文件中生成相应的数据结构.然后通过diesel支持的Macro,创建一个结构相同的struct就可以直接调用数据库中的databar。比如可以查询的数据项,可以在上面加上下面的Macro#[derive(Queryable)]structHerb{uid:i32,cn_name:String,en_name:String,latin_name:String,botanic_name:String,part_used:Stringstructdefinition,common_name:String,country_of_origin:String,description:String,harvest_season:String,grow_duration:String,}这样就可以在对应的业务逻辑中直接查询filter、load等功能。总体来说,Diesel在开发过程中非常简洁明了。即使是第一次接触,也能直接掌握。对于比较复杂的数据库操作,不确定自由度是否够用,但是对于一般项目的数据操作,已经足够了。语言结构Rust的语言结构既是优点也是缺点。第一次接触,Rust的语言结构很混乱,主要是一些调用符号,比如->、::、<>等,但是熟悉之后,你会觉得这些符号都是比较直观,并且在不同的场景下使用不同的符号,提高了代码的可读性。那么Rust的高开发效率也通过Macro机制体现的淋漓尽致。通过不同的deriveMacro设置,可以直接在struct中加入相应的抽象函数,可以节省大量代码。比如下面我在这个struct中添加了数据库查询(Queryable),并添加了JSON的Serialize和Deserialize函数。这样就可以在查询数据条后直接调用JSONmap函数生成一个JSON字符串。#[派生(序列化,反序列化,可查询)]pubstructHerb{pubuid:i32,pubcn_name:String,puben_name:String,publatin_name:String,pubbotanic_name:String,pubpart_used:String,pubcommon_name:String,pubcountry_of_origin:String,pubdescription:String,pubharvest_season:String,pubgrow_duration:String,}这个对于RESTful接口非常有用,可以直接映射数据库的查询结果返回。总的来说,Rust一开始是一门比较复杂的编程语言,但在熟悉之后,还是喜欢Rust简洁的代码结构和高效的开发体验。文档社区是比较流行的编程语言,Rust开发社区比较活跃。不过,由于Rust还是一门非常年轻的编程语言,很多第三方框架也比较年轻,有些框架还没有完全达到1.0版本,并且文档相对简单。不过Rust的稳定性应该延伸到第三方框架的开发上。虽然大型项目可能不适合,但大部分项目还是可以支持的。文档也是同样的问题。作为一门比较年轻的语言,除了官方文档之外,文档或者解决方案都比较少。而且很多文件还是以英文为主,没有中文。不过从开发社区的活跃度来看,应该不会过多久就会出现很多文档和问题解决方案。小结作为一门主要面向系统开发的语言,一开始确实因为Rust的复杂性,上手有点吃力,但是熟悉之后,才能真正感受到Rust的开发效率之高。而且作为编译型语言,执行效率应该没有问题,但是因为太年轻,Rust支持的第三方开发框架还不稳定,可能会出现一些bug。不过通过有限的demo开发,还是能够胜任一个普通项目的后台支持。而像Go一样,作为一门比较年轻的编辑语言,未来的发展空间还是比较大的。虽然我才接触了一个多星期,并没有很深入地开发,但我确实已经爱上了这门语言。它无愧于StackOverflow最受欢迎的编程语言的殊荣。