新書推薦:
《
560种野菜野果鉴别与食用手册
》
售價:HK$
67.1
《
中国官僚政治研究(一部洞悉中国政治制度演变的经典之作)
》
售價:HK$
62.7
《
锂电储能产品设计及案例详解
》
售價:HK$
110.9
《
首辅养成手册(全三册)(张晚意、任敏主演古装剧《锦绣安宁》原著小说)
》
售價:HK$
121.0
《
清洁
》
售價:HK$
65.0
《
组队:超级个体时代的协作方式
》
售價:HK$
77.3
《
第十三位陪审员
》
售價:HK$
53.8
《
微观经济学(第三版)【2024诺贝尔经济学奖获奖者作品】
》
售價:HK$
155.7
|
編輯推薦: |
(1)作者资历深厚:作者来自于,资深的分布式事务架构专家,Apache ShenYu(incubating)、Hmily、RainCat、Myth、mykit-data等多个开源框架的创始人。
(2)作者经验丰富:作者有多年的分布式事务经验、微服务架构经验、分布式系统架构经验,以及分布式事务框架的架构和开发经验。
(3)广度深度兼备:从基础知识、解决方案、原理分析、源码实现、工程实战5个维度全面、深入讲解分布式事务。
(4)注重工程实践:书中有大量经过了生产环境的高并发、高流量考验的完整案例,并附案例代码,读者可以直接复用。
(5)大厂专家推荐:来自、阿里、腾讯、蚂蚁金服、滴滴、饿了么、58集团、IBM等互联网大厂及Apache软件基金会的近20位专家高口碑力荐。
|
內容簡介: |
本书的广度与深度兼备、理论与实战兼顾的分布式事务专著,它从基础知识、解决方案、原理分析、源码实现、工程实战5个维度对分布式事务做了全面、细致的讲解,试图解决你在实践中遇到的所有关于分布式事务的问题。
两位作者都是分布式事务领域的资深架构专家,是Apache ShenYu(incubating)网关创始人、Hmily、RainCat、Myth等分布式事务框架的创始人。本书因为内容扎实,所以得到了来自、阿里、腾讯、蚂蚁金服、滴滴、饿了么、58集团、IBM等互联网大厂及Apache软件基金会的近20位专家的高度评价。
基础知识维度:首先全面介绍了事务和分布式事务的概念和基础知识,然后详细讲解了MySQL事务和Spring事务的实现原理;
解决方案维度:详细介绍了分布式事务的各种解决方案,包括强一致性分布式事务解决方案和Z终一致性分布式事务解决方案;
原理分析维度:详细讲解了分布式事务的原理,包括XA强一致性分布式事务、TCC分布式事务、可靠消息Z终一致性分布式事务和Z大努力通知型分布式事务的原理。
源码实现维度:深入分析了Atomikos,Narayana框架实现XA强一致性分布式事务解决方案的源码,以及Dromara开源社区的Hmily分布式事务框架实现TCC分布式事务的源码;
工程实践维度:通过多个在生产环境中经历了高并发、大流量考验的综合案例,讲解了XA强一致性分布式事务、TCC分布式事务、可靠消息Z终一致性分布式事务和Z大努力通知型分布式事务的工程实践方法。
全书配有大量流程图和原理图,便于读者阅读理解;精选了大量来自生产环境的完整案例及其代码,便于读者动手实践。阅读本书,你将体验到事半功倍的效果。
|
關於作者: |
肖宇
分布式事务架构专家,Apache ShenYu(incubating)网关创始人,Dromara开源组织创始人,Hmily、RainCat、Myth等分布式事务框架的作者,Apache ShardingSphere提交者。
热爱开源,追求优雅代码。有丰富的微服务架构经验,尤其擅长微服务技术栈中的分布式事务、微服务架构、分布式数据库、API网关等解决方案。
冰河
互联网高级技术专家、MySQL技术专家、分布式事务架构专家。
多年来,一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究,在高并发、高可用、高可扩展性、高可维护性和大数据等领域拥有丰富的架构经验。
可视化多数据源数据异构中间件mykit-data作者;《海量数据处理与大数据技术实战》和《MySQL技术大全:开发、优化与运维实战》作者;“冰河技术”微信公众号维护者。
|
目錄:
|
推荐语
序
前言
部分 分布式事务基础
第1章 事务的基本概念2
1.1 事务的特性2
1.1.1 原子性3
1.1.2 一致性3
1.1.3 隔离性3
1.1.4 持久性3
1.2 事务的类型4
1.2.1 扁平事务4
1.2.2 带有保存点的扁平事务4
1.2.3 链式事务5
1.2.4 嵌套事务5
1.2.5 分布式事务5
1.3 本地事务5
1.3.1 基本概念6
1.3.2 本地事务的执行流程6
1.3.3 本地事务的优缺点7
1.4 MySQL事务基础7
1.4.1 并发事务带来的问题7
1.4.2 MySQL事务隔离级别9
1.4.3 MySQL中各种事务隔离级别的区别10
1.4.4 MySQL事务隔离级别实践11
1.4.5 MySQL中锁的分类19
1.4.6 死锁的产生和预防23
1.4.7 MySQL中的死锁问题24
1.4.8 InnoDB中的MVCC原理25
1.5 本章小结28
第2章 MySQL事务的实现原理29
2.1 Redo Log29
2.1.1 Redo Log基本概念29
2.1.2 Redo Log基本原理30
2.1.3 Redo Log刷盘规则30
2.1.4 Redo Log刷盘实践32
2.1.5 Redo Log写入机制34
2.1.6 Redo Log的LSN机制35
2.1.7 Redo Log相关参数36
2.2 Undo Log36
2.2.1 Undo Log基本概念36
2.2.2 Undo Log存储方式37
2.2.3 Undo Log基本原理37
2.2.4 Undo Log实现MVCC机制37
2.2.5 Undo Log相关参数40
2.3 BinLog41
2.3.1 BinLog基本概念41
2.3.2 BinLog记录模式41
2.3.3 BinLog文件结构42
2.3.4 BinLog写入机制43
2.3.5 BinLog组提交机制43
2.3.6 BinLog与Redo Log的区别45
2.3.7 BinLog相关参数45
2.4 MySQL事务流程46
2.4.1 MySQL事务执行流程46
2.4.2 MySQL事务恢复流程47
2.5 MySQL中的XA事务48
2.5.1 XA事务的基本原理48
2.5.2 MySQL XA事务语法49
2.5.3 JDBC操作MySQL XA事务52
2.6 本章小结54
第3章 Spring事务的实现原理55
3.1 Spring事务原理55
3.1.1 JDBC直接操作事务55
3.1.2 使用Spring管理事务56
3.1.3 Spring事务分类57
3.1.4 Spring事务超时57
3.1.5 Spring事务回滚规则57
3.2 Spring事务三大接口57
3.2.1 PlatformTransactionManager接口57
3.2.2 TransactionDefinition接口58
3.2.3 TransactionStatus接口60
3.3 Spring事务隔离级别61
3.4 Spring事务传播机制62
3.4.1 7种事务传播机制类型62
3.4.2 常用的事务传播类型65
3.5 Spring事务嵌套实践65
3.5.1 环境准备66
3.5.2 实践场景一71
3.5.3 实践场景二72
3.5.4 实践场景三73
3.5.5 实践场景四74
3.5.6 实践场景五75
3.5.7 实践场景六76
3.5.8 实践场景七77
3.6 Spring事务失效的场景79
3.6.1 数据库不支持事务79
3.6.2 事务方法未被Spring管理79
3.6.3 方法没有被public修饰79
3.6.4 同一类中的方法调用80
3.6.5 未配置事务管理器80
3.6.6 方法的事务传播类型不支持事务81
3.6.7 不正确地捕获异常81
3.6.8 标注错误的异常类型82
3.7 本章小结83
第4章 分布式事务的基本概念84
4.1 分布式系统架构84
4.1.1 产生的背景84
4.1.2 架构目标和架构原则85
4.2 分布式系统架构演进86
4.2.1 单体应用架构86
4.2.2 垂直应用架构87
4.2.3 分布式架构88
4.2.4 SOA架构89
4.2.5 微服务架构89
4.3 分布式事务场景90
4.3.1 跨JVM进程90
4.3.2 跨数据库实例91
4.3.3 多服务访问单数据库91
4.4 数据一致性92
4.4.1 数据的一致性问题92
4.4.2 数据一致性解决方案93
4.5 本章小结93
第5章 分布式事务的理论知识94
5.1 CAP理论94
5.1.1 一致性94
5.1.2 可用性95
5.1.3 分区容忍性95
5.1.4 CAP的组合96
5.2 Base理论97
5.3 本章小结98
第二部分 分布式事务解决方案
第6章 强一致性分布式事务解决方案100
6.1 强一致性事务概述100
6.1.1 典型方案100
6.1.2 适用场景101
6.1.3 优缺点101
6.2 DTP模型101
6.2.1 DTP模型的重要概念101
6.2.2 DTP模型的执行流程102
6.3 2PC模型102
6.3.1 2PC模型的执行流程103
6.3.2 事务执行成功的流程103
6.3.3 事务执行失败的流程104
6.3.4 2PC模型存在的问题105
6.4 3PC模型105
6.4.1 事务执行成功的流程105
6.4.2 事务执行失败的流程106
6.4.3 3PC模型中存在的问题108
6.5 本章小结108
第7章 终一致性分布式事务解决方案109
7.1 终一致性分布式事务概述109
7.1.1 典型方案109
7.1.2 适用场景110
7.1.3 优缺点110
7.2 服务模式110
7.2.1 可查询操作111
7.2.2 幂等操作111
7.2.3 TCC操作112
7.2.4 可补偿操作113
7.3 TCC解决方案113
7.3.1 适用场景114
7.3.2 需要实现的服务模式114
7.3.3 方案的执行流程114
7.3.4 方案的优缺点115
7.3.5 需要注意的问题116
7.4 可靠消息终一致性解决方案117
7.4.1 适用场景117
7.4.2 需要实现的服务模式117
7.4.3 方案的执行流程118
7.4.4 方案的优缺点119
7.4.5 需要注意的问题120
7.5 努力通知型解决方案120
7.5.1 适用场景120
7.5.2 需要实现的服务模式121
7.5.3 方案的执行流程121
7.5.4 方案的优缺点122
7.5.5 需要注意的问题122
7.5.6 努力通知与可靠消息终一致性的区别123
7.6 本章小结123
第三部分 分布式事务原理
第8章 XA强一致性分布式事务原理126
8.1 X/Open DTP模型与XA规范126
8.1.1 DTP模型126
8.1.2 XA规范127
8.1.3 JTA规范127
8.1.4 XA二阶段提交128
8.2 MySQL对XA规范的支持129
8.2.1 MySQL XA事务的语法129
8.2.2 MySQL XID详解129
8.2.3 MySQL XA事务的状态130
8.2.4 MySQL XA的问题131
8.3 XA规范的问题思考132
8.3.1 XA规范的缺陷132
8.3.2 XA流程的优化与异常思考133
8.3.3 解决XA数据不一致的问题134
8.3.4 解决事务管理器的单点故障问题135
8.4 主流的解决方案135
8.5 本章小结136
第9章 TCC分布式事务原理137
9.1 TCC核心思想137
9.2 TCC实现原理139
9.2.1 TCC核心组成139
9.2.2 TCC核心原理140
9.3 TCC核心流程142
9.3.1 业务场景介绍142
9.3.2 Try阶段流程143
9.3.3 Confirm阶段流程144
9.3.4 Cancel阶段流程145
9.4 TCC关键技术146
9.5 本章小结147
第10章 可靠消息终一致性分布式事务原理148
10.1 基本原理148
10.2 本地消息表149
10.2.1 实现原理149
10.2.2 优缺点150
10.3 独立消息服务151
10.3.1 实现原理151
10.3.2 优缺点152
10.4 RocketMQ事务消息153
10.4.1 实现原理153
10.4.2 RocketMQ本地事务监听接口154
10.5 消息发送的一致性155
10.5.1 消息发送与确认机制155
10.5.2 消息发送的不一致性156
10.5.3 如何保证消息发送的一致性157
10.6 消息接收的一致性158
10.6.1 消息接收与确认机制158
10.6.2 消息接收的不一致性159
10.6.3 如何保证消息接收的一致性159
10.7 消息的可靠性161
10.7.1 消息发送的可靠性161
10.7.2 消息存储的可靠性161
10.7.3 消息消费的可靠性162
10.8 本章小结162
第11章 努力通知型分布式事务原理163
11.1 适用场景163
11.2 方案特点164
11.3 基本原理164
11.4 异常处理165
11.5 本章小结166
第四部分 分布式事务源码与实战
第12章 XA强一致性分布式事务解决方案源码解析168
12.1 分布式数据一致性场景的搭建168
12.1.1 构建环境168
12.1.2 准备环境169
12.1.3 修改配置169
12.1.4 启动171
12.1.5 验证171
12.2 ShardingSphere对XA分布式事务方案的整合172
12.2.1 ShardingTransactionManager接口172
12.2.2 XATransactionManager接口174
12.2.3 DataSourceSwapper类174
12.2.4 XAConnectionWrapper接口175
12.2.5 XA事务初始化175
12.2.6 XA资源注册176
12.3 ShardingSphere对Atomikos方案的实战与源码解析178
12.3.1 Atomikos-XA分布式事务初始化流程178
12.3.2 Atomikos-XA分布式事务Begin流程183
12.3.3 Atomikos-XA分布式事务资源注册原理185
12.3.4 Atomikos-XA分布式事务Commit流程186
12.3.5 Atomikos-XA分布式事务Rollback流程191
12.3.6 Atomikos-XA分布式事务恢复流程193
12.4 ShardingSphere对Narayana方案的实战与源码解析198
12.4.1 Narayana环境搭建198
12.4.2 Narayana-XA分布式事务初始化流程199
12.4.3 Narayana-XA分布式事务Begin流程206
12.4.4 Narayana-XA分布式事务资源注册208
12.4.5 Narayana-XA分布式事务Commit流程208
12.4.6 Narayana-XA分布式事务Rollback流程211
12.4.7 Narayana-XA分布式事务恢复流程212
12.5 本章小结216
第13章 Hmily-TCC分布式事务解决方案源码解析217
13.1 Hmily-TCC分布式场景的搭建217
13.1.1 准备环境218
13.1.2 下载源码并编译220
13.1.3 修改配置220
13.1.4 启动程序222
13.1.5 验证223
13.2 Hmily框架初始流程源码解析223
13.2.1 加载配置225
13.2.2 初始化事务日志存储229
13.2.3 初始化事务恢复调度器234
13.2.4 初始化事件分发器235
13.2.5 初始化Metrics监控信息236
13.3 Hmily-TCC分布式事务源码解析238
13.3.1 Try流程源码解析239
13.3.2 Confirm流程源码解析253
13.3.3 Cancel流程源码解析258
13.4 Hmily对RPC框架的支持261
13.4.1 对Dubbo框架的支持261
13.4.2 对Spring Cloud框架的支持263
13.4.3 对BRPC框架的支持265
13.4.4 对Motan框架的支持267
13.4.5 对gRPC框架的支持268
13.4.6 对Sofa-RPC框架的支持270
13.4.7 对Tars框架的支持272
13.5 Hmily-TCC事务恢复源码解析273
13.5.1 逻辑处理274
13.5.2 事务恢复275
13.6 本章小结276
第14章 XA强一致性分布式事务实战277
14.1 场景说明277
14.2 程序模块说明278
14.3 数据库表设计278
14.4 程序实现279
14.4.1 项目搭建279
14.4.2 持久层的实现287
14.4.3 业务逻辑层的实现288
14.4.4 接口层的实现289
14.4.5 项目启动类的实现290
14.5 测试程序290
14.6 本章小结292
第15章 TCC分布式事务实战293
15.1 场景说明293
15.2 程序模块说明294
15.3 数据库表设计295
15.4 实现项目公共模块297
15.4.1 项目搭建297
15.4.2 持久层的实现300
15.4.3 Dubbo接口的定义304
15.5 实现转出银行微服务305
15.5.1 项目搭建305
15.5.2 业务逻辑层的实现311
15.5.3 接口层的实现313
15.5.4 项目启动类的实现313
15.6 实现转入银行微服务314
15.6.1 业务逻辑层的实现314
15.6.2 项目启动类的实现315
15.7 测试程序316
15.8 本章小结318
第16章 可靠消息终一致性分布式事务实战319
16.1 场景说明319
16.2 程序模块说明321
16.3 RocketMQ环境搭建与测试321
16.3.1 搭建Java环境321
16.3.2 搭建RocketMQ环境322
16.3.3 测试RocketMQ环境324
16.4 数据库表设计326
16.5 实现订单微服务328
16.5.1 项目搭建328
16.5.2 持久层的实现333
16.5.3 业务逻辑层的实现335
16.5.4 接口层的实现338
16.5.5 项目启动类的实现338
16.6 实现库存微服务339
16.6.1 项目搭建339
16.6.2 持久层的实现339
16.6.3 业务逻辑层的实现341
16.6.4 项目启动类的实现343
16.7 测试程序343
16.8 本章小结345
第17章 努力通知型分布式事务实战347
17.1 场景说明347
17.2 程序模块说明348
17.3 数据库表设计348
17.4 实现账户微服务350
17.4.1 项目搭建350
17.4.2 持久层的实现355
17.4.3 业务逻辑层的实现358
17.4.4 接口层的实现360
17.4.5 启动类的实现360
17.5 实现充值微服务361
17.5.1 项目搭建与持久层的实现361
17.5.2 业务逻辑层的实现361
17.5.3 接口层的实现362
17.5.4 启动类的实现363
17.6 测试程序363
17.7 本章小结365
|
內容試閱:
|
为什么要写这本书
随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化。总体来说,系统架构大致经历了单体应用架构→垂直应用架构→分布式架
构→SOA架构→微服务架构的演变。如今微服务技术越来越成熟,很多企业都采用微服务架构来支撑内部及对外的业务,尤其是在高并发大流量的电商业务场景下,微服务更是企业的架构模式。
微服务的普及也带来了新的问题。原本单一的应用架构只需要连接一台数据库实例即可完成所有业务操作,业务方法的逻辑在一个事务中即可完成,涉及的所有数据库操作要么全部提交,要么全部不提交,很容易实现数据的一致性。而在微服务架构下,原本单一的应用被拆分为一个个很小的服务,每个服务都有其独立的业务和数据库,服务与服务之间的交互通过接口或者远程过程调用(Remote Procedure Call,RPC)的方式进行,此时,服务与服务之间的数据一致性问题就变得棘手了。
因为微服务这种架构模式本质上就是多个应用连接多个数据库共同完成一组业务逻辑,所以数据一致性问题就凸显出来了。除此之外,多个应用连接同一个数据库和单个应用连接多个数据库也会产生数据一致性问题。可以这么说,在互联网行业,任何企业都会或多或少地遇到数据一致性问题。业界将这种数据一致性问题称为分布式事务问题。为了解决分布式事务问题,业界提出了一些著名的理论,比如CAP理论和Base理论,并针对这些理论提出了很多解决方案,比如解决强一致性分布式事务的DTP模型、XA事务、2PC模型、3PC模型,解决终一致性分布式事务的TCC、可靠消息终一致性、努力通知型等模型。不少企业和开源组织,甚至个人都基于这些模型实现了比较通用的分布式事务框架。
深入掌握分布式事务已然成为互联网行业中每个中高级开发人员和架构师必须掌握的技能,而熟练掌握分布式事务产生的各种场景和解决方案也成为各大互联网公司对应聘者的基本要求。
尽管对于分布式事务这个话题,业界有不少成熟的解决方案,但是纵观整个图书市场,几乎找不到一本系统深入讲解分布式事务的图书。本书从实际需求出发,全面且细致地介绍了有关分布式事务的基础知识、解决方案、实现原理和源码实战。每章根据需要配有相关的原理图和流程图,并提供完整的实战案例源码。书中的每个解决方案都经过了高并发大流量生产环境的考验,可以直接拿来解决实际生产环境中的分布式事务问题。通过对本书的阅读和学习,读者可以更加全面、深入、透彻地理解分布式事务的基础、解决方案、原理和应用,提高应对分布式事务问题的处理能力和项目的实战能力。
读者对象
本书适合以下几类读者阅读:
互联网从业者,如中高级开发人员、架构师、技术经理、技术专家;
需要系统学习分布式事务的开发人员;
需要提高分布式事务开发水平的人员;
需要时常查阅分布式事务技术资料和开发案例的人员。
本书特色
1.大量图解和开发案例
为了方便读者理解,我们在介绍分布式事务的基础、解决方案、原理、源码与实战章节中配有大量的图解和图表,同时在源码与实战章节配有完整的分布式事务案例,读者可以参考本书的案例进行学习,并运行本书的案例代码,以更深入地理解和掌握分布式事务。这些案例代码和图解的draw.io源文件收录于随书资料里,读者可以从下面的链接获取相关内容。
GitHub:https://github.com/dromara/distribute-transaction。
Gitee:https://gitee.com/dromara/distribute-transaction。
2.技术点全面
本书全面且细致地介绍了分布式事务的各项知识,包含分布式事务的基础、解决方案、原理、源码与实战。通过阅读本书,读者能够全面掌握分布式事务的原理和应用。
3.案例应用性强,具备较高的实用价值
本书关于分布式事务的各项技术点都配有相关的案例,都是实现分布式事务相关技术的典型案例,具有很强的实用性,方便读者随时查阅和参考。
另外,这些实战案例大都是我们实际工作的总结,尤其是书中涉及的分布式事务框架,均是业界知名的开源分布式事务框架,稍加修改与完善便可应用于实际的生产环境中。
本书内容
本书分为如下四个部分。
部分 分布式事务基础(第1~5章)
首先介绍事务的基本概念,然后介绍MySQL事务和Spring事务的实现原理,后介绍分布式事务的基本概念和理论知识。
第二部分 分布式事务解决方案(第6~7章)
以大量图解的方式详细介绍了分布式事务的各种解决方案,包括强一致性分布式事务解决方案和终一致性分布式事务解决方案。
第三部分 分布式事务原理(第8~11章)
以大量图解的方式详细讲解了分布式事务的原理,包括XA强一致性分布式事务、TCC分布式事务、可靠消息终一致性分布式事务和努力通知型分布式事务。
第四部分 分布式事务源码与实战(第12~17章)
首先详细讲解了业界比较知名的ShardingSphere框架实现XA分布式事务的源码,然后详细剖析了Dromara开源社区的Hmily分布式事务框架实现TCC分布式事务的源码,后分别对XA强一致性分布式事务、TCC分布式事务、可靠消息终一致性分布式事务和努力通知型分布式事务进行了实战案例讲解。
如何阅读本书
对于没有接触过分布式事务的读者,建议按照顺序从第1章开始阅读,并实现每一个案例。
对于有一定MySQL和Spring开发基础的读者,可以根据实际情况,有选择性地阅读分布式事务的相关章节。
对于书中涉及的每个分布式事务案例,读者可以先自行思考实现方式,再阅读相关的案例讲解,了解各技术对应的原理细节,以加深理解,达到事半功倍的学习效果。
勘误和支持
本书是肖宇和冰河(排名不分先后)联合撰写的。由于水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,我们特意在Dromara社区的GitHub上创建了一个单独的仓库用来记录本书的勘误信息,仓库地址为https://github.com/dromara/transaction-book。读者可以将书中的错误发布在Bug勘误中,如果遇到任何问题,也可以记录在这个仓库中,我们将尽量在线上为读者提供满意的解答。如果有更多宝贵的建议或者意见,也可以联系我们。
肖宇的联系方式如下。
微信:xixy199195。
邮箱:xiaoyu@apache.org。
公众号:Dromara开源组织。
冰河的联系方式如下。
微信:hacker_binghe。
邮箱:1028386804@qq.com。
公众号:冰河技术。
如果想获得更多有关分布式事务或者开源框架的动态,可以关注微信公众号“Dromara开源组织”和“冰河技术”。
致谢
首先感谢张逸为本书作序。感谢郑灏、刘启荣、高新刚、沈建林、付晓岩、史少锋、刘勋、张亮、代立冬、杨晓峰、于君泽、孙玄、沈剑、曾波、程超、张永伦、于雨、程军和骆俊武(排名不分先后)等专家为本书撰写推荐语。
感谢Dromara开源社区的兄弟姐妹们,感谢你们对社区的长期支持和贡献。你们的支持是我们写作的动力。
感谢机械工业出版社华章公司的杨福川老师和董惠芝编辑、韩蕊编辑在这一年多的时间里始终支持我们写作,是你们的鼓励和帮助引导我们顺利完成了全部书稿。
感谢家人在我们写作期间默默给予我们支持与鼓励,并时刻为我们传递着信心和力量!
后,感谢所有支持、鼓励和帮助过我们的人。谨以此书献给我们亲爱的家人,以及众多热爱开源事业和关注Dromara开源社区的朋友们!
肖宇、冰河
|
|