Rust Web 全栈开发(三):使用 Actix 构建简单的 Web Service

Rust Web 全栈开发(三):使用 Actix 构建简单的 Web Service

参考视频:https://www.bilibili.com/video/BV1RP4y1G7KF

需要使用的 crate:

  • actix-web
  • actix-rt

本文介绍了如何使用 Actix 进行 Web 开发,包括新建项目、配置依赖、编写路由并运行服务。Actix 的基本组件包括 HTTP Server、Route 和 Handler,其并发机制支持异步 I/O 和多线程并行,确保高效处理请求。

创建项目

新建一个 Rust 项目,修改其 Cargo.toml:

[workspace]

然后在终端执行 cargo new webservice,在目录下创建一个 webservice 成员包。

在工作区内运行 cargo new 会自动将新创建的包添加到工作区内 Cargo.toml 的 [workspace] 定义中的 members 键中,如下所示:

在这里插入图片描述

此时,我们可以通过运行 cargo build 来构建工作区。项目目录下的文件应该是这样的:

├── Cargo.lock
├── Cargo.toml
├── webservice
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

配置依赖

webservice 需要引用 actix 相关库,打开 webservice/Cargo.toml,在 [dependencies] 部分添加:

actix-web = "4.2.1"
actix-rt = "2.7.0"

编写路由并运行服务

bin 是二进制可执行 crate,编译出的文件为二进制可执行文件。必须要有 main 函数作为入口。这种 crate 不需要在 Cargo.toml 中或 --crate-type 命令行参数中指定,会自动识别。

打开 webservice/Cargo.toml,添加一个 bin 的声明:

[[bin]]
name = "server1"
# path = "src/bin/server1.rs"

接着在 webservice/src 目录下创建一个 bin 目录,再在 bin 目录下创建 server1.rs,编写代码:

use actix_web::{web, App, HttpResponse, HttpServer, Responder};
use std::io;

// 配置 route
pub fn general_routes(cfg: &mut web::ServiceConfig) {
    cfg.route("/health", web::get().to(health_check_handler));
}

// 配置 handler
pub async fn health_check_handler() -> impl Responder {
    HttpResponse::Ok().json("Actix Web Service is running!")
}

// 实例化 HTTP server 并运行
#[actix_rt::main]
async fn main() -> io::Result<()> {
    // 构建 app,配置 route
    let app = move || App::new().configure(general_routes);

    HttpServer::new(app).bind("localhost:3000")?.run().await
}

依旧是我们熟悉的 main -> route -> handler 的调用顺序。

在终端执行命令 cargo run -p webservice --bin server1,指定执行 webservice 库中的 server1。

或者 cd 到 webservice 目录,执行命令 cargo run --bin server1。

打开浏览器,访问 localhost:3000/health,可以看出程序运行成功:

在这里插入图片描述

Actix 的基本组件

Actix HTTP Server 实现了 HTTP 协议,默认情况下,它开启多个线程来处理来自互联网的请求。

在这里插入图片描述

接收到客户端的请求后,Actix HTTP Server 将其转发给 Actix App 内的对应路由,路由再将请求发给对应的 Handler 进行处理,处理完响应之后,将响应传回客户端。

Actix 的并发

Actix 支持两类并发:

  1. 异步 I/O:给定的 OS 原生线程在等待 I/O 时执行其他任务。
  2. 多线程并行:默认情况下启动 OS 原生线程的数量与系统逻辑 CPU 数量相同。

尾声

视频教程 的 Actix 相关库的版本

actix-web = "3"
actix-rt = "1.1.1"

会出现空指针解引用的错误,程序不能正常执行。

这里给出原版教程的官方源码地址:

https://github.com/peshwar9/rust-servers-services-apps/tree/master

后续如果还出现这种情况,建议对比源码看看。

Unet是一种深度学习模型,最初由Ronneberger等人在2015年提出,主要用于生物医学图像分割。在Matlab中实现Unet网络可以利用其强大的数学计算能力和友好的可视化界面,非常适合科研和教育用途。这个"Unet分割(Matlab)Demo"提供了在Matlab环境中构建、训练和应用Unet模型的示例。 Unet网络的特点在于其对称的架构,由下采样(编码器)和上采样(解码器)两部分组成。编码器部分用于捕捉图像的上下文信息,通过多个卷积层和池化层逐级降低特征图的分辨率,增加表示能力。解码器部分则负责恢复图像的原始空间分辨率,通过上采样和与编码器的跳连接来恢复细节信息。 在`segunet.mlx`文件中,我们可能会看到以下关键步骤的实现: 1. **网络结构定义**:定义Unet的卷积层、池化层、上采样层等。Matlab的Deep Learning Toolbox提供了构建自定义网络的函数,如`conv2d`、`maxpool2d`和`upsample2d`。 2. **损失函数选择**:图像分割通常使用交叉熵损失(cross-entropy loss),有时也会结合Dice系数或Jaccard相似度来评估模型性能。 3. **数据预处理**:`data`文件可能包含训练和验证数据,需要进行归一化、分批次等预处理操作。 4. **模型训练**:设置优化器(如Adam)、学习率策略,并执行训练循环。 5. **模型评估**:在验证集上评估模型的性能,例如计算 Dice 指数或IoU(Intersection over Union)。 6. **可视化结果**:展示模型预测的分割结果,与实际标签对比,帮助理解模型性能。 为了运行这个Demo,你需要确保安装了Matlab的Deep Learning Toolbox以及相关的数据集。`segunet.mlx`是Matlab Live Script,它将代码、注释和输出结合在一起,便于理解和执行。在Matlab环境中打开此脚本,按照指示操作即可。 此外,了解Unet在网络架构设计上的创新,比如跳跃连接(skip connections),有助于理解模型为何能有效地处理图像分割任务。Unet的成功在于它既能捕捉局信息又能保留局部细节,因此在生物医学图像分析、遥感图像分割、语义分割等领域有广泛应用。 这个"Unet分割(Matlab)Demo"提供了一个直观的起点,帮助初学者和研究人员快速上手Unet网络的实现和训练,为后续的图像分割项目打下基础。通过学习和实践,你可以掌握深度学习在Matlab中的应用,进一步提升在图像处理领域的技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值