您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

如何使用Rust构建基本的HTTP Web Server?

时间:2023-04-19 13:53:33  来源:51CTO  作者:布加迪

译者 | 布加迪

审校 | 重楼

51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)

HTTP利用客户端/服务器架构来传输信息和数据。Rust等服务器端编程语言的特性之一是,开发用于与基于HTTP的服务交互的服务器和客户端应用程序。

Rust因其安全性、性能和可靠性等特性而适合构建HTTP服务器系统。Rust的第三方库(比如Actix和Rocket)因构建能够处理高流量的复杂Web服务器而大受欢迎。

一、为什么应该使用Rust进行HTTP Web服务器开发?

Rust在Web服务器开发方面大受欢迎,因为该语言的一些特性正是构建大多数Web服务器所需要的。

使用Rust可以确保应用程序有效扩展,使该语言成为构建高性能应用程序的理想语言。以下是考虑为Web服务器及其他服务器端应用程序使用Rust的几个具体原因。

1.Rust的高性能

高性能是Rust成为构建HTTP Web服务器绝佳选择的原因之一。Rust提供了对系统资源(包括内存和CPU)的低级访问,使您能够编写比其他服务器端语言使用更少资源运行得更快的代码。

此外,Rust的所有权机制不需要编译时收集垃圾,这是一些服务器端语言速度较慢的原因之一。

2.安全和保障

Rust的内存管理所有权机制使得该语言对于Web服务器开发而言很安全。您不会遇到可能导致内存泄漏及其他安全漏洞的空指针或悬空指针引用。

Rust的所有权机制可以防止这些常见错误,为您的服务器和应用程序确保安全。Rust还专注于防止缓冲区溢出及其他与内存相关的错误。

3.并发性

并发性是指能够以无序的方式运行程序的多个单元而不影响输出。并发程序的输出应该与异步程序的输出相同。

并发性会显著影响应用程序的性能,因为服务器需要同时处理多个请求。Rust支持与轻量级线程模型共存。

Rust中并发编程的优势在于,所有权机制让您可以编写线程安全的代码,不需要锁及其他同步原语。

4.Rust提供现代工具

Rust标准库和Rust生态系统中的第三方软件包为有效的Web服务器开发提供了现代工具。

Rust的软件包管理器Cargo简化了依赖项管理和构建流程。此外,Rust还通过Rust Analyzer等工具提供了出色的IDE支持,这类工具提供了无缝代码补全、错误高亮显示及其他特性。

二、Actix库和Rocket库概述

Rust的标准库拥有构建Web服务器所需的大部分实用程序。像Rocket和Actix这样的第三方库简化了用Rust服务器端应用程序的工作。

Actix和Rocket是流行的Rust Web框架,但它们的库在设计和特性上有所不同。

Rocket是一种高级Web框架,注重生产力和易用性。Rocket为使用Rust构建Web应用程序提供了大量的抽象和语法元素。Rocket也因其强大的类型和直观的API设计而颇受欢迎。

您可以在Cargo.toml文件中添加Rocket作为项目依赖项,从而开始使用Rust构建Web应用程序:

[dependencies]

rocket = "0.4.11"

另一方面,Actix-web是一个注重性能和可扩展性的低级框架。Actix利用了基于actor的并发模型,提供了非阻塞I/O,这使得该软件包成为构建高性能Web应用程序的理想选择。

在Cargo.toml文件的依赖项部分中添加Actix作为项目依赖项:

[dependencies]

actix-web = "4.3.1"

 

为项目选择一个库将取决于您项目的规范、库的特性以及您在使用Rust和HTTP方面的经验。

三、使用Rust构建简单的Web服务器

在创建Rust项目并将任何Rocket或Actix框架添加到Cargo.toml文件中的项目依赖项之后,您已准备好开始使用Rust构建Web服务器了。

使用Actix构建简单的Web服务器

 

图片

 

使用Rust构建Web服务时,您可以为请求使用序列化器。

Serde是一个流行的Rust库,用于在Rust类型与JSON、YAML和TOML等数据格式之间序列化和反序列化数据。Serde提供了一个框架,用于定义Rust数据结构与其他数据格式的对应表示之间的数据转换。

下面是为您的项目添加Serde作为第三方软件包的指令。

[dependencies]

serde = { version = "1.0.159" , features = ["derive"] }

 

一旦您添加了Serde和Actix作为项目依赖项,就可以用Rust生成基本的Web服务器。下面介绍了如何创建一个简单的Hello World! Web服务器,使用Actix将字符串写入到客户端:

首先,从actix_web库和serde库导入必要的模块和类型:

 

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

use serde::{Deserialize, Serialize};
 

您将使用serde用构件(struct)将消息序列化到客户端。serde将为客户端将构件转换成JSON。下面是该消息的构件:

 

#[derive(Debug, Serialize, Deserialize)]

struct Message {

    message: String,

}

 

现在您可以为端点定义处理程序(handler)函数。在处理程序函数的顶部,您可以为自定义行为添加装饰符:

 

#[get("/")]

async fn hello() -> impl Responder {

    HttpResponse::Ok().json(Message {

        message: "Hello, World!".to_owned(),

    })

}

 

hello处理程序函数处理GET请求。该函数返回实现来自Actix软件包的Responder特征的类型。

HttpResponse::Ok()类型的JSON方法接受Serde在底层处理的构件实例,并将响应返回给客户端。

定义端点后,您可以启动服务器实例,并将端点挂载到路由上。

 

#[actix_web::main]

async fn main() -> std::io::Result<()> {

    HttpServer::new(|| App::new().service(hello))

        .bind("127.0.0.1:8080")?

        .run()

        .await

}

 

HttpServer::new函数是一个新的服务器实例。main函数启动,服务器用新的应用程序实例挂载hello处理程序函数。bind方法将服务器绑定到指定的URL,run函数运行服务器。

 

图片

 

四、使用Rocket构建简单的Web服务器

Rocket很简约,所以您可以构建简单的Web服务器,无需任何依赖项(除了Rocket库外)。

下面介绍如何使用Rocket创建带有Hello World!端点的简单服务器:

首先,为服务器导入必要的依赖项。

 

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]

extern crate rocket;

// imports from the Rocket crate

use rocket::response::content;

use rocket::State;

 

#![feature(proc_macro_hygiene, decl_macro)]属性为Rocket框架启用了Rust实验特性。#[macro_use]属性从Rocket模块导入宏。

下面是一个处理程序函数,接到请求时提供html

 

#[get("/")]

fn hello_world() -> content::Html<&'static str> {

    content::Html("<h1>Hello, world!</h1>")

}

 

hello_world函数返回一个HTML静态字符串,含有content:: HTML函数。

下面是服务器的配置构件声明(Rocket框架约定):

 

struct Config {

    port: u16,

}

#[get("/port")]

fn port(config: State<Config>) -> String {

    format!("Server running on port {}", config.port)

}

运行服务器时,可以向/port端点请求端口状态。

最后,您将使用ignite函数创建一个服务器实例。添加配置、挂载路由,并启动服务器:

 

fn main() {

    let config = Config { port: 8000 };

    rocket::ignite()

        .manage(config)

        .mount("/", routes![hello_world, port])

        .launch();

}
 

config变量是config构件的一个实例。ignite函数启动服务器实例,manage方法为服务器添加配置,mount方法在基本路由上挂载处理程序函数。最后,launch方法启动服务器以侦听指定的端口。

五、借助WASM使用Rust构建功能强大的Web应用程序

WebAssembly(WASM)是一种二进制指令格式,是为了在浏览器及其他设备上执行而设计的。WASM提供了一种低级字节码格式,Rust等高级编程语言可以将其用作编译目标。

借助WASM,您可以将Rust代码编译成大多数流行浏览器都可以执行的二进制格式。WASM为使用Rust构建健壮的Web应用程序(包括全栈Web应用程序)提供了无限的可能。

原文链接:https://www.makeuseof.com/build-http-web-server-in-rust/



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search: Rust  点击:(2)  评论:(0)  加入收藏
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: Rust  点击:(4)  评论:(0)  加入收藏
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(17)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(20)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown &mdash;&mdash; 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(11)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(31)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(50)  评论:(0)  加入收藏
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01  Search: Rust  点击:(58)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(132)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(99)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(178)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(216)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(135)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH K&Uuml;&Ccedil;&Uuml;KKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(273)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(238)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条