iT邦幫忙

2024 iThome 鐵人賽

DAY 29
1
Software Development

Rust 學得動嗎系列 第 29

[Day 29] Rust 在雲端原生(Cloud Native)環境中的應用

  • 分享至 

  • xImage
  •  

今天,我們將聊聊 Rust 在雲端原生環境中的應用。隨著雲端運算的普及,Rust 的安全性、效能和可靠性使其成為開發雲端原生應用程式的理想選擇,雖然論雲原生的話Golang是目前比較普遍的選擇。

1. 容器化應用程式

DockerKubernetes 等容器技術是雲端原生環境的核心。Rust 可以輕鬆地構建輕量級、高效能的容器化應用程式。

範例:使用 Rust 建立一個簡單的 HTTP 伺服器並容器化

use warp::Filter;

#[tokio::main]
async fn main() {
    let hello = warp::path!("hello" / String)
        .map(|name| format!("你好,{}!", name));

    warp::serve(hello)
        .run(([0, 0, 0, 0], 8080))
        .await;
}

Dockerfile:

FROM rust:1.55 as builder
WORKDIR /usr/src/app
COPY . .
RUN cargo build --release

FROM debian:buster-slim
COPY --from=builder /usr/src/app/target/release/my_app /usr/local/bin/my_app
EXPOSE 8080
CMD ["my_app"]

2. 使用 Tokio 進行非同步程式設計

Tokio 是 Rust 的非同步執行時期,非常適合開發高效能的雲端服務。

範例:使用 Tokio 實現一個簡單的非同步 TCP 伺服器

use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;

    loop {
        let (mut socket, _) = listener.accept().await?;
        
        tokio::spawn(async move {
            let mut buf = [0; 1024];

            loop {
                let n = match socket.read(&mut buf).await {
                    Ok(n) if n == 0 => return,
                    Ok(n) => n,
                    Err(e) => {
                        eprintln!("無法讀取資料: {}", e);
                        return;
                    }
                };

                if let Err(e) = socket.write_all(&buf[0..n]).await {
                    eprintln!("無法寫入資料: {}", e);
                    return;
                }
            }
        });
    }
}

3. 使用 Tonic 實現 gRPC 服務

gRPC 是雲端原生應用程式常用的通訊協議。Tonic 是 Rust 的 gRPC 框架。

範例:使用 Tonic 實現一個簡單的 gRPC 服務

use tonic::{transport::Server, Request, Response, Status};

pub mod hello_world {
    tonic::include_proto!("helloworld");
}

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};

#[derive(Debug, Default)]
pub struct MyGreeter {}

#[tonic::async_trait]
impl Greeter for MyGreeter {
    async fn say_hello(
        &self,
        request: Request<HelloRequest>,
    ) -> Result<Response<HelloReply>, Status> {
        let reply = HelloReply {
            message: format!("你好 {}!", request.into_inner().name),
        };
        Ok(Response::new(reply))
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "[::1]:50051".parse()?;
    let greeter = MyGreeter::default();

    Server::builder()
        .add_service(GreeterServer::new(greeter))
        .serve(addr)
        .await?;

    Ok(())
}

4. 使用 Rusoto 與 AWS 服務互動

Rusoto 是一個非官方的 AWS SDK for Rust,可以讓 Rust 應用程式輕鬆與各種 AWS 服務互動。

範例:使用 Rusoto 上傳檔案到 S3

use rusoto_core::Region;
use rusoto_s3::{PutObjectRequest, S3Client, S3};
use tokio::fs::File;
use tokio::io::AsyncReadExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let s3_client = S3Client::new(Region::UsEast1);

    let mut file = File::open("example.txt").await?;
    let mut contents = Vec::new();
    file.read_to_end(&mut contents).await?;

    let put_request = PutObjectRequest {
        bucket: "my-bucket".to_string(),
        key: "example.txt".to_string(),
        body: Some(contents.into()),
        ..Default::default()
    };

    s3_client.put_object(put_request).await?;

    println!("檔案上傳成功!");

    Ok(())
}

5. 使用 Actix Web 建立 RESTful API

Actix Web 是一個高效能的 Web 框架,適合建立雲端原生的 RESTful API。

範例:使用 Actix Web 實現一個簡單的 RESTful API

use actix_web::{web, App, HttpServer, Responder};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User {
    name: String,
    age: u32,
}

async fn create_user(user: web::Json<User>) -> impl Responder {
    web::Json(user.0)
}

async fn get_user(path: web::Path<String>) -> impl Responder {
    let name = path.into_inner();
    web::Json(User {
        name,
        age: 30,
    })
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .route("/users", web::post().to(create_user))
            .route("/users/{name}", web::get().to(get_user))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

結論

Rust 在雲端原生環境中展現出了巨大的潛力。它的安全性、效能和可靠性使其成為開發容器化應用程式、微服務和雲端服務的理想選擇。隨著雲端技術的不斷發展,Rust 在這個領域的應用也將持續增長,雖然目前還是Golang的天下(誤。


上一篇
[Day 28] Rust Rust 在系統重構與優化中的應用
下一篇
[Day 30] Rust 學得動嗎
系列文
Rust 學得動嗎30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言