• Rust使用Spin框架构建微服务
  • 发布于 2个月前
  • 492 热度
    0 评论
  • Fayer
  • 0 粉丝 41 篇博客
  •   
本文将首先概述一下Spin框架,并构建一个简单的微服务。

Spin概述
Spin是一个用于开发、运行和部署微服务和web应用程序的开源框架。你可以使用任何与wasi兼容的语言(如Go、Rust、Java和JavaScript)在Spin中开发微服务应用程序。

Spin将你的微服务应用程序转换为WebAssembly组件,用于serverless云平台(如AWS lambda,系统上的自托管服务器)或WebAssembly云平台(如Fermyon cloud)。在构建和运行微服务时,WebAssembly提供了安全性、可移植性和速度。

什么是微服务?
微服务是在较大的分布式应用程序中执行特定功能的独立软件组件。它们被设计成在分布式系统中一起工作,每个服务负责一个任务,同时与其他服务通信以执行复杂的操作。微服务被构建为小型、轻量级、模块化和可独立部署的。你可以将它们部署在容器中,例如Docker,并使用容器编排工具(如Kubernetes)管理它们。你还可以使用serverless计算平台(如Google Cloud functions和AWS lambda)实现它们。

安装Spin

现在你已经熟悉了Spin和微服务,是时候将Spin二进制文件安装到系统中了。二进制文件允许你设置一个项目,并托管一个本地服务器,并在所有主要的操作系统上运行,包括Windows, Linux和MacOS。你还可以选择从源代码构建二进制文件,或者使用cargo将其安装到系统中。

从源代码构建
要从源代码构建二进制文件,请遵循以下步骤。
首先从git库clone源代码:
git clone https://github.com/fermyon/spin
构建:
cd spin && make build
验证构建的二进制文件:
./target/release/spin --help
使用Cargo安装
要安装带有cargo的二进制文件,请遵循以下步骤。
首先从git库clone:
git clone https://github.com/fermyon/spin -b v0.9.0
进入spin目录:
cd spin
为Rust安装wasm32-wasi target:
rustup target add wasm32-wasi
编译并安装spin到你的系统:
cargo install --locked --path .
验证安装是否成功:
spin --help
设置项目文件夹
在系统上安装了spin之后,让我们为构建微服务设置一个项目文件夹。在本节结束时,将拥有一个初始化的项目文件夹,用于构建微服务。

Spin为构建几种不同类型的应用程序提供了模板。要检查系统上安装的模板,运行命令:
spin templates list
如果系统中没有安装模板,执行如下命令:
spin templates install --git https://github.com/fermyon/spin --update
上面的命令安装Spin GitHub repo中的所有可用模板。模板安装完成后,你可以重新检查列表,查看已安装的模板。

安装模板后,运行以下命令开始设置项目:
$ spin new
Pick a template to start your application with:
> http-c (HTTP request handler using C and the Zig toolchain)
  http-empty (HTTP application with no components)
  http-go (HTTP request handler using (Tiny)Go)
  http-grain (HTTP request handler using Grain)
  http-php (HTTP request handler using PHP)
  http-rust (HTTP request handler using Rust)
  http-swift (HTTP request handler using SwiftWasm)
  http-zig (HTTP request handler using Zig)
  redirect (Redirects a HTTP route)
  redis-go (Redis message handler using (Tiny)Go)
  redis-rust (Redis message handler using Rust)
  static-fileserver (Serves static files from an asset directory)

该命令提示你输入要使用的模板、项目名称、项目描述、HTTP路径。对于模板,选择http-rust。对于项目名称,写任何你想要的名称。对于描述、HTTP路径,可以按Enter来使用它们的默认值。


运行项目
在设置项目之后,你可能想看看应用程序是如何运行的。本节将展示如何构建、运行和测试项目。在本节结束时,项目将在你的系统上运行。在构建项目之后,进入项目目录,使用以下两个命令将项目编译成WebAssembly组件:
rustup target add wasm32-wasi    # Install the WebAssembly target
spin build                       # Build the project
命令完成后,生成的WebAssembly组件位于target/wasm32-wasi/release文件夹中。spin允许在你的系统上托管WebAssembly组件,使用以下命令:
spin up
它在http://localhost:3000/中托管微服务应用程序。一旦项目开始运行,你可以用curl命令测试它:
$ curl -i localhost:3000
HTTP/1.1 200 OK
foo: bar
content-length: 14

Hello, Fermyon
在下面的部分中,我们将介绍Spin的关键组件spin.toml和项目中的lib.rs文件。

Spin.toml:清单文件
spin.toml是一个清单文件,它包含项目的配置。
spin_version = "1"
authors = ["Username <youremail@example.com>"]
description = ""
name = "project-name"
trigger = { type = "http", base = "/" }
version = "0.1.0"

[[component]]
id = "project-name"
source = "target/wasm32-wasi/release/spin_test.wasm"
allowed_http_hosts = []
[component.trigger]
route = "/..."
[component.build]
command = "cargo build --target wasm32-wasi --release"
第5行的trigger变量,用于配置微服务的性质。这个微服务为外部应用程序提供了一个HTTP接口,以便与微服务进行交互。
第10行中的source变量,它指向编译器放置编译后的WebAssembly组件的位置。
第13行的route变量,用于配置微服务所在的路由。/…是一个通配符,它使微服务可以从任何路由访问。

lib.rs
编译器将这个lib.rs文件编译成WebAssembly组件。
use anyhow::Result;
use spin_sdk::{
    http::{Request, Response},
    http_component,
};

/// A simple Spin HTTP component.
#[http_component]
fn handle_spin_test(req: Request) -> Result<Response> {
    println!("{:?}", req.headers());
    Ok(http::Response::builder()
        .status(200)
        .header("foo", "bar")
        .body(Some("Hello, Fermyon".into()))?)
}
#[http_component]宏表示handle_spin_test函数是一个HTTP组件。每当向微服务发送HTTP请求时,Spin都会运行handle_spin_test函数,微服务在请求结束时返回handle_spin_test的结果。

构建微服务
初始化的项目只处理Spin微服务的基本内容,我们将构建一个功能更强大的微服务。将以下代码写入lib.rs:
use anyhow::Result;

use spin_sdk::{
    http::{Request, Response},
    http_component,
};

#[http_component]
fn cat_facts(_req: Request) -> Result<Response> {
    // 堆代码 duidaima.com
    // fetch fact from the API
    let mut res = spin_sdk::http::send(
        http::Request::builder()
            .method("GET")
            .uri("https://catfact.ninja/fact")
            .body(None)?,
    )?;
    // Add "Server" key into the header
    res.headers_mut()
        .insert(http::header::SERVER, "spin/0.1.0".try_into()?);
    // Send response to the client
    Ok(res)
}
spin库提供了发送HTTP请求的方法。在这个微服务中,我们使用该方法从“https://catfact.ninja/fact”的API中获取数据。该方法生成一个响应,cat_facts函数可以将其作为微服务的响应对象返回。

为了完成这个项目,在spin.toml文件的第11行增加了allowed_http_hosts变量:
allowed_http_hosts = ["catfact.ninja"]
如果你不这样做,当你运行项目时,你会得到一个HttpError:: destinationnotalallowed错误。

在浏览器中输入:http://localhost:3000/ 得到如下数据:
{"fact":"Cats have 32 muscles that control the outer ear (humans have only 6). A cat can independently rotate its ears 180 degrees.","length":122}

总结
微服务是分布式应用程序的基础。它们是相互独立的部分,相互作用形成一个更大的分布式应用程序。本文将引导你构建微服务。使用本文中的知识,你可以构建更复杂的微服务,例如执行数据库交互或身份验证的微服务。要了解有关Spin框架的更多信息,请务必查看Spin文档。

用户评论