使用 Salvo、PyO3 和 JioNLP 实现成语接龙的 API 接口服务

使用 Salvo、PyO3 和 JioNLP 实现成语接龙的 API 接口服务

Photos provided by Unsplash OR Pexels

在本教程中,我们将使用 Rust 的 Web 框架 Salvo、PyO3 库和 Python 包 JioNLP,实现一个简单的成语接龙 API 接口服务。我们将详细介绍如何在 Linux 环境下设置 Rust 项目、创建 Python 虚拟环境、安装所需的 Python 包,并在 Rust 中调用 Python 代码。最后,我们将使用 Docker 来打包和运行这个服务。

1. 创建 Rust 项目

首先,创建一个新的 Rust 项目:

cargo new idiom_solitaire_api
cd idiom_solitaire_api

2. 添加依赖

Cargo.toml 文件中添加 Salvo、PyO3 和 Tokio 依赖:

[dependencies]
salvo = "0.71"
pyo3 = { version = "0.22.2", features = ["extension-module"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

3. 安装 pyenv 管理 Python 环境

为了确保 Python 环境的一致性和可管理性,我们推荐使用 pyenv 来管理多个 Python 版本和虚拟环境。

安装 pyenv

使用以下命令安装 pyenv

curl https://pyenv.run | bash

配置 pyenv

将以下内容添加到你的 ~/.bashrc~/.zshrc 文件中:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

然后重新加载配置文件:

source ~/.bashrc  # 或者 source ~/.zshrc

安装 Python 版本

使用 pyenv 安装所需的 Python 版本:

pyenv install 3.12.6

创建虚拟环境

使用 pyenv 创建一个新的虚拟环境:

pyenv virtualenv 3.12.6 idiom_solitaire_env

激活虚拟环境

激活虚拟环境:

pyenv activate idiom_solitaire_env

安装 JioNLP

在激活的虚拟环境中,使用 pip 安装 JioNLP 包:

pip install jionlp

4. 编写 Rust 代码

src/main.rs 中编写 Rust 代码来实现成语接龙的 API 接口服务。以下是一个完整的示例:

use pyo3::prelude::*;
use pyo3::types::PyDict;
use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use std::env;

#[derive(Deserialize)]
struct IdiomRequest {
    idiom: String,
}

#[derive(Serialize)]
struct IdiomResponse {
    idiom: String,
}

#[tokio::main]
async fn main() -> PyResult<()> {
    // 设置 Python 解释器路径
    let python_interpreter = "~/.pyenv/versions/idiom_solitaire_env/bin/python";  // 根据你的 pyenv 路径调整

    // 设置环境变量
    env::set_var("PYO3_PYTHON", python_interpreter);

    // 初始化 Python 解释器
    Python::with_gil(|py| {
        // 导入 JioNLP 模块
        let jio = PyModule::import_bound(py, "jionlp")?;

        // 获取 idiom_solitaire 函数
        let idiom_solitaire = jio.getattr("idiom_solitaire")?;

        // 设置参数
        let args = PyDict::new(py);
        args.set_item("same_pinyin", false)?;
        args.set_item("same_tone", true)?;

        // 创建 Salvo 路由
        let router = Router::new()
            .post("/idiom", move |req: &mut Request, _: &mut Response| {
                let idiom_request: IdiomRequest = req.parse_json().unwrap();
                let idiom = idiom_request.idiom;

                let idiom = idiom_solitaire
                    .call1((idiom.clone(), args.clone()))?
                    .extract()?;

                let idiom_response = IdiomResponse { idiom };
                Response::json(&idiom_response)
            });

        // 启动 Salvo 服务
        let acceptor = TcpListener::new("0.0.0.0:8093").bind().await;
        Server::new(acceptor).serve(router).await;

        Ok(())
    })
}

5. 创建 Dockerfile

在项目根目录下创建一个 Dockerfile 文件,内容如下:

# 使用 Rust 官方镜像作为基础镜像
FROM rust:1.81.0 as builder

# 设置工作目录
WORKDIR /usr/src/idiom_solitaire_api

# 复制 Cargo.toml 和 Cargo.lock 文件
COPY Cargo.toml Cargo.lock ./

# 创建一个虚拟的 Cargo 项目以缓存依赖项
RUN mkdir src && echo "fn main() {}" > src/main.rs

# 构建项目以缓存依赖项
RUN cargo build --release

# 复制项目源代码
COPY src src

# 重新构建项目
RUN cargo build --release

# 使用轻量级的 Alpine Linux 作为运行时镜像
FROM alpine:latest

# 安装 Python 和 pyenv
RUN apk add --no-cache python3 py3-pip py3-virtualenv

# 安装 pyenv
RUN curl https://pyenv.run | bash

# 配置 pyenv
ENV PATH="/root/.pyenv/bin:$PATH"
RUN eval "$(pyenv init --path)"
RUN eval "$(pyenv init -)"
RUN eval "$(pyenv virtualenv-init -)"

# 安装 Python 3.9.7
RUN pyenv install 3.12.6

# 创建虚拟环境
RUN pyenv virtualenv 3.12.6 idiom_solitaire_env

# 激活虚拟环境
ENV PYENV_VERSION=idiom_solitaire_env

# 安装 JioNLP 包
RUN pip install jionlp

# 复制编译好的 Rust 二进制文件
COPY --from=builder /usr/src/idiom_solitaire_api/target/release/idiom_solitaire_api .

# 暴露端口
EXPOSE 8093

# 运行服务
CMD ["./idiom_solitaire_api"]

6. 构建和运行 Docker 容器

在项目根目录下运行以下命令来构建 Docker 镜像:

docker build -t idiom_solitaire_api .

构建完成后,运行 Docker 容器:

docker run -p 8093:8093 idiom_solitaire_api

7. 测试 API

你可以使用 curl 或其他 HTTP 客户端工具来测试 API。例如:

curl -X POST http://localhost:8093/idiom -H "Content-Type: application/json" -d '{"idiom": "一心一意"}'

总结

通过本教程,你学会了如何在 Linux 环境下使用 Rust 的 Web 框架 Salvo、PyO3 库和 Python 包 JioNLP 实现一个成语接龙的 API 接口服务。我们还介绍了如何使用 Docker 来打包和运行这个服务。希望这篇教程对你有所帮助!

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)