5分鐘APIG實戰| 使用Rust語言快速構建API能力開放

      網友投稿 946 2022-05-30

      文檔內容快速瀏覽:

      1 序言:Rust語言簡介

      1.1?核心概念:所有權系統

      2 使用Rust進行HTTP Web后端應用開發

      2.1 實戰演練

      2.1.1 準備后端應用服務器

      2.1.1 安裝相關的工具鏈

      2.1.2 編寫后端Web應用

      2.2 API部署

      5分鐘APIG實戰| 使用Rust語言快速構建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?、Response以及StatusCode和常用的Header等;hyper的定位是一個高效、準確的?HTTP底層庫,它封裝了HTTP的報文解析、報文編碼處理、連接控制等內容,對于用戶而言?只需要實現一個類似于Fn(Request) -> Response的映射,就可以完成HTTP Web服務端的開?發。

      基于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?{ ?????????let?words?=?self.inner.cut(&text,?true) ?????????????.into_iter() ?????????????.map(|word|?word.to_owned()) ?????????????.collect::>(); ? ?????????let?mut?words?=?Vec::from_iter(words.into_iter()); ? ?????????//由于使用HashSet進行去重會引入不確定性,????? ?????????//因此對結果進行重排,使輸出的結果有序。 ?????????words.sort(); ?????????words ?????} ?}

      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?{ ?????????????Ok(TokenizeResponse?{ ?????????????????words:?self.cut(&body.text), ?????????????}) ?????????} ?????} ?}

      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小時內刪除侵權內容。

      上一篇:Excel表格中插入圖片圖表的按鈕呈灰色怎么解決
      下一篇:由一個簡單的Python合并字典問題引發的思考,如何優化我們的代碼?
      相關文章
      亚洲成AV人片一区二区密柚| 国产精品V亚洲精品V日韩精品 | 亚洲一区二区三区精品视频 | 亚洲一区二区中文| 国产精品亚洲精品日韩已满| 中文字幕亚洲一区二区三区| 亚洲一级特黄无码片| 亚洲国产成人久久综合区| 日韩精品电影一区亚洲| 国产亚洲精品第一综合| xvideos亚洲永久网址| 亚洲?V无码乱码国产精品| 国产亚洲蜜芽精品久久| 亚洲精品国产精品国自产观看 | 亚洲天堂一区二区三区| 亚洲国产精品网站久久| 亚洲国产精品专区| 激情亚洲一区国产精品| 亚洲中文精品久久久久久不卡| 精品国产日韩久久亚洲| 亚洲愉拍一区二区三区| 亚洲国产欧美国产综合一区| 亚洲AV色欲色欲WWW| 国产成人亚洲综合在线| 亚洲国产香蕉人人爽成AV片久久| 亚洲精品WWW久久久久久| 亚洲综合最新无码专区| 亚洲欭美日韩颜射在线二| 亚洲精品乱码久久久久久自慰 | 国产成人亚洲综合网站不卡| 亚洲无人区码一二三码区别图片| 亚洲国产精华液2020| 国产亚洲综合精品一区二区三区| 亚洲一区二区高清| 亚洲av无码一区二区乱子伦as| 亚洲自偷自拍另类12p| 亚洲午夜成激人情在线影院| 亚洲精品自偷自拍无码| 国产AV无码专区亚洲AV琪琪| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲AV无码乱码精品国产|