ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zero To Production In Rust 配套仓库实战指南:从环境搭建到运行测试

Zero To Production In Rust 配套仓库实战指南:从环境搭建到运行测试 后端【免费下载链接】zero-to-productionCode for Zero To Production In Rust, a book on API development using Rust.项目地址https://gitcode.com/GitHub_Trending/ze/zero-to-production点击查看免费下载《Zero To Production In Rust》是一本以实战为导向的 Rust 后端开发入门书而本仓库正是该书配套的补充资料——它托管了一个电子邮件订阅email newsletter项目在全书演进过程中的多个代码快照chapter snapshots。main分支展示的是全书结束时的完整项目状态。本文以该仓库的 README 为主体结合源码、配置文件与测试代码为你完整梳理如何准备环境、如何构建并启动这个 Rust API 服务、如何运行完整的测试套件以及这套流程背后各脚本与模块的真实作用。读完本文你将能独立在本仓库基础上完成一键建库、迁移、启动与测试的完整链路。仓库定位与使用方式本仓库不是书本身而是书中的项目代码。它服务于一个核心目的跟随书籍章节的推进逐步见证一个 Rust API 项目从零到完整生产形态的演化过程。因此仓库默认分支main对应“全书结束”时的最终形态而每个历史章节都有独立的快照分支可供切换浏览。从 Cargo.toml 可以看到最终形态的技术栈构成这也是本书覆盖的核心技术面Web 框架actix-web 4异步运行时tokio启用macros、rt-multi-thread数据库访问sqlx 0.8启用runtime-tokio-rustls、postgres、uuid、chrono、migrate等特性并配合sqlx-cli管理迁移配置管理config 0.14YAML 特性serde-aux密码哈希argon2 0.5会话与消息actix-sessionRedis 会话存储、actix-web-flash-messages可观测性tracing、tracing-subscriber、tracing-bunyan-formatter、tracing-actix-webHTTP 客户端reqwestrustls-tls、json、cookies开发/测试依赖quickcheck、wiremock、fake、claims等对应模块组织在 src/lib.rsauthentication、configuration、domain、email_client、idempotency、issue_delivery_worker、routes、session_state、startup、telemetry、utils入口位于 src/main.rs。章节快照Chapter snapshotsmain分支代表“全书结束”的项目终态。如果你想查看此前各章节结束时项目的样子可以切换到以下专用分支快照演进覆盖了书籍的第 3 到第 11 章分支对应章节root-chapter-03-part0第 3 章第一部分root-chapter-03-part1第 3 章第二部分root-chapter-04第 4 章root-chapter-05第 5 章root-chapter-06-part0第 6 章第一部分root-chapter-06-part1第 6 章第二部分root-chapter-07-part0第 7 章第一部分root-chapter-07-part1第 7 章第二部分root-chapter-07-part2第 7 章第三部分root-chapter-08第 8 章root-chapter-09第 9 章root-chapter-10-part0第 10 章第一部分root-chapter-10-part1第 10 章第二部分root-chapter-10-part2第 10 章第三部分root-chapter-10-part3第 10 章第四部分root-chapter-11第 11 章分支切换命令示例以第 11 章为例git checkout root-chapter-11切换到对应快照后即可按下文同样的步骤构建与运行从而对照阅读书籍、观察项目在不同阶段的代码形态。环境准备Pre-requisites在克隆仓库后你需要先安装两大基础依赖Rust通过 rustup 官方安装脚本 安装Docker用于本地启动 Postgres 与 Redis除此之外各操作系统还有额外的特定要求。Windows需要安装 LLVM 工具链用于生成代码覆盖率报告等与sqlx-clicargo install -f cargo-binutils rustup component add llvm-tools-preview以及数据库迁移命令行工具当前仓库的迁移脚本要求~0.7版本见下cargo install --version~0.7 sqlx-cli --no-default-features --features rustls,postgresLinux以 Ubuntu 与 Arch 为例先安装系统级依赖# Ubuntu sudo apt-get install lld clang libssl-dev postgresql-client # Arch sudo pacman -S lld clang postgresql再安装sqlx-clicargo install --version~0.7 sqlx-cli --no-default-features --features rustls,postgres说明--no-default-features --features rustls,postgres表示不使用默认的 TLS 后端native-tls改用 rustls 并仅启用 Postgres 支持避免依赖系统 OpenSSL 的不确定性这也是sqlx官方推荐的搭配。rustls,postgres与Cargo.toml中sqlx依赖启用的runtime-tokio-rustls特性保持一致。MacOSmacOS 需要zld更快的链接器与sqlx-clibrew install michaeleisel/zld/zldcargo install --version~0.7 sqlx-cli --no-default-features --features rustls,postgres注README 中的版本约束为~0.7而仓库内的 scripts/init_db.sh 在检测sqlx缺失时给出的提示版本为~0.8。两者都以“能通过sqlx database create/sqlx migrate run执行迁移”为准实际使用时请以你克隆分支对应 README 的版本说明为准。如何构建并启动How to build整个启动流程分三步起 Postgres → 起 Redis → 编译运行 Rust 服务。下面逐个拆解并给出脚本背后的细节。第一步通过 Docker 启动已迁移的Postgres./scripts/init_db.sh这个脚本scripts/init_db.sh做的事情远比“跑一个容器”要多它是一套完整的“一键建库”流程前置校验检查psql与sqlx是否已安装缺失时直接报错退出环境变量注入全部连接参数都可用环境变量覆盖默认值如下环境变量默认值含义POSTGRES_USERpostgres数据库用户POSTGRES_PASSWORDpassword数据库密码POSTGRES_DBnewsletter数据库名POSTGRES_PORT5432宿主机映射端口POSTGRES_HOSTlocalhost数据库主机Docker 启动通过docker run启动 Postgres 容器容器名带时间戳postgres_$(date %s)并显式传入-N 1000提高最大连接数——这是为了测试需要测试套件会并发创建多个连接。注意如果检测到已存在名为postgres的容器脚本会打印docker kill container-id提示并要求先停掉旧容器健康等待循环用psql -c \q探测直到 Postgres 就绪迁移组装DATABASE_URL格式postgres://user:passwordhost:port/db执行sqlx database create创建数据库再执行sqlx migrate run应用 migrations 目录下的全部迁移文件——从创建subscriptions表、users表到idempotency表、newsletter_issues表与issue_delivery_queue表共 14 个迁移。如果本机已经跑着 Docker 化的 Postgres可以跳过脚本中的 Docker 步骤通过设置SKIP_DOCKER1环境变量直接复用SKIP_DOCKER1 ./scripts/init_db.sh第二步通过 Docker 启动 Redis./scripts/init_redis.shscripts/init_redis.sh 会启动一个映射到6379端口的redis:7容器容器名同样带时间戳并在存在同名redis容器时提示先docker kill。Redis 在本项目中承担会话存储职责src/startup.rs中通过RedisSessionStore::new(redis_uri...)构建会话中间件SessionMiddleware登录态保存在 Redis 中。第三步编译并启动 Rust 服务cargo build编译通过后运行服务cargo run然后在浏览器中打开http://127.0.0.1:8000/login即可看到登录页。项目自带一个默认管理员账号字段值用户名admin密码everythinghastostartsomewhere种子数据由迁移 20220312175058_seed_user.sql 写入密码以 Argon2 哈希形式存储与测试代码tests/api/helpers.rs中Argon2::new(Algorithm::Argon2id, Version::V0x13, Params::new(15000, 2, 1, None))的参数保持一致的强度配置。服务入口点Entrypoints一览README 提到“可用的入口点列在 src/startup.rs 中”即run函数注册的全部路由。结合main分支源码完整入口点如下方法路径功能源码GET/首页routes/home/mod.rsGET/login登录表单页routes/login/get.rsPOST/login提交登录routes/login/post.rsGET/health_check健康检查routes/health_check.rsPOST/subscriptions提交订阅routes/subscriptions.rsGET/subscriptions/confirm确认订阅邮件链接routes/subscriptions_confirm.rsGET/admin/dashboard管理员仪表盘routes/admin/dashboard.rsGET/admin/newsletters发布订阅邮件表单routes/admin/newsletter/get.rsPOST/admin/newsletters发布订阅邮件routes/admin/newsletter/post.rsGET/admin/password修改密码表单routes/admin/password/get.rsPOST/admin/password提交修改密码routes/admin/password/post.rsPOST/admin/logout登出routes/admin/logout.rs/admin/*全部挂载在web::scope(/admin)下并统一包裹from_fn(reject_anonymous_users)中间件见 src/authentication/middleware.rs未登录访问会被重定向到/login。配置系统端口、数据库与邮件客户端服务实际监听地址、数据库连接串等均由 configuration/base.yaml 提供application: port: 8000 host: 0.0.0.0 hmac_secret: super-long-and-secret-random-key-needed-to-verify-message-integrity database: host: 127.0.0.1 port: 5432 username: postgres password: password database_name: newsletter require_ssl: false email_client: base_url: localhost sender_email: testgmail.com authorization_token: my-secret-token timeout_milliseconds: 10000 redis_uri: redis://127.0.0.1:6379配置加载逻辑见 src/configuration.rs分层覆盖先加载base.yaml通用默认值再加载环境文件local.yaml或production.yaml后者覆盖前者最后叠加APP_前缀的环境变量分隔符为__环境探测通过APP_ENVIRONMENT环境变量选择默认local可选值为local或production其他值会直接报错。local.yaml将 host 设为127.0.0.1并关闭 SSL 要求production.yaml则监听0.0.0.0、要求数据库 SSLrequire_ssl: true并将邮件客户端指向 Postmark 的真实 API环境变量示例APP_APPLICATION__PORT5001可覆盖监听端口APP_DATABASE__PASSWORDxxx可覆盖数据库密码敏感信息hmac_secret、数据库密码、authorization_token、redis_uri均以SecretT类型承载见secrecy依赖防止意外打印泄露。重要提示base.yaml中的hmac_secret与authorization_token是仓库自带的演示值仅用于本地开发。生产环境务必通过APP_APPLICATION__HMAC_SECRET、APP_EMAIL_CLIENT__AUTHORIZATION_TOKEN等环境变量注入真实、随机、足够长的密钥。如何运行测试How to test测试前同样需要先准备好依赖服务./scripts/init_db.sh ./scripts/init_redis.sh然后运行整个测试套件cargo test测试代码集中在 tests/api 目录入口为 tests/api/main.rs包含以下测试模块health_check.rs健康检查端点测试tests/api/health_check.rs——发起GET /health_check断言响应成功且内容长度为 0subscriptions.rs、subscriptions_confirm.rs订阅与确认订阅的完整链路login.rs登录失败会设置 flash 消息并 303 重定向到/logintests/api/login.rsadmin_dashboard.rs、change_password.rs管理员仪表盘与修改密码newsletter.rs发布订阅邮件的后端流程test_user.rs测试用户生成工具。测试是怎么跑起来的spawn_app测试基础设施在 tests/api/helpers.rs 中其核心spawn_app函数揭示了两点设计测试隔离每个测试用Uuid::new_v4()随机生成一个独立数据库名并现场建库迁移应用监听端口设为0由系统随机分配确保并发测试互不干扰外部依赖打桩用wiremock::MockServer启动一个本地 mock 服务器替代 Postmark 邮件 API并把email_client.base_url指向它测试中通过get_confirmation_links从 mock 请求体中提取确认链接tests/api/helpers.rs。此外测试日志通过TEST_LOG1环境变量控制是否输出到 stdoutTEST_LOG1 cargo test关键流程背后的源码支撑为了让你对“README 提供的命令究竟驱动了什么”有更直观的理解这里补充三条核心链路应用启动链路src/main.rs 先初始化tracing日志订阅者名为zero2prod默认过滤级别info然后调用get_configuration()读取配置、Application::build()构建应用接着用tokio::spawn同时启动两个任务——API 服务run_until_stopped与后台投递 workerrun_worker_until_stopped并通过tokio::select!等待任一任务退出并报告结果连接池构建src/startup.rs 的get_connection_pool使用PgPoolOptions::connect_lazy_with(configuration.with_db())创建懒连接池with_db/without_db的 SSL 模式由require_ssl决定Require或Prefer见 src/configuration.rs邮件发送EmailClientSettings::client()将timeout_milliseconds转为Duration并构造EmailClientsrc/configuration.rs订阅/发布邮件均通过reqwest以rustls-tls安全通道发出。常见问题排查psql未安装init_db.sh会直接报错请先按上文各系统的包管理器命令安装postgresql-client或等价包端口被占用Docker 侧需先docker kill旧容器再重跑脚本Rust 服务侧可用APP_APPLICATION__PORT8001 cargo run换端口数据库连接失败检查init_db.sh是否已成功执行迁移以及POSTGRES_*环境变量与 configuration/base.yaml 中的默认值是否一致登录失败确认 Redis 容器已启动会话存储依赖它且使用了默认账号admin/everythinghastostartsomewhereAPP_ENVIRONMENT设置错误只接受local或production否则启动时报Failed to parse APP_ENVIRONMENT。小结本仓库以章节快照的方式完整复现了《Zero To Production In Rust》中电子订阅项目的演进过程。借助 README 给出的三条命令链路——init_db.shPostgres 迁移、init_redis.shRedis 会话存储、cargo build/run启动服务——你可以快速把终态项目跑起来借助cargo test与 tests/api/helpers.rs 的测试脚手架你可以理解一个真实 Rust API 项目如何做集成测试隔离与外部依赖打桩。无论你是跟着书逐章学习还是想直接研究一个“从零到生产”的完整 Rust 工程样板本仓库都是一份高质量的参考源码。赞分享后端【免费下载链接】zero-to-productionCode for Zero To Production In Rust, a book on API development using Rust.项目地址https://gitcode.com/GitHub_Trending/ze/zero-to-production点击查看免费下载相关推荐【亲测免费】 Zero To Production In Rust从零到生产环境的Rust后端开发指南Zero To Production In Rust从零到生产环境的Rust后端开发指南 项目介绍 Zero To Production In Rust ht后端终极Rust后端配置管理指南zero-to-production项目环境配置实战终极Rust后端配置管理指南zero to production项目环境配置实战 在现代Rust后端开发中 配置管理 是确保应用在不同环境中稳定运行的关键因后端Matter 仓库 Python 测试运行实战指南从环境搭建到集成与认证测试全流程Matter 仓库 Python 测试运行实战指南从环境搭建到集成与认证测试全流程 本文以 connectedhomeip 仓库中的 Python 测试运行技物联网智能家居嵌入式通信上一篇Krita AI Diffusion终极指南如何在Krita中实现影视级AI绘画与智能编辑下一篇Argos Translate断网也能翻译文档的 3 条路径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表