成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?

開(kāi)發(fā) 前端
作為一個(gè)主要面向系統(tǒng)開(kāi)發(fā)的語(yǔ)言,一開(kāi)始的確會(huì)因?yàn)镽ust的復(fù)雜度而有點(diǎn)無(wú)從下手,不過(guò)熟悉了之后的確能感覺(jué)到Rust的高開(kāi)發(fā)效率特性。而且,作為編譯型語(yǔ)言來(lái)說(shuō),執(zhí)行效率應(yīng)該沒(méi)有任何問(wèn)題,不過(guò)因?yàn)檫^(guò)于年輕,Rust下支持的第三方開(kāi)發(fā)框架還不算穩(wěn)定,可能會(huì)出現(xiàn)一些Bug。不過(guò)通過(guò)有限的幾個(gè)Demo開(kāi)發(fā)來(lái)看,還是勝任一個(gè)普通項(xiàng)目的后端支持的。

ProjectX只是現(xiàn)在我在做的一個(gè)項(xiàng)目的名稱,我計(jì)劃在整個(gè)項(xiàng)目的過(guò)程中做更多的嘗試,并且盡可能的將過(guò)程記錄下來(lái)。如果感興趣可以關(guān)注我,非常歡迎給我或是ProjectX提提你的建議。

這次ProjectX在選擇后端開(kāi)發(fā)語(yǔ)言的時(shí)候,我不會(huì)考慮我自己的熟悉程度和之前的積累,希望可以比較客觀的選擇一個(gè)適合的后端語(yǔ)言,我也可以通過(guò)這個(gè)過(guò)程了解更多后端語(yǔ)言。目前計(jì)劃嘗試的后端語(yǔ)言有:PHP、JAVA、Node.js、Go、Rust、Ruby、Python。沒(méi)有案例的分享都是耍流氓,我用這幾個(gè)語(yǔ)言統(tǒng)一做一個(gè)簡(jiǎn)單的數(shù)據(jù)查詢返回的API接口,來(lái)從服務(wù)器支持、開(kāi)發(fā)環(huán)境搭建、RESTful路徑設(shè)置、數(shù)據(jù)庫(kù)連接、語(yǔ)言結(jié)構(gòu)和文檔社區(qū)豐富度六個(gè)方面來(lái)聊聊我自己的感受。

語(yǔ)言簡(jiǎn)介

相對(duì)于其他語(yǔ)言來(lái)說(shuō),Rust屬于最新的一個(gè)成員。最早由Mozilla于2014年4月9日發(fā)布。Rust是一款高級(jí)通用語(yǔ)言,而且屬于少有的一款兼顧開(kāi)發(fā)和執(zhí)行效率的編程語(yǔ)言。Rust結(jié)合了腳本語(yǔ)言的語(yǔ)法結(jié)構(gòu)和C語(yǔ)言編譯執(zhí)行效率,并且具有類似垃圾回收和數(shù)據(jù)類型及所有權(quán)系統(tǒng)等功能,所以可靠性和高性能運(yùn)行都屬于Rust的特色。雖然是一個(gè)非常年輕的編程語(yǔ)言,但是Rust可以算是最近幾年最流行的編程語(yǔ)言。5月發(fā)布的Stack Overflow 2020開(kāi)發(fā)者調(diào)查中,Rust被86.1%開(kāi)發(fā)者選擇為“最喜歡”的編程語(yǔ)言,比第二名TypeScript高出近20%。雖然Rust并不是一個(gè)專屬的網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)語(yǔ)言,但是作為一個(gè)以安全著稱的編輯語(yǔ)言,實(shí)際上是非常適合網(wǎng)絡(luò)開(kāi)發(fā)的。而且因?yàn)槭蔷幾g型語(yǔ)言,編譯器也能在過(guò)程中就安全穩(wěn)定的問(wèn)題作出提醒,作為后端網(wǎng)絡(luò)開(kāi)發(fā)還是不錯(cuò)的一個(gè)優(yōu)勢(shì)。

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
來(lái)自mozilla的Rust

服務(wù)器支持

Rust的通用庫(kù)中已經(jīng)包含了類似TcpListener這樣的網(wǎng)絡(luò)通訊庫(kù),可以直接通過(guò)調(diào)用std : : net 下面的TcpListener來(lái)直接監(jiān)聽(tīng)Tcp端口,然后再處理Request。這點(diǎn)上與一些腳本型的編程語(yǔ)言比要自由得很多。Rust作為比較流行的編程語(yǔ)言,也有不少第三方HTTP庫(kù)來(lái)支持Web開(kāi)發(fā),可以不用再花時(shí)間從底層開(kāi)發(fā),比較熱門的庫(kù)像Hyper或者Tide都是被不少Web開(kāi)發(fā)框架用到的。Rust下Web開(kāi)發(fā)框架也不少,比較熱門的有Rocket、Actix-Web、Tower-web、Warp等等框架。因?yàn)槌醮谓佑|Rust,所以還是先從比較成熟的框架Rocket來(lái)作Demo的嘗試,相對(duì)文檔會(huì)比較完善一些。不過(guò),根據(jù)網(wǎng)上的一些討論,Rocket或是Actix-Web雖然比較熱門,但是因?yàn)榛诒容^老的hyper庫(kù),所以可能對(duì)于一些功能不支持,例如Rocket不支持Async/Wait功能。不過(guò)總的來(lái)說(shuō)Rust對(duì)于服務(wù)器的支持還是不錯(cuò)的,而且就算找不到合適的開(kāi)發(fā)框架,也可以從底層開(kāi)發(fā),雖然比較浪費(fèi)時(shí)間。

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
Rocket

IDE VS Editor

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
Rust基本支持主流的編輯器

Rust基本上沒(méi)有直接IDE,只是通過(guò)插件的方式集合在一些IDE或者編輯器中,Rust對(duì)于主流的編輯器基本都支持。因?yàn)閷?duì)于VS Code比較熟悉也就直接通過(guò)VS Code安裝了Rust插件,然后結(jié)合通過(guò)以下的shell 安裝好Rust以及Cargo,就基本安裝好了開(kāi)發(fā)環(huán)境。

  1. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 

Rust會(huì)通過(guò)Cargo來(lái)處理依賴的庫(kù),而且在編譯的時(shí)候來(lái)拉取的,因?yàn)橐恍┍娝苤木W(wǎng)絡(luò)問(wèn)題,拉取速度非常慢。需要將第三方庫(kù)的注冊(cè)表網(wǎng)站crates.io換成國(guó)內(nèi)鏡像。修改成國(guó)內(nèi)鏡像的方式,在cargo安裝文件夾下新建config文件,一般cargo的安裝位置如下:

  1. $HOME/.cargo 

然后在新建的config文件中加入國(guó)內(nèi)鏡像的信息,例如使用gitee的鏡像的話,文件內(nèi)容如下:

 

  1. [source.crates-io] 
  2. replace-with='crates-cn' 
  3. [source.crates-cn] 
  4. registry="https://gitee.com/crates/crates.io-index.git" 

不過(guò)使用之后,發(fā)現(xiàn)gitee的index并不是最新的,就像最新的Rocket版本0.4.5就沒(méi)有被收入,所以換成了中科大的鏡像,文件內(nèi)容可以改成相應(yīng)的git鏈接,如下

 

  1. [source.crates-io] 
  2. replace-with='ustc' 
  3.  
  4. [source.ustc] 
  5. registry="https://mirrors.ustc.edu.cn/crates.io-index" 

雖然說(shuō)Rust沒(méi)有自己的專屬IDE,不過(guò)Editor+插件的方式基本可以雷同于IDE,而且整體開(kāi)發(fā)環(huán)境的配置還是非常直觀的。

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
VS Code的Rust插件

RESTful vs GraphQL

通過(guò)Rust實(shí)現(xiàn)RESTful規(guī)范的接口,整體來(lái)說(shuō)還是比較直觀的,Rust下比較流行的第三方Web開(kāi)發(fā)框架都會(huì)支持路由功能,雖然不同的框架支持的方式不同,不過(guò)本質(zhì)上都是通過(guò)掛載一個(gè)根路徑,然后通過(guò)框架支持的Macro來(lái)將不同路徑來(lái)指向不同函數(shù)來(lái)處理,我是用Rocket來(lái)做這個(gè)RESTful接口的Demo的,除了Rocket服務(wù)器啟動(dòng)和根目錄掛載基本上,就是三行如下的代碼就可以設(shè)置好一條路徑:

 

  1. #[get("/herb/<uid>")] 
  2. pub fn get_herb(uid:i32) -> Result<Json<Vec<Herb>>, String> { 
  3.     //數(shù)據(jù)連接和業(yè)務(wù)邏輯 

當(dāng)然可以將所有路由放在一個(gè)模塊內(nèi),然后在主程序內(nèi)調(diào)用,類似如下的啟動(dòng)Rocket服務(wù)器就可以運(yùn)行了

 

  1. fn main() { 
  2.     rocket::ignite() 
  3.         .mount("/", routes![ 
  4.             routes::get_herb 
  5.         ]) 
  6.         .launch(); 

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
RESTful接口demo的測(cè)試結(jié)果

對(duì)于GraphQL來(lái)說(shuō)設(shè)置上會(huì)稍微復(fù)雜一點(diǎn),需要通過(guò)第三方的GraphQL庫(kù)來(lái)實(shí)現(xiàn),我使用了Juniper,同時(shí)嘗試了另一個(gè)Web開(kāi)發(fā)框架Actix-Web,整體開(kāi)發(fā)效率還是非常快的,主要還是得益于Rust的Macro機(jī)制,基本上很多方法都通過(guò)Macro來(lái)關(guān)聯(lián)到了相應(yīng)的對(duì)象上,直接在需要的地方調(diào)用就可以了。不過(guò)對(duì)于GraphQL要多一步設(shè)置Schema的過(guò)程,不過(guò)對(duì)于處理函數(shù)的添加還是比較直觀的,比之前使用Go的時(shí)候要更便于維護(hù)。在設(shè)置完Schema之后,只需要在RootQuery中添加相應(yīng)的函數(shù)就能實(shí)現(xiàn)不同的業(yè)務(wù)邏輯,如下面包含兩個(gè)函數(shù),調(diào)用全部對(duì)象和查詢單一對(duì)象的函數(shù):

 

  1. #[juniper::object] 
  2. impl QueryRoot { 
  3.     fn herbs() -> Vec<Herb> { 
  4.         use crate::schema::herbs::dsl::*; 
  5.         let connection = establish_connection(); 
  6.         herbs 
  7.           .limit(100) 
  8.           .load::<Herb>(&connection
  9.           .expect("Error loading members"
  10.     } 
  11.     fn herb(_uid:i32) -> Vec<Herb> { 
  12.         use crate::schema::herbs::dsl::*; 
  13.         let connection = establish_connection(); 
  14.         herbs 
  15.         .filter(uid.eq(_uid)) 
  16.           .load::<Herb>(&connection
  17.           .expect("Error loading herbs"
  18.     } 

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
GraphQL接口demo的測(cè)試結(jié)果

經(jīng)過(guò)這兩個(gè)不同規(guī)范的,Rust高開(kāi)發(fā)效率的特性非常好的體現(xiàn)了,只要熟悉了Rust語(yǔ)言規(guī)范之后,整體開(kāi)發(fā)效率還是非常高的,很多代碼會(huì)通過(guò)Macro機(jī)制省略了。如果選擇Rust的話,感覺(jué)使用GraphQL的機(jī)會(huì)會(huì)更高,畢竟RESTful和GraphQL之間的開(kāi)發(fā)成本差不多,那么GraphQL的自由度就更高了。

數(shù)據(jù)庫(kù)連接

 

Rust能不能做后端開(kāi)發(fā)語(yǔ)言?
Diesel使用起來(lái)還是比較方便的

我使用了Diesel這個(gè)比較流行的數(shù)據(jù)庫(kù)連接框架,是設(shè)置和初始化的過(guò)程中,體現(xiàn)出了Rust比較類似其他系統(tǒng)語(yǔ)言的地方,在安裝了Diesel命令行工具之后,只需要通過(guò)下面幾行命令行就能直接設(shè)置好數(shù)據(jù)庫(kù)以及migration的配置

 

  1. //安裝diesel_cli,最后的參數(shù)是根據(jù)使用的數(shù)據(jù)庫(kù)來(lái)設(shè)置的 
  2. >cargo install diesel_cli --no-default-features --features mysql 
  3.  
  4. //將數(shù)據(jù)庫(kù)連接數(shù)據(jù)添加到項(xiàng)目根目錄的.env文件中 
  5. >echo DATABASE_URL=mysql://username:password@localhost/database_name > .env 
  6.  
  7. //然后設(shè)置就可以了 
  8. >diesel setup 

這樣diesel會(huì)了連接到數(shù)據(jù)庫(kù)服務(wù)器,如果數(shù)據(jù)庫(kù)不存在的時(shí)候,會(huì)自動(dòng)生成一個(gè)數(shù)據(jù)庫(kù)。然后通過(guò)新建一個(gè)migration來(lái)添加數(shù)據(jù)庫(kù)中的表

  1. >diesel migration generate migration_name 

這樣就會(huì)在項(xiàng)目根目錄下migrations文件下生成當(dāng)前時(shí)間為前綴的文件夾,其中有兩個(gè)文件,up.sql 存放新建表需要的sql語(yǔ)句,down.sql存放up.sql內(nèi)相關(guān)新建語(yǔ)句的銷毀語(yǔ)句,例如:

 

  1. //up.sql 
  2. CREATE TABLE IF NOT EXISTS herbs ( 
  3.   uid int PRIMARY KEY AUTO_INCREMENT, 
  4.   cn_name varchar(255) NOT NULL
  5.   en_name varchar(255) DEFAULT NULL
  6.   latin_name varchar(255) NOT NULL
  7.   botanic_name varchar(255) DEFAULT NULL
  8.   part_used varchar(255) NOT NULL
  9.   common_name json DEFAULT NULL
  10.   country_of_origin json DEFAULT NULL
  11.   description text, 
  12.   harvest_season varchar(255) DEFAULT NULL
  13.   grow_duration varchar(255) DEFAULT NULL 
  14.  
  15. //down.sql 
  16. DROP TABLE herbs 

添加好相應(yīng)的SQL語(yǔ)句,在運(yùn)行如下命令就基本上設(shè)置好了Diesel

  1. >diesel migration run 

也可以通過(guò)以下命令來(lái)重置數(shù)據(jù)庫(kù)

  1. >diesel migration redo 

Diesel會(huì)直接在項(xiàng)目根目錄下的schema.rs文件中根據(jù)數(shù)據(jù)庫(kù)表的結(jié)構(gòu)生成好相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。然后通過(guò)diesel支持的Macro,建立同樣結(jié)構(gòu)的struct就可以直接調(diào)用數(shù)據(jù)庫(kù)中的數(shù)據(jù)條了。例如對(duì)于可以查詢的數(shù)據(jù)條,可以在struct定義之上添加如下的Macro

 

  1. #[derive(Queryable)] 
  2. struct Herb { 
  3.     uid: i32, 
  4.     cn_name: String, 
  5.     en_name: String, 
  6.     latin_name: String, 
  7.     botanic_name: String, 
  8.     part_used: String, 
  9.     common_name: String, 
  10.     country_of_origin: String, 
  11.     description: String, 
  12.     harvest_season: String, 
  13.     grow_duration: String, 

這樣就可以直接通過(guò)在相應(yīng)的業(yè)務(wù)邏輯中通過(guò)filter,load等查詢函數(shù)了。

整體來(lái)說(shuō)Diesel在開(kāi)發(fā)過(guò)程中非常簡(jiǎn)潔明了,就算初次接觸的話,也是能直接掌握,對(duì)于之后比較復(fù)雜的數(shù)據(jù)庫(kù)操作自由度不確定是否足夠,不過(guò)對(duì)于一般項(xiàng)目的數(shù)據(jù)操作還是足夠的。

語(yǔ)言結(jié)構(gòu)

Rust的語(yǔ)言結(jié)構(gòu)同時(shí)是優(yōu)勢(shì)也是劣勢(shì)。對(duì)于初次接觸的時(shí)候,Rust的語(yǔ)言結(jié)構(gòu)非常令人疑惑,主要是其中的一些調(diào)用符號(hào),比如->, : :, <>等等,不過(guò)熟悉之后就會(huì)覺(jué)得這些符號(hào)也算比較直觀,而且在不同場(chǎng)景使用不同的符號(hào)讓代碼的可讀性反而提高了。

然后Rust高開(kāi)發(fā)效率的特性也通過(guò)Macro機(jī)制體現(xiàn)的淋漓盡致。通過(guò)不同derive Macro設(shè)置可以直接將相應(yīng)的抽象函數(shù)添加給struct,這樣可以少寫很多代碼。例如下面我給這個(gè)struct添加了數(shù)據(jù)庫(kù)查詢(Queryable)的同時(shí),添加了JSON的Serialize和Deserialize的功能。這樣在查詢出數(shù)據(jù)條可以直接調(diào)用JSON的map函數(shù)來(lái)生成JSON字符串。

 

  1. #[derive(Serialize, Deserialize, Queryable)] 
  2. pub struct Herb { 
  3.     pub uid: i32, 
  4.     pub cn_name: String, 
  5.     pub en_name: String, 
  6.     pub latin_name: String, 
  7.     pub botanic_name: String, 
  8.     pub part_used: String, 
  9.     pub common_name: String, 
  10.     pub country_of_origin: String, 
  11.     pub description: String, 
  12.     pub harvest_season: String, 
  13.     pub grow_duration: String, 

這個(gè)對(duì)于RESTful接口非常有用,可以將數(shù)據(jù)庫(kù)的查詢結(jié)果直接map然后返回。

總的來(lái)說(shuō),一開(kāi)始會(huì)覺(jué)得Rust是比較復(fù)雜的編程語(yǔ)言,不過(guò)熟悉了之后,還是非常喜歡Rust簡(jiǎn)潔的代碼結(jié)構(gòu)和高效的開(kāi)發(fā)體驗(yàn)。

文檔社區(qū)

作為一個(gè)比較熱門的編程語(yǔ)言,Rust的開(kāi)發(fā)社區(qū)還算是比較活躍的,不過(guò)因?yàn)楫吘筊ust還是一個(gè)非常年輕的編程語(yǔ)言,很多第三方框架也都比較年輕, 有些框架還都沒(méi)有完全達(dá)到1.0版本,而且文檔相對(duì)也是比較簡(jiǎn)單的。不過(guò)Rust的穩(wěn)定性應(yīng)該會(huì)延展到第三方框架的開(kāi)發(fā)上的,雖然大型項(xiàng)目可能不一定適合,但是絕大多數(shù)項(xiàng)目還是可以支持到的。

文檔也是同樣的問(wèn)題,作為比較年輕的語(yǔ)言,除了官方文檔以外,文檔或是解決方案相對(duì)會(huì)少不少。而且很多文檔還是以英文為主還沒(méi)有中文化。但是以開(kāi)發(fā)社區(qū)的活躍度來(lái)看,應(yīng)該不需要多少時(shí)間就會(huì)出現(xiàn)很多文檔和問(wèn)題解決方案出現(xiàn)。

總結(jié)

作為一個(gè)主要面向系統(tǒng)開(kāi)發(fā)的語(yǔ)言,一開(kāi)始的確會(huì)因?yàn)镽ust的復(fù)雜度而有點(diǎn)無(wú)從下手,不過(guò)熟悉了之后的確能感覺(jué)到Rust的高開(kāi)發(fā)效率特性。而且,作為編譯型語(yǔ)言來(lái)說(shuō),執(zhí)行效率應(yīng)該沒(méi)有任何問(wèn)題,不過(guò)因?yàn)檫^(guò)于年輕,Rust下支持的第三方開(kāi)發(fā)框架還不算穩(wěn)定,可能會(huì)出現(xiàn)一些Bug。不過(guò)通過(guò)有限的幾個(gè)Demo開(kāi)發(fā)來(lái)看,還是勝任一個(gè)普通項(xiàng)目的后端支持的。而且和Go一樣,作為比較年輕的編輯語(yǔ)言,未來(lái)的發(fā)展空間還是比較大的。雖然只是接觸了1個(gè)多星期,也沒(méi)有非常深入的開(kāi)發(fā)過(guò),但是我的確已經(jīng)喜歡上這個(gè)語(yǔ)言了,不愧為Stack Overflow最受歡迎編程語(yǔ)言的殊榮。

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2019-11-21 09:25:23

AI 數(shù)據(jù)人工智能

2016-05-19 17:10:27

銀行

2021-02-26 21:25:08

比特幣投資貨幣

2022-10-20 08:00:37

機(jī)器人ZadigChatOps

2025-04-22 08:00:00

2013-04-19 10:42:02

打車軟件大數(shù)據(jù)

2023-04-06 06:55:24

ChatGPTGPT算力

2022-04-24 11:52:04

元宇宙Web3去中心化

2012-06-13 11:01:59

英特爾

2023-12-27 08:03:53

Go優(yōu)化代碼

2020-12-21 15:09:23

人工智能安全人臉識(shí)別

2010-04-13 10:02:16

索引

2024-04-26 09:37:43

國(guó)產(chǎn)數(shù)據(jù)庫(kù)開(kāi)發(fā)者

2011-12-06 10:06:33

云存儲(chǔ)

2022-11-07 08:36:11

2021-06-15 11:33:48

監(jiān)控微信聊天前端

2025-06-13 02:00:00

系統(tǒng)cookieURL

2022-12-09 08:22:26

Gradle編譯運(yùn)行

2024-07-15 11:41:14

2011-08-09 16:08:53

數(shù)據(jù)庫(kù)連接
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 99久久免费精品国产免费高清 | 午夜激情影院 | 国产剧情一区 | 高清av电影| 国产视频二区 | 中文字幕在线不卡播放 | 国产视频中文字幕在线观看 | 久久专区| 日韩精品一区二区三区中文在线 | 国产成人免费 | 精品欧美一区二区三区久久久 | 国产一区二区精 | 免费在线播放黄色 | 亚洲国产视频一区二区 | 国产精品永久在线观看 | 丁香久久| 一区二区日韩 | 在线毛片网 | 国产精品亚洲综合 | 台湾a级理论片在线观看 | 成人在线视频免费观看 | 欧美黄色片 | 中文字幕男人的天堂 | 日韩精品一区二区三区在线观看 | 日本特黄a级高清免费大片 成年人黄色小视频 | 亚洲精品一区二区 | 狠狠爱视频 | 日韩成人在线观看 | 福利视频亚洲 | 亚洲欧美综合精品久久成人 | 亚洲午夜av久久乱码 | 精产国产伦理一二三区 | 成人免费一区二区三区视频网站 | 久久狠狠| 欧美精品一区二区三区在线 | 国产成人综合在线 | 美女激情av | 国产免费人成xvideos视频 | 国产精品高潮呻吟久久aⅴ码 | 免费黄色a视频 | 盗摄精品av一区二区三区 |