想要打造高质量、可扩展和可维护的软件系统吗?本书是您的必备!


本书内容
软件架构在软件开发中无处不在,从微观到宏观层面,架构都在发挥着重要作用。因此,对于软件开发人员,包括刚刚入门的新手,掌握软件架构设计是一项必备技能。软件架构设计不仅要关注整体和顶层的宏观设计,还应重视支撑架构落地的微观设计。只有这样,软件架构设计才能真正起到指导开发的作用。《软件架构从微观到宏观》的重点正是从微观到宏观的软件架构设计及其落地实践。
《软件架构从微观到宏观》共28章,分为4个部分:第1部分(第1~6章)介绍软件架构的基本概念、软件架构设计所包含的内容以及架构设计需要遵循的一般原则;第2部分(第7~14章)聚焦于架构设计的微观层面,包括常用的编程范式、多任务与异步编程、设计模式、业务模型、组件以及协同工作模式等;第3部分(第15~21章)介绍常用的软件架构模式,包括插件式架构、管道-过滤器架构、分层架构、微服务架构和事件驱动架构等;第4部分(第22~28章)重点在于实践,通过示例形式进一步介绍软件架构设计和落地的具体实现。

本书作者
甄 镭
同济大学学士,北京科技大学硕士。1996年开始从事企业信息系统开发和建设工作,涉及石化、政务、汽车制造、机械制造、电力、房地产等诸多领域,参与过多项国家级重大项目。在PLOP会议等发表过多篇论文。著有《信息系统升级与整合:策略·方法·技巧》《.Net与设计模式》《领域驱动设计.Net实践》等。

本书读者
适合初窥门径的软件开发者和经验丰富的资深架构师

本书目录
目 录
第1部分 软件架构概述
第1章 软件架构是什么2
1.1 难以定义的软件架构2
1.1.1 针对软件架构定义的不同观点2
1.1.2 不同视角的软件架构3
1.1.3 不同层次的软件架构4
1.1.4 不同开发阶段的软件架构4
1.1.5 不断发展变化的软件架构理论5
1.2 软件架构的范围5
1.2.1 使用鸭子理论划定软件架构范围6
1.2.2 软件架构描述了软件的结构6
1.2.3 软件架构的关键技术和支撑技术8
1.2.4 软件架构决定了软件的质量属性9
1.3 软件架构的作用9
1.3.1 体现软件开发的早期设计决策10
1.3.2 用于沟通与交流10
1.3.3 软件质量属性的保证10
1.3.4 软件工程管理的抓手10
1.4 软件架构和软件架构模式(风格)10
1.5 软件架构和软件框架11
1.6 本章小结12
第2章 软件结构13
2.1 软件的结构13
2.1.1 开发边界、运行边界和部署边界13
2.1.2 架构的三种结构15
2.1.3 软件结构和软件边界的变化15
2.1.4 软件的范围和规模与软件架构16
2.2 软件结构的描述方法16
2.2.1 架构蓝图16
2.2.2 “构件”和“连接器”17
2.2.3 图形化建模语言18
2.3 软件架构模式与软件架构风格20
2.4 示例1—Docker的软件架构分析20
2.4.1 Docker的作用20
2.4.2 Docker的顶层架构21
2.4.3 顶层架构的展开22
2.4.4 组件架构23
2.4.5 Docker架构分析总结26
2.5 示例2——设计时结构与运行时结构的关系27
2.6 本章小结30
第3章 关键技术、支撑技术与技术路线31
3.1 关键技术31
3.1.1 什么是关键技术31
3.1.3 关键技术的验证33
3.2 支撑技术33
3.2.1 软件架构落地需要特定的软件技术作为支撑33
3.2.2 软件技术对软件架构设计的刚性约束34
3.2.3 软件架构设计与软件技术选择34
3.3 技术路线35
3.3.1 什么是技术路线35
3.3.2 确定技术路线时需要考虑的因素36
3.3.3 技术路线与架构设计落地36
3.4 关键技术和支撑技术的区别和联系37
3.5 示例1——Docker的关键技术37
3.5.1 Docker关键技术概述37
3.5.2 关键技术在架构中的位置38
3.5.3 是否可以替换关键技术之外的部分39
3.6 示例2——图形展示软件:关键技术与支撑技术的区别39
3.7 本章小结40
第4章 质量属性41
4.1 什么是软件的质量属性41
4.2 软件质量属性的内容42
4.2.1 可用性43
4.2.2 性能43
4.2.3 安全性44
4.2.4 可部署性44
4.2.5 易用性44
4.2.6 可修改性45
4.2.7 可集成性46
4.2.8 可测试性46
4.2.9 能源效率47
4.3 软件架构设计与质量属性47
4.3.1 从宏观和微观两个层面解决质量属性问题47
4.3.2 可修改性是满足质量属性需求的重要抓手48
4.3.3 使用针对质量属性需求的通用解决方案49
4.3.4 使用针对特定质量属性的成熟方案50
4.3.5 关注与架构没有直接关联的质量属性52
4.4 本章小结53
第5章 软件架构设计的原则54
5.1 设计原则概述54
5.2 基本技术原理54
5.2.1 抽象55
5.2.2 封装56
5.2.3 信息隐藏57
5.2.4 模块化60
5.2.5 职责分离60
5.2.6 耦合和内聚60
5.2.7 策略和实现分离61
5.2.8 接口和实现分离61
5.2.9 分而治之62
5.3 SOLID原则62
5.3.1 单一职责原则62
5.3.2 开闭原则64
5.3.3 里氏替换原则64
5.3.4 接口隔离原则66
5.3.5 依赖反转原则67
5.4 接口设计原则67
5.4.1 无状态原则67
5.4.2 明确性与一致性原则68
5.5 组件开发原则68
5.5.1 复用/发布等同原则69
5.5.2 共同闭包原则69
5.5.3 共同复用原则69
5.6 本章小结69
第6章 如何完成软件架构设计70
6.1 架构设计的前期工作70
6.1.1 确定软件的商业目标70
6.1.2 确定软件的业务目标72
6.1.3 划分软件的业务范围73
6.1.4 确定软件的开发和使用环境74
6.1.5 确定软件开发的组织结构75
6.2 遵守软件开发的一般规律75
6.2.1 遵守设计原理与原则75
6.2.2 在开发过程中进行迭代75
6.2.3 根据实际情况使用正向过程与逆向过程76
6.3 设计可以落地的软件架构77
6.3.1 明确概念设计与概要设计的区别77
6.3.2 避免“空中楼阁”式的架构设计78
6.3.3 架构设计需要提供微观设计规范79
6.4 架构设计中的框架79
6.4.1 是否使用重量级框架80
6.4.2 降低业务模型与框架的耦合度80
6.4.3 减少软件架构对框架的依赖81
6.5 软件架构设计的交付物82
6.5.1 软件架构说明82
6.5.2 关键技术解决方案和技术路线说明83
6.5.3 确保重要质量属性的解决方案83
6.5.4 必要的代码83
6.6 架构设计中的非技术因素85
6.6.1 利益攸关者的目标不一致85
6.6.2 局部利益和整体利益不一致85
6.6.3 项目的长期目标与短期目标不一致85
6.6.4 预算与进度陷阱86
6.7 本章小结86
第2部分 微观层面的架构设计
第7章 微观层面的架构设计概述88
7.1 软件架构设计为什么要深入微观层面88
7.1.1 关键技术需要在微观层面实现88
7.1.2 支撑技术需要在微观层面实现89
7.1.3 满足质量属性的机制在微观层面的实现90
7.1.4 底层架构是顶层架构的实现基础90
7.1.5 业务模型存在于微观层面90
7.2 与微观层面架构设计相关的技术91
7.2.1 编程范式91
7.2.2 设计模式91
7.2.3 多任务与异步编程91
7.2.4 业务模型92
7.2.5 质量属性相关机制92
7.2.6 组件与组件封装92
7.2.7 协作模式92
7.2.8 完成软件架构的代码骨架92
7.3 Log4j漏洞的架构分析93
7.3.1 Log4j漏洞93
7.3.2 架构分析93
7.3.3 需要重视的微观架构设计96
7.3.4 从架构设计角度看如何避免Log4j漏洞96
7.4 本章小结97
第8章 编程范式98
8.1 编程范式概述98
8.2 结构化编程与结构化设计99
8.2.1 基本概念99
8.2.2 结构化编程的技术难点——如何实现模块间解耦100
8.2.3 结构化编程和结构化设计的不足102
8.3 面向对象编程与面向对象设计102
8.3.1 面向对象的特点103
8.3.2 面向对象的基本概念103
8.3.3 面向对象设计的使用场景108
8.3.4 面向对象编程的难点108
8.4 函数式编程109
8.4.1 基本概念109
8.4.2 常见模式110
8.4.3 函数式编程设计使用场景114
8.4.4 函数式编程的难点115
8.5 编程范式与软件架构115
8.6 本章小结116
第9章 设计模式117
9.1 设计模式概述117
9.1.1 模式与设计模式117
9.1.2 与设计模式相关的常见问题118
9.1.3 设计模式在软件架构设计中的作用119
9.2 软件架构设计中常用的设计模式119
9.2.1 模板方法模式119
9.2.2 策略模式120
9.2.3 适配器模式121
9.2.4 桥接模式122
9.2.5 代理模式124
9.2.6 中介者模式125
9.2.7 观察者模式126
9.2.8 命令模式126
9.2.9 组合模式127
9.2.10 外观模式128
9.3 依赖注入模式128
9.3.1 依赖反转原则129
9.3.2 控制反转与依赖注入130
9.3.3 依赖注入框架130
9.4 设计模式的函数编程实现方式133
9.4.1 模板方法134
9.4.2 策略模式135
9.4.3 适配器模式136
9.4.4 桥接模式136
9.4.5 代理模式137
9.4.6 命令模式138
9.4.7 外观模式139
9.4.8 依赖注入140
9.5 示例——适配器模式与桥接模式的组合模式141
9.5.1 适配器与桥接的区别和联系141
9.5.2 适配器与桥接联合工作142
9.5.3 示例总结144
9.6 本章小结144
第10章 多任务与异步编程145
10.1 多任务的实现方式145
10.2 异步编程146
10.2.1 异步编程的难点146
10.2.2 采用Promise模式简化异步编程147
10.2.3 不同编程语言的异步实现148
10.3 并行的实现方式150
10.3.1 Node.js150
10.3.2 .NET(C#)151
10.3.3 Python152
10.3.4 Java152
10.4 同时使用并发与并行——模拟大仲马烹饪154
10.5 工作模式总结156
10.5.1 语义上的串行模式156
10.5.2 使用异步编程的并发模式157
10.5.3 并行模式157
10.6 进一步研究函数式编程157
10.6.1 高阶函数157
10.6.2 闭包158
10.7 多任务、异步编程与软件架构设计159
10.8 本章小结159
第11章 业务模型160
11.1 业务逻辑的存在形式160
11.2 数学模型161
11.2.1 计算模型161
11.2.2 状态机162
11.2.3 决策表164
11.2.4 数学模型在架构中的位置165
11.3 数据模型165
11.3.1 事务脚本166
11.3.2 表模块168
11.3.3 活动记录170
11.3.4 数据模型在架构中的位置170
11.4 领域模型171
11.4.1 领域模型的定义和特点171
11.4.2 领域模型的主要概念171
11.4.3 领域模型与存储库模式173
11.4.4 领域模型在架构中的位置173
11.5 领域特定语言173
11.5.1 DSL的定义和特点174
11.5.2 DSL示例174
11.5.3 DSL在架构中的位置177
11.6 业务模型与软件架构的关系177
11.6.1 业务模型在架构中的位置177
11.6.2 关注业务模型对软件架构的影响178
11.6.3 防止业务逻辑碎片化179
11.7 本章小结180
第12章 质量属性相关的机制181
12.1 通用机制181
12.1.1 日志181
12.1.2 监控182
12.1.3 缓存183
12.1.4 冗余设计185
12.2 可修改性187
12.2.1 接口和实现分离187
12.2.2 延迟绑定188
12.3 可用性189
12.3.1 心跳189
12.3.2 时间戳190
12.4 性能191
12.4.1 限流191
12.4.2 设置超时控制192
12.4.3 请求排队193
12.4.4 数据库分表194
12.5 安全性195
12.5.1 加密195
12.5.2 访问控制196
12.5.3 防止SQL注入198
12.5.4 防止跨站脚本攻击199
12.6 可测试性200
12.6.1 沙箱201
12.6.2 spy202
12.6.3 stub203
12.6.4 mock204
12.7 本章小结206
第13章 组件与组件封装207
13.1 组件简介207
13.1.1 组件的发展208
13.1.2 组件的形式208
13.1.3 程序包与程序包管理器208
13.2 组件的开发原则209
13.2.1 复用/发布等同原则209
13.2.2 共同闭包原则210
13.2.3 共同复用原则210
13.2.4 组件开发原则之间的矛盾与平衡210
13.3 组件封装的目的211
13.4 组件封装示例212
13.5 组件封装与页面架构216
13.5.1 组件封装方式对页面架构的影响217
13.5.2 带数据源的下拉框220
13.5.3 带有数据源的表格221
13.5.4 页面组装222
13.6 进一步讨论封装组件的目的223
13.7 本章小结225
第14章 协同工作模式226
14.1 协同工作模式概述226
14.2 数据共享模式227
14.2.1 数据共享模式的工作过程227
14.2.2 数据共享模式的优势和使用的注意事项227
14.2.3 数据共享模式应用示例228
14.2.4 防止读写冲突228
14.2.5 使用分布式协同服务229
14.3 消息队列模式232
14.3.1 消息队列模式的工作过程232
14.3.2 消息队列模式的优势和使用时的注意事项233
14.3.3 消息队列的通信模式234
14.3.4 消息队列示例——Kafka234
14.4 事件驱动模式237
14.4.1 事件驱动模式的工作过程237
14.4.2 事件驱动模式与消息队列模式的区别和联系238
14.4.3 事件驱动的几种模式238
14.5 请求应答模式238
14.5.1 请求应答模式的工作过程239
14.5.2 请求应答模式的使用场景和注意事项239
14.5.3 请求应答模式相关的架构风格240
14.5.4 请求应答模式示例——gRPC240
14.6 集成方式242
14.6.1 已发布语言242
14.6.2 开放主机服务242
14.6.3 客户-供应商242
14.6.4 跟随者242
14.7 示例—两阶段提交协议243
14.7.1 两阶段提交协议243
14.7.2 示例构建244
14.7.3 示例讨论248
14.8 本章小结248
第3部分 软件架构模式
第15章 软件架构模式与风格250
15.1 概述250
15.1.1 软件架构模式251
15.1.2 软件架构风格251
15.1.3 软件架构模式和软件架构风格的作用252
15.1.4 软件架构模式与软件架构风格的区别和联系252
15.1.5 如何使用软件架构模式与软件架构风格252
15.2 单体应用254
15.2.1 单体的定义254
15.2.2 单体应用的优势与不足254
15.3 单体相关的架构风格255
15.3.1 管道-过滤器架构风格255
15.3.2 插件(微内核)架构风格255
15.3.3 分层架构风格256
15.4 分布式应用257
15.4.1 分布式应用的优势与代价257
15.4.2 一致性的挑战257
15.4.3 一致性协议与算法258
15.5 分布式应用相关的架构风格260
15.5.1 基于服务的架构风格260
15.5.2 微服务架构风格260
15.5.3 事件驱动架构261
15.6 本章小结262
第16章 插件式软件架构263
16.1 插件式架构概述263
16.1.1 插件架构与微内核架构263
16.1.2 插件式架构与软件设计原则264
16.1.3 插件式架构的组成264
16.2 VSCode的扩展方式265
16.3 编写VSCode的简单插件266
16.4 在应用软件中使用插件式架构271
16.4.1 需求描述271
16.4.2 确定内核接口272
16.4.3 组装插件273
16.4.4 完整的插件式架构275
16.5 基于微服务的插件式架构实现276
16.6 本章小结277
第17章 管道-过滤器278
17.1 管道-过滤器概述278
17.2 框架内置的管道-过滤器279
17.2.1 Node.js中的管道-过滤器示例279
17.2.2 .NET中的管道-过滤器示例279
17.3 管道-过滤器的实现280
17.3.1 使用面向对象方式创建管道-过滤器280
17.3.2 使用函数式编程实现管道-过滤器282
17.4 应用场景示例286
17.4.1 身份验证和授权287
17.4.2 访问控制288
17.4.3 异常处理290
17.5 本章小结291
第18章 分层架构292
18.1 分层架构概述292
18.1.1 拓扑结构292
18.1.2 传统三层架构示例293
18.1.3 使用场景296
18.2 分层架构的衍生模式296
18.2.1 客户机/服务器296
18.2.2 多层客户机/服务器结构297
18.2.3 浏览器/服务器模式297
18.2.4 前后端分离架构297
18.3 分层架构的不足298
18.3.1 技术对齐而非业务对齐298
18.3.2 难以保证业务可测试性298
18.3.3 污水池反模式298
18.4 分层架构的发展——领域驱动设计相关的架构风格299
18.4.1 领域驱动设计四层架构299
18.4.2 六边形架构299
18.4.3 洋葱圈架构301
18.4.4 整洁架构301
18.5 层次依赖关系倒置302
18.6 领域驱动设计的四层架构示例303
18.6.1 环境准备303
18.6.2 创建领域层303
18.6.3 创建存储库309
18.6.4 创建应用层312
18.6.5 使用Swagger模拟表示层315
18.6.6 创建MongoDB存储库317
18.6.7 层次之间的依赖关系319
18.7 在微服务架构中使用分层模式320
18.7.1 微服务顶层架构采用分层模式320
18.7.2 微服务内部采用分层模式320
18.8 本章小结321
第19章 事件驱动架构322
19.1 概述322
19.2 事件驱动相关模式323
19.2.1 事件通知323
19.2.2 事件携带的状态转移323
19.2.3 事件溯源324
19.3 事件驱动架构的拓扑结构325
19.3.1 基本结构325
19.3.2 代理拓扑结构326
19.3.3 中介拓扑结构327
19.4 事件驱动架构的要点327
19.4.1 事件驱动流程的描述327
19.4.2 事件类型与事件数据结构的定义328
19.4.3 框架无感设计328
19.5 事件驱动架构的实现328
19.6 事件驱动架构示例331
19.6.1 需求分析——为什么使用事件驱动331
19.6.2 内部事件的发布与处理332
19.6.3 使用消息中间件对外发布事件339
19.7 本章小结341
第20章 微服务架构342
20.1 概述342
20.1.1 微服务的来历342
20.1.2 对微服务的理解343
20.1.3 微服务相关的技术344
20.2 何时使用以及如何使用微服务345
20.2.1 微服务架构的优势与代价345
20.2.2 何时引入微服务架构346
20.2.3 如何使用微服务架构346
20.3 微服务架构设计的内容347
20.3.1 确定服务347
20.3.2 确定服务集成方式348
20.3.3 服务内部架构设计348
20.3.4 微服务运行环境设计348
20.4 微服务内部架构的代码骨架示例348
20.4.1 需求349
20.4.2 创建骨架中的文件349
20.4.3 应用程序主干app.js350
20.4.4 Swagger支持351
20.4.5 RESTful API接口352
20.4.6 业务逻辑353
20.4.7 单元测试354
20.4.8 Docker支持354
20.5 微服务架构示例355
20.5.1 搭建项目结构355
20.5.2 实现服务逻辑356
20.5.3 使用docker compose编排微服务361
20.5.4 Docker网络架构362
20.6 本章小结363
第21章 表示层与软件架构364
21.1 表示层概述364
21.1.1 表示层设计的特殊性364
21.1.2 表示层技术的发展365
21.1.3 表示层需要解决的问题366
21.2 表示层技术366
21.2.1 单页面应用366
21.2.2 响应式设计367
21.2.3 Web组件367
21.2.4 富互联网应用367
21.2.5 MV*模式367
21.3 服务端渲染相关模式368
21.3.1 MVC模式368
21.3.2 模板视图370
21.3.3 领域负载对象371
21.4 前后端分离架构的表示层371
21.4.1 前端直接访问后端服务372
21.4.2 视图模型373
21.4.3 领域层业务规则映射374
21.5 单页面前端分层架构示例374
21.6 满足模块化开发的单页面架构377
21.6.1 前端页面的构成378
21.6.2 按业务模块开发前端379
21.7 本章小结380
第4部分 软件架构实践
第22章 使用测试驱动开发辅助软件架构设计382
22.1 可测试性与架构的关系382
22.2 测试驱动开发383
22.3 使用测试驱动开发完成架构原型设计383
22.3.1 从零开始384
22.3.2 重构388
22.3.3 组件的创建391
22.3.4 工厂创建与集成测试395
22.4 本章小结398
第23章 微服务划分399
23.1 微服务划分原则与难点399
23.2 “设备运行绩效指标系统”需求400
23.2.1 设备运行绩效指标的作用400
23.2.2 设备运行绩效指标的计算算法401
23.2.3 指标计算变量的数据来源401
23.2.4 功能需求401
23.2.5 质量属性需求402
23.3 面向技术的服务划分和面向业务的服务划分402
23.4 以计算为核心的服务划分403
23.4.1 确定服务403
23.4.2 确定服务之间的集成方式404
23.4.3 服务内部的架构设计405
23.4.4 架构落地涉及的技术406
23.5 以指标为核心的服务划分408
23.5.1 确定服务409
23.5.2 服务内部的架构设计409
23.6 两种服务类型结合使用410
23.7 本章小结410
第24章 领域驱动设计中的软件架构设计411
24.1 领域驱动设计简介411
24.2 “社交小组”需求分析412
24.2.1 需求说明412
24.2.3 确定限界上下文414
24.3 架构风格的比较与选择414
24.3.1 单体架构414
24.3.2 前后分离的应用架构415
24.3.3 分布式应用架构417
24.3.4 微服务架构419
24.3.5 应用系统架构的选择420
24.4 架构设计演变过程420
24.5 限界上下文内部的架构设计423
24.6 支撑技术解决方案426
24.6.1 集成认证服务426
24.6.2 使用测试驱动开发创建领域模型426
24.6.3 存储库实现426
24.6.4 领域事件发布与处理427
24.7 本章小结427
第25章 选择合适的架构模式428
25.1 “后台任务管理”的业务需求428
25.2 架构选择429
25.2.1 概念模型429
25.2.2 使用插件式架构的单体应用430
25.2.3 基于消息中间件的分布式架构431
25.3 架构详细设计432
25.3.1 对外接口432
25.3.2 任务执行时序方案433
25.3.3 任务的创建与存储434
25.3.4 任务执行434
25.3.5 架构概览435
25.4 架构原型实现436
25.4.1 概述436
25.4.2 采用node-config读取配置文件437
25.4.3 采用Express创建API接口437
25.4.4 使用node-schedule实现任务的时序类型438
25.4.5 使用RabbitMQ作为消息中间件438
25.4.6 使用MongoDB保存数据439
25.4.7 任务执行部分示例440
25.4.8 管理任务的用户界面441
25.5 架构分析441
25.5.1 单体架构和分布式架构441
25.5.2 分布式应用的部署方式442
25.5.3 设计模式的灵活使用442
25.6 本章小结442
第26章 嵌套架构示例—多租户架构模式443
26.1 概述443
26.1.1 多租户的概念444
26.1.2 多租户模式的特点444
26.1.3 多租户模式的使用场景445
26.2 多租户总体架构445
26.3 多租户模式的关键技术446
26.3.1 多租户的资源共享方式446
26.3.2 共享应用软件和数据的多租户系统447
26.3.3 应用软件与数据物理隔离的多租户系统448
26.4 共享应用软件和数据的多租户示例450
26.5 应用软件与数据物理隔离的多租户示例451
26.6 本章小结453
第27章 遗留系统改造中的架构演化454
27.1 遗留系统改造与新系统建设的区别454
27.1.1 业务需求454
27.1.2 历史数据455
27.1.3 基础设施455
27.2 遗留系统改造策略—重建或重构455
27.3 单体应用到分布式应用的重构过程456
27.4 单体应用到分布式应用的重建过程459
27.5 本章小结463
第28章 企业级应用架构简介464
28.1 企业级应用架构参考模型464
28.2 标准和规范体系465
28.3 信息门户466
28.4 运行管理体系466
28.5 业务系统467
28.6 技术支撑平台467
28.7 安全保障体系468
28.8 企业应用软件的架构设计469
28.8.1 充分了解标准和规范体系469
28.8.2 充分利用企业架构提供的各种资源470
28.8.3 尽量使用企业架构推荐的软件技术470
28.8.4 充分了解与项目相关的其他应用软件470
28.9 本章小结470
后记471
附录一 参考文献473
附录二 开发环境与工具软件475
附录三 词汇说明478

编辑推荐
1.软件架构是否遥不可及?本书将彻底打破这一认知。它创新地从开发者日常接触的微观代码层面入手,循序渐进,系统讲解编程范式、设计原则与模式,而后将视野拓展至逻辑架构与宏观应用系统,涵盖了从单体到微服务的演进路径。
2.《软件架构从微观到宏观》理论与实践紧密结合,旨在为每一位开发者提供清晰、可行的架构设计指南。无论您是初入职场的新人还是经验丰富的专业人士,都能从中获得宝贵经验,为构建高质量、可扩展的系统打下坚实基础,是您职业进阶路上的必备读物。

本书特色
