当前位置: 首页 > news >正文

Rust编程实战:Rust实现简单的Web服务,单线程性能问题

知识点

  1. tcp 服务
  2. 多线程处理

实现功能

启动web服务,访问链接获取页面内容。

单线程web服务

TcpListener

使用 TcpListener 开启服务端口

 let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

处理客户端连接:

 for stream in listener.incoming() {println!("Connection established!");}

当浏览器访问 http://127.0.0.1:7878/ 就打印 “Connection established!”, 表示服务启动成功。

处理接口请求

设计2个接口:

  1. 访问 http://127.0.0.1:7878 时,显示index.html 的内容
  2. 访问 http://127.0.0.1:7878/sleep 时,做一个延迟,模拟单线程服务的问题

准备html文件

  1. index.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Hello!</title></head><body><h1>Hello!</h1><p>Hi from Rust</p></body>
</html>
  1. 404.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>你好!</title></head><body><h1>很抱歉!</h1><p>由于运维删库跑路,我们的数据全部丢失,总监也已经准备跑路,88</p></body>
</html>

实现

  1. 实现请求路由判断
  2. 读取 html 文件内容,并且返回

请求路由判断

通过 BufReader 获取请求数据

   // 解析buffer. 获取请求的数据let buf_reader = BufReader::new(&mut stream);// 读取请求行let http_request: Vec<_> = buf_reader.lines().map(|result| result.unwrap()).take_while(|line| !line.is_empty()).collect();

http_requset 得到数据如下:

["GET / HTTP/1.1","Host: 127.0.0.1:7878","Connection: keep-alive",...]

由此数据可得,只需要判断数组第一个数据就知道请求到哪个路由了。

 let request_line =  if http_request.len( ) > 0 { &http_request[0] } else {""};let (status_line, filename) =  match &request_line[..] {"GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "index.html"),"GET /sleep HTTP/1.1" => {std::thread::sleep(Duration::from_secs(5)); // 添加 5 s 延迟("HTTP/1.1 200 OK", "index.html")}_ => ("HTTP/1.1 404 NOT FOUND", "404.html"),};

处理html文件

通过 文件 处理模块 fs 获取文件的内容。

    let contens = fs::read_to_string(filename).unwrap();

设置返回数据

获取文件的内容之后,把数据返回给客户端, 通过 write_all 方法。

 let content_length = contens.len();// 组合返回数据let response = format!("{}\r\nContent-Length: {}\r\n\r\n{}",status_line,content_length,contens);stream.write_all(response.as_bytes()).unwrap();

效果

当客户端访问 http://127.0.0.1:7878 就会看到 index.html 的内容。如果客户端先访问 http://127.0.0.1:7878/sleep 新起标签页面访问 http://127.0.0.1:7878,如下图。你会发现 http://127.0.0.1:7878 的请求并没有立即显示,而是等待 sleep 请求结束才会显示。相当于接口会存在排队的处理,这对于web服务是个不好的体验。因此需要多线程去处理这些问题。
在这里插入图片描述

处理多线程请求

将每个请求都用 thread 去处理

thread::spawn(|| {handle_connection(stream);});

效果如下,并没有发生排队的问题。这只是简单处理,实际上现在成熟的框架处理单线程的问题。
在这里插入图片描述
源码

相关文章:

Rust编程实战:Rust实现简单的Web服务,单线程性能问题

知识点 tcp 服务多线程处理 实现功能 启动web服务&#xff0c;访问链接获取页面内容。 单线程web服务 TcpListener 使用 TcpListener 开启服务端口 let listener TcpListener::bind("127.0.0.1:7878").unwrap();处理客户端连接&#xff1a; for stream in lis…...

GitLab 密钥详解:如何安全地使用 SSH 密钥进行身份验证

目录 一、什么是 GitLab SSH 密钥&#xff1f;二、为什么要使用 SSH 密钥&#xff1f;三、如何生成 SSH 密钥&#xff1f;1. Linux/macOS2. Windows 四、将公钥添加到 GitLab五、配置 SSH 客户端六、常见问题及解决方案七、总结 GitLab 是一个功能强大的 Git 仓库管理平台&…...

《论数据分片技术及其应用》审题技巧 - 系统架构设计师

论数据分片技术及其应用写作框架 一、考点概述 本论题“论数据分片技术及其应用”主要考察的是软件工程中数据分片技术的理解、应用及其实际效果分析。考点涵盖以下几个方面&#xff1a; 首先&#xff0c;考生需对数据分片的基本概念有清晰的认识&#xff0c;理解数据分片是…...

【C++】当一个类A中没有声明任何成员变量和成员函数,sizeof(A)是多少?

在 C 中&#xff0c;即使一个类没有任何数据成员&#xff08;即空类&#xff09;&#xff0c;它的大小也不会是 0&#xff0c;而是 1。这主要有以下几个原因&#xff1a; 地址唯一性要求 C 标准规定&#xff0c;每个对象都必须有唯一的地址。如果空类的大小为 0&#xff0c;那么…...

Maven 私服的搭建与使用(一)

一、引言 在 Java 项目开发中&#xff0c;Maven 作为强大的项目管理和构建工具&#xff0c;极大地提高了开发效率&#xff0c;而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库&#xff0c;架设在局域网内&#xff0c;代理广域网上的远程仓库&…...

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…...

linux网络(3)—— socket编程(1)socket基础认识

欢迎来到博主的专栏&#xff1a;linux网络 博主ID&#xff1a;代码小豪 文章目录 IP与端口号socket字节序问题 IP与端口号 我们现在知道了&#xff0c;只要发送的报文的报头包含目的IP地址和源IP地址&#xff0c;就能通过通信设备&#xff0c;是两台主机进行远程通信&#xff…...

【Kubernets】K8S内部nginx访问Service资源原理说明

文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南 前言环境准备目录创建启动Docker容器 数据库配置修改进入容器启动SQL*PlusPDB操作与字符串扩展设置配置验证 管理员用户创建注意事项总结 前言 本文将详细讲解在Docker环境中配置Oracle Database 23a…...

使用pytorch和opencv根据颜色相似性提取图像

需求&#xff1a;将下图中的花朵提取出来。 代码&#xff1a; import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...

MySQL 8.X 报错处理

1.重新加载配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN权限 重新授权 GRANT ENCR…...

Ubuntu 22.04安装OpenJDK 17

步骤一&#xff1a;更新软件包 sudo apt update步骤二&#xff1a;安装openjdk-17 sudo apt install openjdk-17-jdk当系统要求输入密码时&#xff0c;请输入密码。然后键入 Y 并按 Enter 继续安装 步骤三&#xff1a;查看安装版本 java -version步骤四&#xff1a;查看安装…...

【时序预测】时间序列有哪些鲁棒的归一化方法

时间序列数据在金融、气象、医疗等领域中广泛存在&#xff0c;而股票数据作为典型的时间序列之一&#xff0c;具有非平稳性、噪声多、波动大等特点。为了更好地进行数据分析和建模&#xff0c;归一化是一个重要的预处理步骤。然而&#xff0c;由于时间序列数据的特殊性&#xf…...

nlp第九节——文本生成任务

一、seq2seq任务 特点&#xff1a;输入输出均为不定长的序列 自回归语言模型&#xff1a; 由前面一个字预测下一个字的任务 encoder-decoder结构&#xff1a; Encoder-Decoder结构是一种基于神经网络完成seq2seq任务的常用方案 Encoder将输入转化为向量或矩阵&#xff0c;其…...

STM32MP1xx的启动流程

https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview 根据提供的知识库内容&#xff0c;以下是STM32 MPU启动链的详细解析&#xff1a; 1. 通用启动流程 STM32 MPU启动分为多阶段&#xff0c;逐步初始化外设和内存&#xff0c;并建立信任链&#xff1a; 1.1 ROM代码&…...

wgcloud-server端部署说明

Wgcloud 是一款开源的轻量级服务器监控系统&#xff0c;支持多平台&#xff0c;可对服务器的 CPU、内存、磁盘、网络等指标进行实时监控。 以下是 Wgcloud Server端的详细部署步骤&#xff1a; 环境准备 服务器&#xff1a; 至少准备两台服务器&#xff0c;一台作为监控端&a…...

大模型Agent:人工智能的崭新形态与未来愿景

在人工智能技术高歌猛进的当下&#xff0c;大模型 Agent 作为 AI 领域的关键研究方向&#xff0c;正日益彰显出其独有的魅力以及广阔无垠的应用前景。大模型 Agent 不但具备对环境的感知、自主的理解、决策的制定以及行动的执行能力&#xff0c;而且能够游刃有余地应对繁杂任务…...

专题二最大连续1的个数|||

1.题目 题目分析&#xff1a; 给一个数字k&#xff0c;可以把数组里的0改成1&#xff0c;但是只能改k次&#xff0c;然后该变得到的数组能找到最长的子串且都是1。 2.算法原理 这里不用真的把0变成1&#xff0c;因为改了比较麻烦&#xff0c;下次用就要改回成1&#xff0c;这…...

【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824

背景 最近在某客户的ORACLE开发环境(oracle 19.10)中&#xff0c;发现一个非常奇怪情况, 开发人员反馈&#xff0c;有一条SQL&#xff0c;查询了两个sum函数作为两个字段&#xff0c; select sum(c1),sum(c2) from ...当两个sum一起出现时&#xff0c;第一个sum的结果不对&am…...

2025国家护网HVV高频面试题总结来了03(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...

前端转行网络安全靠谱吗?靠挖漏洞变现可行吗

前言 最近&#xff0c;一个做运维的朋友跟我说他在学渗透测试。他说&#xff0c;公司请别人做渗透测试的费用是 2千/人天&#xff0c;一共2周。2周 2w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听…...

别再手动算镀膜了!用Ansys Zemax非序列模式,5分钟搞定二向分色分光镜仿真

5分钟极速仿真&#xff1a;Ansys Zemax非序列模式下二向分色分光镜的实战技巧 在光学系统设计中&#xff0c;二向分色分光镜的仿真往往成为效率瓶颈。传统方法需要手动计算镀膜参数、反复调试光线路径&#xff0c;消耗工程师大量时间。本文将揭示如何利用Ansys Zemax非序列模式…...

北京欧雷新宇助力重庆机电工程高级技工学校建成“动捕+虚拟拍摄”实训基地,赋能影视动漫人才培养

项目名称&#xff1a;重庆机电工程高级技工学校“计算机动画与制作实训基地”项目 地点&#xff1a;重庆市 应用专业&#xff1a;影视动漫设计与制作专业 项目概述: 近日&#xff0c;北京欧雷新宇动画科技有限公司作为核心产品与技术提供商并承担整体实施的“计算机动画与…...

钠金属负极自校正技术:复合纸基底设计原理与工程实践

1. 项目概述&#xff1a;从“火中取栗”到“驯服烈马”的钠金属负极革新在电池研发领域&#xff0c;金属钠负极一直被视为下一代高能量密度电池的“圣杯”&#xff0c;其理论比容量高达1166 mAh/g&#xff0c;是石墨负极的近三倍&#xff0c;且钠资源储量丰富、成本低廉。然而&…...

Auto-Lianliankan:3步实现Python图像识别破解连连看

Auto-Lianliankan&#xff1a;3步实现Python图像识别破解连连看 【免费下载链接】Auto-Lianliankan 基于python图像识别实现的连连看外挂&#xff0c;可实现QQ连连看秒破 项目地址: https://gitcode.com/gh_mirrors/au/Auto-Lianliankan 在游戏自动化领域&#xff0c;Au…...

不止于获取数据:用baostock+Pandas+Matplotlib打造你的第一个股票分析仪表盘

从数据获取到洞察生成&#xff1a;构建股票分析仪表盘的全流程实战 在金融数据分析领域&#xff0c;获取原始数据只是万里长征的第一步。真正有价值的是如何将这些数据转化为可操作的洞察。本文将带你使用Python生态中的baostock、Pandas和Matplotlib等工具&#xff0c;构建一个…...

NAS-FPN里的GP和Sum Cell到底怎么工作的?手把手图解MMCV源码实现

NAS-FPN中的GP与Sum Cell工作机制解析&#xff1a;从理论到MMCV源码实现 在目标检测领域&#xff0c;特征金字塔网络(FPN)已经成为处理多尺度目标的标配组件。然而传统FPN采用固定的人工设计结构&#xff0c;难以适应不同检测任务的需求。NAS-FPN通过神经网络结构搜索技术&…...

告别充电焦虑!用FS4066系列芯片DIY一个支持USB PD快充的2-4串锂电池充电器(附完整电路图)

用FS4066系列芯片打造高效多串锂电池快充方案 在创客圈子里&#xff0c;给多节串联锂电池设计充电电路一直是个既令人兴奋又充满挑战的课题。想象一下&#xff0c;当你精心组装的无人机因为充电效率低下而频繁停飞&#xff0c;或者户外电源设备因为充电管理不当导致电池寿命骤减…...

如何用3分钟完成淘宝淘金币全任务?终极自动化脚本完全指南

如何用3分钟完成淘宝淘金币全任务&#xff1f;终极自动化脚本完全指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...

数据库安全与权限管理

数据库安全与权限管理 1. 技术分析 1.1 数据库安全概述 数据库安全是保护数据资产的关键&#xff1a; 安全威胁未授权访问: 密码泄露SQL注入: 恶意SQL数据泄露: 敏感信息暴露数据篡改: 非法修改安全措施:访问控制加密存储审计日志1.2 权限管理 权限级别全局权限: ALL PRIVILEGE…...