输入标题、正文或标签,查找知识。

最近文档

软件工程 / 构建发布与运行构建环境与持续集成:为什么你电脑上能跑还不够你把收藏功能交给同事,他安装以后却打不开。原来你电脑用的是一个 Node 版本,他用另一个;你本地还有没提交的文件。要交付软件,不只需要源代码,还要让别人按照明确步骤得到能运行的结果。软件工程 / 构建发布与运行部署、发布、回滚与观察:把功能交到用户手里代码已经合并,收藏按钮却没出现在网站上。或者网站更新了,点击时提示找不到数据表。交付涉及代码、配置、数据和流量,不能只用“构建成功”判断完成。本章按一次小发布看这些环节怎样配合。语言基础 / TypeScript跨语言对照TypeScript 独有能力与缺失能力清单这一章适合在学完基础后回查:某个能力是 TypeScript 自己提供的,还是来自 JavaScript、浏览器、Node 或第三方库?先把来源认清,再讨论它擅长什么、缺少什么,就不会把“语言没有内置”误解成“整个生态都做不到”。语言基础语言基础学习路线:以 TypeScript 建立可迁移的编程模型学 TypeScript 时,你会同时遇到 JavaScript 的运行规则和 TypeScript 的类型规则。先把这两件事分清,很多报错就好理解了。按顺序做完前面的练习,再读跨语言对照;对照章节用于解释差异,不要求你同时学会五门语言。后端知识 / 身份权限与安全认证、授权与多租户:登录成功只是第一步用户把地址里的订单号从 42 改成 43,居然看到了别人订单。这不是登录失效,而是资源授权缺失。后端要分别确认调用者是谁,以及这个调用者是否能对这份数据执行当前操作。
1 / 5 · 构建环境与持续集成:为什么你电脑上能跑还不够
↑↓ 浏览 Enter 打开Esc 关闭
Damnatiox
知识文件夹

应用架构与模块化单体

现代 Java Backend Engineering 学习路线:应用架构与模块化单体

0 子目录5 文档
应用架构与模块化单体:职责与分层、按业务分模块、模块边界验证、事务与事件、幂等与恢复、服务拆分判断

CHAPTER OVERVIEW · 章节概览

先在一个应用中把模块边界守住,再处理事务与事件;只有证据表明需要独立服务时,才讨论拆分。

本章学习路线

箭头表示建议的学习顺序;先理解问题,再逐步进入实现与实践。

flowchart LR N0["01 职责与分层"] N1["02 按业务分模块"] N2["03 模块边界验证"] N3["04 事务与事件"] N4["05 幂等与恢复"] N5["06 服务拆分判断"] N0 --> N1 --> N2 --> N3 --> N4 --> N5

按顺序学习

5
应用架构与模块化单体:先学会维护一个单体当订单逻辑散落在很多包里,改一个字段都要搜索半个项目时,就该重新考虑代码如何组织。模块化首先是让相关业务待在一起,并限制互相访问的方式;它不要求你立刻拆服务。Layered、Package by Feature 与领域边界按 Controller、Service、Repository 分包容易上手,但项目变大后,同一个业务可能分散得很远。下面比较按功能组织代码的方式,并说明模块内部仍然可以分层。重点是让一次业务改动有清楚的范围。Spring Modulith:模块验证、集成测试、事件与可观测性约定“订单模块不要直接访问库存内部类”很容易,长期遵守却需要工具帮助。Spring Modulith 可以检查部分模块关系,并支持围绕模块测试和观察事件。它验证的是你的设计,不会自动替你划分业务。Transaction Boundary、Outbox 与 Idempotency保存订单成功后,发送消息失败了怎么办?数据库与消息系统之间的这个间隙,是 Outbox 要处理的问题。下面先看业务记录与待发消息怎样一起保存,再解释为什么后续发送和消费仍然需要处理重复。模块化单体到微服务:什么时候应该拆?拆成多个服务后,每个服务可以独立发布,但本地调用也变成了可能超时的网络调用。先看独立扩容、团队协作或隔离需求是否真实存在,再决定是否拆分;仅仅目录多、代码多,并不足以支持这个决定。