5分鐘APIG實戰| 使用Rust語言快速構建API能力開放
文檔內容快速瀏覽:
1 序言:Rust語言簡介
1.1?核心概念:所有權系統
2 使用Rust進行HTTP Web后端應用開發
2.1 實戰演練
2.1.1 準備后端應用服務器
2.1.1 安裝相關的工具鏈
2.1.2 編寫后端Web應用
2.2 API部署
1 序言:Rust語言簡介
參與過C/C++大型項目的同學可能都經歷過因為Null Pointer、Memory Leak等問題“被”?加班了不知道多少個晚上。別沮喪,你不是一個人,Mozilla Firefox的開發者們同樣經歷過這個問題。瀏覽器可以說是我們日常使用最為頻繁的軟件了,目前主流的瀏覽器主要?有Google Chrome、Internet Explorer、Mozilla Firefox。為了提升用戶體驗,Mozilla就已經啟動了多線程渲染的計劃。然而,面對大型的C/C++工程,Mozilla的開發者們也堅持不住了。此時,Rust進入了開發者的眼中,與C語言ABI兼容、多編程范式支持、無GC及獨特的所有權系統,使得Mozilla與Rust語言一拍即合,并迅速啟動了?Mozilla?的下一代瀏覽器引擎項目:servo,到目前為止(2018年8?月),servo已經成為了除Rust編譯器自身外,社區中最大的Rust項目。servo目前已經部?分應用在Firefox 57之后的版本中。
Rust語言的設計目標是安全、高效、并發以及實用性。Rust?從一定程度上解決了C++的以?下痛點:
1.??容器/數組越界訪問;
2.??動態內存分配的泄露與double free問題;
3.??難以對依賴進行管理;
其中前兩點在C/C++項目中是最容易引發Bug以及安全問題的原因,依靠人來對這些問題進行檢查往往不是最佳的解決方案。Rust通過其獨特的所有權系統,簡化所研究的對象,使得一些隱晦的問題在編譯期間便暴露出來。任何事情都是有兩面性的,由于嚴格的編譯期檢查以及工程實現上的取舍,Rust在一定程度上犧牲了編譯速度以及靈活性,對“靈活性”的舍棄并不代表Rust語言的表現力下降,只是我們在編寫Rust程序時,可能需要?改變一下以往的思路。
在Rust圈子中,有一句調侃:“C++是調試的時候想撞墻,而Rust是編譯的時候想撞墻”。
接下來我們將通過一個簡單的例子來建立Rust中所有權系統的一個基本印象。
1.1 核心概念:所有權系統
Rust?的所有權系統包括三個核心概念:所有權、借用以及生命周期。我們首先來通過一個?簡單的例子來建立對所有權以及生命周期的直觀概念。
#[derive(Debug)] ?struct?Foo; ? ?fn?main()?{ ?????let?foo?=?Foo;?//?Note:?Foo?not?implement?Copy?trait ?????let?bar?=?foo; ? ?????println!("{:?}",?bar); ?????//?println!("{:?}",?foo); ?}
首先創建了一個Foo類型的變量foo,然后我們執行let bar = foo;,然后我們嘗試?輸出這兩個變量的值,如果我們將第9行的注釋去掉,程序將無法通過編譯,這是因為在?Rust中,對于沒有實現Copy?trait的類型,如果我們將一個綁定賦給另一個綁定,默認?使用的是move語義,也即對于任意給定的資源,當且僅當有一個變量綁定與之對應。
想要進一步學習Rust的小哥哥小姐姐,可以參考Rust Learning。
2 使用Rust進行HTTP Web后端應用開發
在Rust生態中進行HTTP Web后端應用開發目前主要依賴兩個基礎庫:http?以及hyper,其中?http?提供HTTP標準相關的基礎類型,如Request
基于http以及hyper,社區中還有很多用于Web應用開發的框架,常用的有:
???rocket
???iron
??actix-web
???tower-web
值得一提的是上周剛發布的tower-web,因為這是官方net團隊2018年工作計劃的一部分,?這個庫在未來會為Rust生態提供一個靈活、高效、易于使用的Web開發框架。那么事不宜遲,?我們通過實戰演練來一睹為快。
在本月月底,tower-web將會集成到warp項目中,成為warp框架的一部分,開發的重心將會轉移到warp上。
2.1 實戰演練
2.1.1 準備后端應用服務器
登錄華為云,并創建彈性云服務器作為我們的后端應用服務器。
實戰中使用的系統版本為Ubuntu 16.04,如果選擇不同的系統需要根據情況調整命令。
2.1.2 安裝相關的工具鏈
apt update && apt install build-essential
#?安裝Rust工具鏈
curl https://sh.rustup.rs -sSf | sh
這一步結束后,我們就可以開始編寫我們的應用服務了。
2.1.3 編寫后端Web應用
這次分享我們來構建一個RESTful中文分詞API。
1. 首先我們來創建一個Rust工程?cargo new --bin chinese_segmentation
2. 接下來在Cargo.toml中添加相關依賴。
[dependencies] ?tower-web?=?"0.2" ?#?Jieba?Chinese?Work?Segmentation ?jieba-rs?=?"0.2" ? ?#?logging?utils ?log?=?"0.4.0" ?env_logger?=?"0.5.12" ? ?#?Serializing?responses,?deserializing?requests ?serde?=?"1.0.70"
3. 然后是我們的main.rs,與其他語言一樣,在文件開始的部分引入外部依賴以及相關聲明:
extern?crate?jieba_rs; ?#[macro_use] ?extern?crate?tower_web; ? ?#[macro_use] ?extern?crate?log; ?extern?crate?env_logger; ? ?use?std::iter::FromIterator; ?use?std::collections::HashSet; ? ?use?jieba_rs::Jieba; ?use?tower_web::ServiceBuilder;
4. 接下來我們定義我們的服務資源ChineseTokenizer:
#[derive(Debug)] ?struct?ChineseTokenizer?{ ?????inner:?Jieba, ?} ? ?impl?ChineseTokenizer?{ ?????pub?fn?new()?->?ChineseTokenizer?{ ?????????ChineseTokenizer?{?inner:?Jieba::new()?} ?????} ? ?????//對傳入的字符串進行分詞,并返回一個字符串向量 ?????pub?fn?cut(&self,?text:?&String)?->?Vec
5. 定義了我們的服務資源后,我們來定義輸入Web API的輸入輸出類型:
#[derive(Debug,?Extract)] ?struct?TokenizeRequest?{ ?????text:?String ?} ? ?#[derive(Debug,?Response)] ?#[web(status?=?"200")]?//當handler返回Ok(xx)時,返回200狀態碼 ?struct?TokenizeResponse?{ ?????words:?Vec
6. 到目前為止,我們已經有了我們的服務資源,輸入輸出類型,接下來就到我們的重頭戲了,?Web?部分的實現,別擔心,因為真的很簡單。
impl_web!?{ ?????impl?ChineseTokenizer?{ ?????????#[post("/tokenize")] ?????????#[content_type("application/json")] ?????????fn?tokenize(&self,?body:?TokenizeRequest)?->?Reqult
7. 最后是我們的main函數:
fn?main()?{ ?????//初始化Logger ?????env_logger::init(); ?????let?addr?=?"0.0.0.0:8081".parse().expect("invalid?address"); ?????info!("listening?on?http://{}",?addr); ? ?????ServiceBuilder::new() ?????????.resource(ChineseTokenizer::new())?//注冊我們的服務資源 ?????????.run(&addr)?????????????//讓我們的服務跑起來 ?????????.unwrap(); ?}
8. 現在,我們通過命令RUST_LOG=chinese_segmentation=info cargo run --release來檢驗?一下我們的成果了。
服務在本地跑起來之后,我們可以通過命令?curl -H "Content-Type: application/json" -X POST -d '{"text":"中間件小哥"}'
本地測試通過之后,就需要著手開始部署了,我們檢查一下彈性云服務器的安全組的入方向?是否放開8081端口。
2.2 API?部署
API?網關集成了監控、流控、負載均衡等一系列功能,為開發者提供高性能、高可用的API?托管服務,在本次實踐中,我們將我們的API部署在API網關中。
1. 登錄華為云API網關服務,選擇“新建API”。
2.?填寫API的基本信息
在本次實驗中,選擇無認證。
3.?定義API請求。
請求路徑填為?/segment,方法為?POST
4.? ?定義后端服務。
請求方式設置為POST,在VPC通道這一項中,我們需要新建VPC通道。端口設置為8081,?并將其與彈性云服務器關聯。
6. 創建完VPC通道后,回到API創建頁面,填入相關信息:
7. 網關創建完成后,我們需要回到我們的彈性云服務器,將我們的后端服務器先跑起來:
RUST_LOG=chinese_segmentation=info nohup ./target/release/chinese_segmentation 2>&1 ~/api.log &
作為示例,這里使用nohup命令來跑我們的服務。但在生產環境中,建議使用?systemd等工具來跑服務。
8. 服務在云服務器運行起來之后,將API發布至RELEASE環境中。
然后我們就可以和我們的API愉快地玩耍啦。
歡迎掃碼查看更多精彩:
API網關 APIG 華為云 API
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。