• 从零构建RUST生产级服务
21年品牌 40万+商家 超1.5亿件商品

从零构建RUST生产级服务

全新正版 假一赔十 可开发票

118.01 7.0折 168 全新

库存48件

北京东城
认证卖家担保交易快速发货售后保障

作者(美)LucaPalmieri(卢卡·帕尔米耶里) 著 温祖彤 译

出版社电子工业出版社

ISBN9787121487071

出版时间2024-09

装帧平装

开本其他

定价168元

货号1203367389

上书时间2024-09-13

轻阅书店

三年老店
已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
目录
第1章  准备工作1
1.1  安装Rust工具链1
1.1.1  编译目标1
1.1.2  发布渠道2
1.1.3  我们需要什么样的工具链2
1.2  项目初始化3
1.3  集成开发环境3
1.3.1  rust-analyzer4
1.3.2  IntelliJ Rust4
1.3.3  应该如何选择IDE4
1.4  内部开发循环5
1.4.1  更快的链接5
1.4.2  cargo-watch6
1.5  持续集成7
1.5.1  持续集成的步骤8
1.5.2  准备就绪的持续集成流水线10

第2章  构建邮件简报12
2.1  引导示例12
2.1.1  基于问题的学习12
2.1.2  帮助完善本书13
2.2  邮件简报服务应该做什么13
2.2.1  捕捉需求:用户故事13
2.3  循序渐进,不断迭代14
2.3.1  准备开始15

第3章  注册新的订阅者16
3.1  前期准备工作16
3.2  选择一个Web框架17
3.3  实现第一个端点:健康检查17
3.3.1  使用actix-web编写代码18
3.3.2  actix-web应用程序剖析19
3.3.3  实现健康检查处理器24
3.4  第一次集成测试27
3.4.1  如何对端点进行测试27
3.4.2  应该将测试放在哪里28
3.4.3  改变项目结构以便于测试30
3.5  实现第一个集成测试33
3.5.1  优化36
3.6  重新聚焦40
3.7  处理HTML表单40
3.7.1  提炼需求40
3.7.2  以测试的形式捕捉需求41
3.7.3  从POST请求中解析表单数据44
3.8  存储数据:数据库52
3.8.1  选择数据库52
3.8.2  选择数据库包53
3.8.3  带有副作用的集成测试55
3.8.4  数据库初始化56
3.8.5  编写第一个查询62
3.9  持久化一个新的订阅者70
3.9.1  actix-web中的应用程序状态70
3.9.2  actix-web工作进程72
3.9.3  Data提取器74
3.9.4  INSERT语句74
3.10  更新测试78
3.10.1  测试隔离81
3.11  总结85

第4章  遥测86
4.1  未知的未知86
4.2  可观测性87
4.3  日志88
4.3.1  log包89
4.3.2  actix-web的Logger中间件89
4.3.3  外观模式90
4.4  插桩POST /subscriptions92
4.4.1  与外部系统的交互93
4.4.2  像用户一样思考94
4.4.3  日志应当易于关联96
4.5  结构化日志98
4.5.1  tracing包99
4.5.2  从log迁移到tracing99
4.5.3  tracing中的跨度100
4.5.4  插桩future102
4.5.5  tracing的Subscriber104
4.5.6  tracing-subscriber105
4.5.7  tracing-bunyan-formatter105
4.5.8  tracing-log107
4.5.9  删除未使用的依赖109
4.5.10  清理初始化流程109
4.5.11  集成测试中的日志112
4.5.12  清理插桩代码――tracing::instrument116
4.5.13  保护隐私――secrecy119
4.5.14  请求ID121
4.5.15  借力tracing生态系统124
4.6  总结124

第5章  上线125
5.1  我们必须讨论部署问题125
5.2  选择工具126
5.2.1  虚拟化:Docker126
5.2.2  托管:DigitalOcean127
5.3  应用程序的Dockerfile127
5.3.1  Dockerfile127
5.3.2  构建上下文128
5.3.3  sqlx离线模式129
5.3.4  运行镜像131
5.3.5  网络132
5.3.6  层次化配置133
5.3.7  数据库连接138
5.3.8  优化Docker镜像139
5.4  部署到DigitalOcean应用平台144
5.4.1  安装144
5.4.2  应用规范144
5.4.3  如何使用环境变量注入加密信息147
5.4.4  连接到DigitalOcean的Postgres实例149
5.4.5  应用配置中的环境变量152
5.4.6  最后一步,推送153

第6章  拒绝无效的订阅者(第一部分)155
6.1  需求156
6.1.1  姓名约束156
6.1.2  安全约束156
6.2  第一次实现158
6.3  漏洞百出的验证159
6.4  类型驱动开发160
6.5  所有权遇见不变量164
6.5.1  AsRef167
6.6  panic169
6.7  Result――将错误作为值171
6.7.1  使解析函数返回Result类型171
6.8  精确的断言错误:claim174
6.9  单元测试175
6.10  处理 Result177
6.10.1  match177
6.10.2  “?”操作符178
6.10.3  400的请求错误179
6.11  电子邮件地址格式179
6.12  SubscriberEmail类型180
6.12.1  拆分domain子模块180
6.12.2  新类型的框架181
6.13  属性测试184
6.13.1  使用fake生成随机测试数据184
6.13.2  quickcheck与proptest185
6.13.3  quickcheck入门185
6.13.4  实现Arbitrary特质186
6.14  请求体验证188
6.14.1  使用TryFrom重构192
6.15  总结195

第7章  拒绝无效的订阅者(第二部分)196
7.1  确认邮件196
7.1.1  订阅者的同意196
7.1.2  确认用户的流程197
7.1.3  实现策略198
7.2  邮件发送组件――EmailClient198
7.2.1  如何发送电子邮件198
7.2.2  如何使用reqwest编写REST客户端201
7.2.3  如何测试REST客户端208
7.2.4  EmailClient::send_email的初版实现213
7.2.5  加强正常的测试221
7.2.6  处理失败情况228
7.3  可维护测试套件的骨架和原则237
7.3.1  为什么要编写测试238
7.3.2  为什么不编写测试238
7.3.3  测试代码也是代码238
7.3.4  测试套件239
7.3.5  测试发现240
7.3.6  每个测试文件都是一个包241
7.3.7  共享测试辅助函数241
7.3.8  共享启动逻辑244
7.3.9  构建API客户端252
7.3.10  小结256
7.4  重新聚焦256
7.5  零停机部署257
7.5.1  可靠性257
7.5.2  部署策略258
7.6  数据库迁移261
7.6.1  状态存在于应用程序之外261
7.6.2  部署与迁移261
7.6.3  多步迁移262
7.6.4  新的必填字段262
7.6.5  新表263
7.7  发送确认邮件264
7.7.1  固定的电子邮件地址264
7.7.2  固定的确认链接269
7.7.3  等待确认272
7.7.4  GET /subscriptions/confirm的骨架276
7.7.5  整合278
7.7.6  订阅令牌287
7.8  数据库事务294
7.8.1  全部成功,或者全部失败294
7.8.2  Postgres中的事务295
7.8.3  sqlx中的事务295
7.9  总结299

第8章  错误处理300
8.1  错误处理的目的300
8.1.1  系统内部错误301
8.1.2  系统交互错误303
8.1.3  小结305
8.2  为操作人员提供错误报告305
8.2.1  跟踪错误的根本原因308
8.2.2  Error特质313
8.3  控制流与错误处理316
8.3.1  控制流的分层316
8.3.2  使用枚举对错误建模317
8.3.3  只有错误类型还不够319
8.3.4  使用thiserror减少样板代码323
8.4  防止“大泥球”型的错误枚举324
8.4.1  使用anyhow擦除错误类型329
8.4.2  使用anyhow还是thiserror331
8.5  错误日志由谁来记331
8.6  总结333

第9章  投递邮件简报334
9.1  用户故事在变化334
9.2  不要向未确认的订阅者发送335
9.2.1  使用公共API设置状态336
9.2.2  scoped mock337
9.2.3  绿色测试338
9.3  所有已确认的订阅者都会收到新内容339
9.3.1  组合测试辅助函数339
9.4  实现策略341
9.5  请求体的内容341
9.5.1  测试无效输入342
9.6  获取已确认的订阅者列表344
9.7  发送邮件简报346
9.7.1  context与with_context347
9.8  验证存储的数据348
9.8.1  责任界限352
9.8.2  关注编译器353
9.8.3  移除样板代码355
9.9  简单方法的局限性356
9.10  总结357

第10章  API的安全性358
10.1  认证358
10.1.1  缺点359
10.1.2  多因素身份验证359
10.2  基于密码的身份验证359
10.2.1  基本身份验证360
10.2.2  密码验证――简单的方法365
10.2.3  密码存储368
10.2.4  不要阻塞异步执行器384
10.2.5  用户枚举390
10.3  这安全吗395
10.3.1  传输层安全性395
10.3.2  密码重置395
10.3.3  交互类型395
10.3.4  机器对机器396
10.3.5  使用浏览器的用户396
10.3.6  机器对机器(机器代表人)397
10.4  插曲:下一步计划397
10.5  登录表单398
10.5.1  提供HTML页面398
10.6  登录401
10.6.1  HTML表单401
10.6.2  登录成功后的重定向404
10.6.3  处理表单数据405
10.6.4  上下文错误412
10.7  会话443
10.7.1  基于会话的身份验证443
10.7.2  会话存储444
10.7.3  选择会话存储444
10.7.4  actix-session445
10.7.5  管理仪表板448
10.8  种子用户459
10.8.1  数据库迁移459
10.8.2  密码重置460
10.9  重构477
10.9.1  如何实现一个actix-web中间件478
10.10  总结484

第11章  容错的工作流486
11.1  重温POST /admin/newsletters486
11.2  我们的目标488
11.3  失败模式488
11.3.1  无效输入488
11.3.2  网络I/O489
11.3.3  应用程序崩溃490
11.3.4  作者的操作490
11.4  幂等简介490
11.4.1  幂等实践:支付491
11.4.2  幂等键492
11.4.3  并发请求493
11.5  测试需求(第一部分)493
11.6  实现策略495
11.6.1  有状态的幂等:保存和重放495
11.6.2  无状态的幂等:确定性的键生成495
11.6.3  时间问题有些棘手495
11.6.4  做出选择496
11.7  幂等存储496
11.7.1  应该使用哪种数据库496
11.7.2  数据库模式497
11.8  保存和重放498
11.8.1  读取幂等键498
11.8.2  查询已保存的响应502
11.8.3  保存响应505
11.9  并发请求512
11.9.1  测试需求(第二部分)512
11.9.2  同步513
11.10  处理错误520
11.10.1  分布式事务522
11.10.2  后向恢复522
11.10.3  前向恢复523
11.10.4  异步处理523
11.11  后记539

内容摘要
本书是一本面向 Rust 后端开发人员的入门参考书,通过实际项目引导读者从 0 到 1 构建一个功能齐全的电子邮件通信API。本书涵盖了广泛的主题,包括 Rust 生态系统的利用、应用结构的设计、测试的编写、用户认证和授权、错误处理策略的实施、应用状态的观察,以及持续集成和部署管道的建立等。本书不仅介绍了具体的工具和库,还深入探讨了系统设计、可观测性和易操作性等重要概念,能够帮助读者掌握专业的开发方法。 本书适合初学者,是开启 Rust 开发之旅的理想起点,即使没有 Rust 或后端开发经验,相信你也能够轻松跟上、快速入门。

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP