Rust是一門很棒的語言,目前是我2019年和2020年(到目前為止)學習最多的語言。Rust幾乎可以與任何語言進行互操作。Rust對容器和K8s也很好。今天我要展示如何構建一個簡單的微服務。我們將使用Actix、Tokio Postgress和其他庫。我們將使用postgres作為事實的來源,並在docker中執行它(為了開發)。我們還將使用Barrel +一些我建立的自定義移植結構。程式碼將全部是非同步和非阻塞IO。希望你玩得開心,我們開始吧。
架構這裡我們有一個多層架構,其中業務規則和rest定義在news-contract中定義。SOA契約在news-contract + news-service中定義,結構(news)在news-contract中定義。rest endpoint definitions+服務是在news-service上定義的。postgress永續性在news dao中定義。
程式碼結構我們有5個專案,有一個全域性工作區,這是一個專案,頂層的。我們有news-contract:這是SOA契約的一部分,我們在程式碼中使用了新聞結構。
news-dao:我們有使用tokio postgres的反應式永續性程式碼和新聞資源的所有CRUD操作。
News-migrations:為了測試,我們使用barrel+自定義邏輯來建立表和新增資料。
News-service:這裡有端點、服務實現和配置了actixweb框架的主類。
每個專案都有自己的依賴項,由Cargo.toml檔案。
我們還有兩個指令碼處理Docker容器。一個執行Postgres,另一個執行psql。
遷移現在讓我們看看如何進行遷移(建立表並將記錄新增到Postgres SQL中)。
我們連線在docker上執行的Postgres資料庫,建立一個包含所有遷移的向量,我們正在執行這個遷移。然後我們將進行一個for all遷移,逐個檢查它們是否執行良好。
現在讓我們看看下一個rust程式碼,什麼是遷移。
我建立了一個名為NewsMigration的結構,其中有一個新的(用於建立結構的函式)和執行遷移的方法(run)。如您所見,我建立了第二個名為CreateTableNewsMigration的結構,以及一個使用(impl)的trait實現,在我使用的barrel程式碼中建立了一個表結構,barrel將生成Postgres SQL INSERT語法。最後,我們在Postress中使用pg\u客戶機執行生成的指令碼。在這裡您可能會看到有點奇怪的程式碼:&news_table[..],在這裡我們傳遞String news_表的引用,並傳遞一個片段([..]),複製字串並傳遞方法。
SOA契約讓我們來看看Soa合同的一部分,Struct新聞。
我們正在定義一個名為News的結構,我使用serde和serde_json來序列化和反序列化這個結構。我還實現了一個稱為Display的特性,以便能夠列印結構。最後,在檔案的末尾有一個單元測試,我正在測試是否可以列印這個結構。
端點/服務這裡我定義了HttpServer actix,並定義了幾個處理程式,比如:index、list、insert、get、delete等。所有資訊都使用日誌和env_logger建立來記錄。
現在讓我們看看端點.rs把剩下的定義歸檔。
這裡有一些宏使用REST操作,比如PUT、DELETE和GET。每個函式處理程式都是公共的,基本上,這裡我呼叫服務並從服務中獲取結果並序列化為json結果。
這是服務實現,我們這裡沒有任何REST或actix依賴關係。這裡是實現驗證、業務邏輯和委託給dao機箱的正確位置。CRUD上的所有函式都是非同步的。
DAO這是魔術發生的地方,我們有tokio-postgress編碼。我們來看看。
這是DAO實現。有一種方法可以在名為connect()的postgres資料庫上進行連線,該方法以非同步和非阻塞的方式進行。在這裡,我演示瞭如何透過id進行查詢。使用tokio postgress客戶端,我執行一個查詢,透過SELECT查詢執行WHERE by id。在postgress id中,handle作為一個UUDI,所以我需要轉換為string,這就是為什麼您看到id::text=$1,在同一行中,我用&[&id]傳遞從引數獲得的id。DAO有更多的函式,您可以在mine GitHub中檢視完整的程式碼。
影片:程式碼演練+死亡演示讓我們看看我用程式碼演練和死亡演示製作的影片。
由【全棧和低程式碼開發】編譯
本文:http://jiagoushi.pro/node/1412