使用 Salvo、PyO3 和 JioNLP 实现成语接龙的 API 接口服务
在本教程中,我们将使用 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许可证)