Spring Cloud Alibaba 微服務架構實戰派 (上下冊)
內容描述
本書覆蓋了微服務架構的主要技術點,包括分佈式服務治理、分佈式配置管理、分佈式流量防護、分佈式事務處理、分佈式消息處理、分佈式網關、分佈式鏈路追蹤、分佈式Job、分庫分表、讀寫分離、分佈式緩存、服務註冊/訂閱路由、全鏈路藍綠發布和灰度發布。在講解這些技術點,採用“是什麽→怎麽用→什麽原理(源碼解析)”的主線來講解。為了方便讀者在企業中落地Spring Cloud Alibaba項目,本書還包括幾個相對完整的項目實戰:全鏈路日誌平臺、中台架構、數據遷移平臺、業務鏈路告警平臺。本書的目標是:①讓讀者在動手中學習,而不是“看書時好像全明白了,一動手卻發現什麽都不會”;②讀者可以掌握微服務全棧技術,而不僅僅是Spring Cloud Alibaba框架,對於相關的技術(Seata、RocketMQ),基本都是從零講起,這樣避免了讀者為了學會微服務技術,得找Spring Cloud Alibaba的書、Seata的書、RocketMQ的書……本書是一站式解決方案。
目錄大綱
★入門篇
1章 進入Spring Cloud 的世界 /2
1.1 了解微服務架構 /2
1.1.1 單體架構與微服務架構的區別 /2
1.1.2 分佈式架構與微服務架構的區別 /6
1.2 如何構建微服務架構 /8
1.2.1 構建微服務架構的目標 /8
1.2.2 構建微服務架構的關鍵點 /8
1.3 認識Spring Cloud a /11
1.4 學習Spring Cloud 的建議 /12
1.4.1 熟悉Spring Boot /12
1.4.2 熟悉Spring Cloud /13
1.4.3 Spring Cloud Aa的版本演進 /14
1.5 Spring Cloud 與Spring Cloud的關係 /15
1.6 搭建基礎環境 /16
1.6.1 安裝Maven /16
1.6.2 熟悉Git /18
2章 熟用開發工具 /19
2.1 安裝開發工具IntelliJ IDEA /19
2.2 【實例】用Spring Cloud Aa開發一個RESTful API服務 /20
2.3 了解Spring Framework官方開發工具STS /24
2.4 了解Spring Framework官方腳手架工具 /25
★基礎篇
3章 Spring Cloud Aa基礎實戰 /28
3.1 Spring Cloud Alba“牛刀小試” /28
3.1.1 【實例】實現樂觀鎖 /28
3.1.2 【實例】實現多數據源 /32
3.1.3 【實例】實現SQL語句中表名的動態替換 /35
3.2 【實例】用Maven和Spring Cloud Aa實現多環境部署 /36
3.2.1 初始化 /37
3.2.2 多環境配置 /37
3.2.3 構建 /38
3.2.4 效果演示 /41
3.3 【實例】用“MyBatis-Plus + Spring Cloud Ala”實現多租戶架構 /42
3.3.1 多租戶的概念 /42
3.3.2 多租戶的原理 /42
3.3.3 架構 /44
3.3.4 搭建及效果演示 /46
4章 分佈式服務治理——基於Nacos /48
4.1 認識分佈式服務治理 /48
4.1.1 什麼是分佈式服務治理 /48
4.1.2 為什麼需要分佈式服務治理 /49
4.2 了解主流的註冊中心 /50
4.2.1 Nacos /50
4.2.2 ZooKeeper /51
4.2.3 Consul /52
4.2.4 Sofa /53
4.2.5 Etcd /53
4.2.6 Eureka /54
4.2.7 對比Nacos、ZooKeeper、Sofa、Consul、Etcd和Euraka /54
4.3 將應用接入Nacos 註冊中心 /55
4.3.1 【實例】用“Nacos Client + Spring Boot”接入 /55
4.3.2 【實例】用Spring Cloud Alba Discovery接入 /57
4.4 用“NacosNamingService類 + @EnableDiscoveryClient”實現服務的註冊/訂閱 /59
4.4.1 服務註冊的原理 /59
4.4.2 服務訂閱的原理 /69
4.4.3 【實例】通過服務冪等性設計驗證服務的註冊/訂閱 /74
4.5 用“Ribbon + Nacos Client”實現服務發現的負載均衡 /82
4.5.1 為什麼需要負載均衡 /82
4.5.2 【實例】用“Ribbon + Nacos Client”實現負載均衡 /83
4.6 用CP模式和AP模式來保持註冊中心的數據一致性 /88
4.6.1 了解CAP理論 /88
4.6.2 了解Nacos的CP模式和AP模式 /89
4.6.3 了解Raft與Soft-Jraft /90
4.6.4 Nacos註冊中心AP模式的數據一致性原理 /91
4.6.5 Nacos註冊中心CP模式的數據一致性原理 /96
4.6.6 【實例】用持久化的服務實例來驗證註冊中心的數據一致性 /104
4.7 用緩存和文件來存儲Nacos的元數據 /106
4.7.1 認識Nacos的元數據 /106
4.7.2 用緩存存儲Nacos的元數據 /108
4.7.3 用文件存儲Nacos的元數據 /110
4.7.4 【實例】用Spring Cloud Ala整合Nacos和Dubbo的元數據 /111
4.8 用Nacos Sync來實現應用服務的數據遷移 /114
4.8.1 為什麼要進行應用服務的數據遷移 /115
4.8.2 如何完成應用服務的數據遷移 /116
4.8.3 【實例】將Eureka註冊中心中的應用服務數據遷移到Nacos註冊中心中 /117
5章 分佈式配置管理——基於Nacos /122
5.1 認識分佈式配置管理 /122
5.1.1 什麼是分佈式配置管理 /122
5.1.2 為什麼需要分佈式配置管理 /123
5.2 了解主流的配置中心 /124
5.2.1 Nacos /124
5.2.2 Spring Cloud Config /126
5.2.3 Apollo /127
5.2.4 對比Nacos、Spring Cloud Config、Apollo和Disconf /127
5.3 將應用接入Nacos配置中心 /128
5.3.1 接入方式 /128
5.3.2 認識Nacos配置中心的配置信息模型 /128
5.3.3 了解NacosConfigService類 /129
5.3.4 【實例】用Nacos Client接入應用 /129
5.3.5 【實例】用Open API接入應用 /132
5.3.6 【實例】用Spring Cloud Ala Config接入應用 /134
5.4 用HTTP協議和gRPC框架實現通信渠道 /137
5.4.1 什麼是gRPC /137
5.4.2 “用HTTP實現Nacos Config通信渠道”的原理 /137
5.4.3 “用‘長輪詢 + 註冊監聽器’機制將變更之後的配置信息同步到應用”的原理 /141
5.4.4 “用gRPC框架實現客戶端與acos Config Server之間通信渠道”的原理 /148
5.4.5 【實例】用“採用gRPC通信渠道的Nacos Config”實現配置數據的動態更新 /151
5.5 用“Sofa-Jraft + Apache Derby”保證配置中心的數據一致性 /152
5.5.1 Nacos配置中心的數據一致性原理 /153
5.5.2 【實例】用“切換所連接的Nacos節點”驗證數據一致性 /159
5.6 用數據庫持久化配置中心的數據 /161
5.6.1 為什麼需要持久化 /161
5.6.2 持久化的基礎配置 /162
5.6.3 持久化的原理 /162
5.6.4 【實例】用“配置信息的灰度發布”驗證持久化 /165
5.7 用“Spring Cloud Ala Config + Nacos Config”實現配置管理(公共配置、應用配置和擴展配置) /168
5.7.1 “按照優先級加載屬性”的原理 /168
5.7.2 【實例】驗證公共配置、應用配置和擴展配置的優先級順序 /172
6章 分佈式流量防護——基於Sentinel /175
6.1 認識分佈式流量防護 /175
6.1.1 什麼是分佈式流量防護 /175
6.1.2 為什麼需要分佈式流量防護 /177
6.2 認識Sentinel /179
6.3 將應用接入Sentinel /180
6.3.1 搭建Sentinel控制台 /180
6.3.2 【實例】用Sentinel Core手動地將應用接入Sentinel /181
6.3.3 【實例】用Spring Cloud Ala Sentinel將應用接入Sentinel /183
6.4 用HTTP或者Netty實現通信渠道 /184
6.4.1 認識NIO框架Netty /184
6.4.2 用SPI機制實現插件化通信渠道的原理 /184
6.4.3 “用插件類NettyHttpCommandCenter實現通信渠道”的原理 /189
6.4.4 “用SimpleHttpCommandCenter類實現通信渠道”的原理 /192
6.4.5 【實例】用Netty實現通信渠道,實現“從應用端到Sentinel控制台的流量控制規則推送” /196
6.5 用過濾器和攔截器實現組件的適配 /198
6.5.1 什麼是過濾器和攔截器 /198
6.5.2 “Sentinel通過過濾器適配Dubbo”的原理 /199
6.5.3 “Sentinel通過攔截器適配Spring MVC”的原理 /203
6.5.4 【實例】將Spring Cloud Gateay應用接入Sentinel,管理流量控制規則 /206
6.6 用“流量控制”實現流量防護 /208
6.6.1 什麼是流量控制 /208
6.6.2 槽位(Slot)的動態加載機制 /210
6.6.3 “加載應用運行的監控指標”的原理 /214
6.6.4 “用QPS/並發線程數實現流量控制”的原理 /216
6.6.5 “用調用關係實現流量控制”的原理 /222
6.6.6 【實例】通過控制台實時地修改QPS驗證組件的流量防控 /224
6.7 用“熔斷降級”實現流量防護 /227
6.7.1 什麼是熔斷降級 /227
6.7.2 “實現熔斷降級”的原理 /228
6.7.3 【實例】用“模擬Dubbo服務故障”驗證服務調用熔斷降級的過程 /235
6.8 用“系統自適應保護”實現流量防護 /239
6.8.1 什麼是“系統自適應保護” /239
6.8.2 “系統自適應保護”的原理 /240
6.8.3 【實例】通過調整應用服務的入口流量和負載,驗證系統自適應保護 /243
6.9 用Nacos實現規則的動態配置和持久化 /247
6.9.1 為什麼需要“規則的動態配置” /247
6.9.2 為什麼需要“規則的持久化” /248
6.9.3 “規則的動態配置”的原理 /248
6.9.4 “規則的持久化”的原理 /255
6.9.5 【實例】將Dubbo應用接入Sentinel,實現規則的動態配置和持久化 /257
★中級篇
7章 分佈式事務處理——基於Seata /264
7.1 認識分佈式事務 /264
7.1.1 什麼是分佈式事務 /264
7.1.2 為什麼需要分佈式事務 /267
7.2 認識Seata /268
7.2.1 Seata的基礎概念 /268
7.2.2 Seata的事務模式 /269
7.3 將應用接入Seata /274
7.3.1 搭建Seata Server的高可用環境 /274
7.3.2 【實例】使用seata-spring-boot-starter將應用接入Seata /279
7.3.3 【實例】使用Spring Cloud Aba 將應用接入Seata /282
7.4 用Netty實現客戶端與服務器端之間的通信渠道 /284
7.4.1 “用Netty實現通信渠道的服務器端”的原理 /284
7.4.2 “用Netty實現通信渠道的客戶端”的原理 /289
7.5 用攔截器和過濾器適配主流的RPC框架 /295
7.5.1 “用過濾器適配Dubbo”的原理 /295
7.5.2 “用攔截器適配gRPC”的原理 /297
7.6 用AT模式實現分佈式事務 /299
7.6.1 “用數據源代理實現AT模式的零侵入應用”的原理 /299
7.6.2 “用全局鎖實現AT模式二階段的寫隔離”的原理 /304
7.6.3 【實例】搭建Seata的AT模式的環境,並驗證AT模式的分佈式事務場景 /317
7.7 用TCC模式實現分佈式事務 /327
7.7.1 用GlobalTransactionScanner類掃描客戶端,開啟TCC動態代理 /327
7.7.2 用攔截器TccActionInterceptor校驗TCC事務 /330
7.7.3 【實例】搭建Seata的TCC模式的環境,並驗證TCC模式的分佈式事務場景 /332
7.8 用XA模式實現分佈式事務 /343
7.8.1 “用數據源代理實現XA模式的零侵入應用”的原理 /343
7.8.2 用XACore類處理XA模式的事務請求 /350
7.8.3 【實例】搭建Seata的XA模式的客戶端運行環境,並驗證XA模式的分佈式事務回滾的效果 /353
7.9 用Saga模式實現分佈式事務 /362
7.9.1 “用狀態機實現Saga模式”的原理 /363
7.9.2 【實例】搭建Seata的Saga模式的客戶端運行環境,並驗證Saga模式的分佈式事務場景 /367
8章 分佈式消息處理——基於RocketMQ /374
8.1 消息中間件概述 /374
8.1.1 什麼是消息中間件 /374
8.1.2 為什麼需要消息中間件 /375
8.1.3 認識RocketMQ /376
8.2 搭建RocketMQ的運行環境 /379
8.2.1 了解RocketMQ的安裝包 /379
8.2.2 搭建單Master的單機環境 /380
8.2.3 搭建多Master的集環境 /380
8.2.4 搭建單Master和單Slave的集環境 /382
8.2.5 搭建Raft集環境 /384
8.2.6 【實例】用RocketMQ Admin控制台管控RocketMQ /386
8.3 將應用接入RocketMQ /386
8.3.1 【實例】用rocketmq-spring-boot-starter框架將應用接入RocketMQ /387
8.3.2 【實例】用spring-cloud-starter-stream-rocketmq框架將應用接入RocketMQ /389
8.4 用Netty實現RocketMQ的通信渠道 /392
8.4.1 用NettyRemotingClient類實現客戶端的通信渠道 /393
8.4.2 用NettyRemotingServer類實現服務器端的通信渠道 /395
8.5 用“異步”“同步”和“#多發送一次”模式生產消息 /400
8.5.1 用“異步”模式生產消息的原理 /400
8.5.2 用“同步”模式生產消息的原理 /403
8.5.3 用“#多發送一次”模式生產消息的原理 /405
8.5.4 【實例】在Spring Cloud Ala項目中生產同步消息和異步消息 /407
8.6 用Push模式和Pull模式消費消息 /410
8.6.1 “用Push模式消費消息”的原理 /410
8.6.2 “用Pull模式消費消息”的原理 /421
8.6.3 【實例】生產者生產消息,消費者用Pull模式和Push模式消費消息 /431
8.7 用兩階段提交和定時回查事務狀態實現事務消息 /437
8.7.1 什麼是事務消息 /437
8.7.2 兩階段提交的原理 /437
8.7.3 定時回查事務狀態的原理 /447
8.7.4 【實例】在Spring Cloud Aliaba項目中生產事務消息 /451
9章 分佈式網關——基於Spring Cloud Gateway /456
9.1 認識網關 /456
9.1.1 什麼是網關 /456
9.1.2 為什麼需要網關 /457
9.1.3 認識Spring Cloud Gateway /460
9.2 用Reactor Netty實現 Spring Cloud Gateway的通信渠道 /463
9.2.1 什麼是Reactor Netty /463
9.2.2 “用過濾器代理網關請求”的原理 /466
9.3 用“路由規則定位器”(RouteDefinitionLocator)加載網關的路由規則 /473
9.3.1 “基於註冊中心的路由規則定位器”的原理 /473
9.3.2 “基於內存的路由規則定位器”的原理 /477
9.3.3 “基於Redis緩存的路由規則定位器”的原理 /479
9.3.4 “基於屬性文件的路由規則定位器”的原理 /480
9.3.5 【實例】用“基於註冊中心和配置中心的路由規則定位器”在網關統一暴API /481
9.4 用“Redis + Lua”進行網關API的限流 /487
9.4.1 “網關用Redis + Lua實現分佈式限流”的原理 /487
9.4.2 【實例】將Spring Cloud Ala應用接入網關,用“Redis +Lua”進行限流 /494
★高#級篇
10章 分佈式鏈路追踪——基於Skywalking /500
10.1 認識分佈式鏈路追踪 /500
10.1.1 什麼是分佈式鏈路追踪 /500
10.1.2 認識Skywalking /502
10.2 搭建Skywalking環境 /505
10.2.1 搭建單機環境 /505
10.2.2 搭建集環境 /507
10.3 用Java Agent將Spring Cloud
10.3.2 “Skywalking使用Java Agent零侵入應用”的原理 /513
10.3.3 【實例】將“基於Spring Cloud Aa的服務消費者和訂閱者”接入Skywalking /517
10.4 用ModuleProvider和ModuleDefine將Skywalking的功能進行模塊化設計
10.4.1 為什麼需要模塊化設計 /520
10.4.2 Skywalking模塊化設計的原理 /522
10.4.3 Skywalking啟動的原理 /529
10.5 用HTTP、gRPC和Kafka實現“應用與Skywalking之間的通信渠道”
10.5.1 “基於HTTP實現通信渠道”的原理 /532
10.5.2 “基於gRPC實現通信渠道”的原理 /535
10.5.3 “基於Kafka實現通信渠道”的原理 /541
10.5.4 【實例】搭建Kafka環境,並用異步通信渠道Kafka收集基於Spring Cloud Aa應用的運行鏈路指標數據 /549
10.6 用“註冊中心”保證集的高可用 /551
10.6.1 為什麼需要註冊中心 /551
10.6.2 “用註冊中心保證集高可用”的原理 /553
10.7 用“分佈式配置中心”動態加載集的配置信息 /558
10.7.1 為什麼需要分佈式配置中心 /558
10.7.2 “用配置中心動態加載集配置信息”的原理 /559
10.7.3 【實例】用配置中心動態地修改告警規則 /565
10.8 用探針採集鏈路追踪數據 /569
10.8.1 什麼是探針 /569
10.8.2 Dubbo探針的原理 /570
10.8.3 “Skywalking用探針來增強應用代碼”的原理 /573
10.8.4 【實例】模擬Dubbo服務故障,用Dubbo探針採集鏈路追踪數據
10.9 用Elasticsearch存儲鏈路追踪數據 /583
10.9.1 什麼是Elasticsearch /583
10.9.2 存儲鏈路追踪指標數據的原理 /584
10.9.3 【實例】將Skywalking集接入Elasticsearch,並採集Spring Cloud Ala應用的鏈路追踪數據 /595
11章 分佈式Job——基於Elastic Job /598
11.1 認識分佈式Job /598
11.1.1 為什麼需要分佈式Job /598
11.1.2 認識Elastic Job /602
11.2 將應用接入Elastic Job Lite /604
11.2.1 將應用接入Elastic Job Lite的3種模式 /605
11.2.2 搭建Elastic Job Lite的分佈式環境 /607
11.2.3 【實例】用Spring Boot Starter將Spring Cloud Aba應用接入Elastic Job Lite /608
11.3 “實現Elastic Job Lite的本地Job和分佈式Job”的原理 /611
11.3.1 用Quartz框架實現本地Job /611
11.3.2 用ZooKeeper框架實現分佈式Job /621
11.3.3 【實例】在Elastic Job控制台中控分佈式Job /625
11.4 “用SPI將Job分片策略插件化”的原理 /627
11.4.1 用SPI工廠類JobShardingStrategyFactory加載分片策略 /628
11.4.2 用ShardingService類觸發Job去執行分片策略 /631
11.4.3 【實例】將Spring Cloud Aa應用接入帶有分片功能的分佈式Job /633
11.5 “實現分佈式Job的事件追踪”的原理 /636
11.5.1 用基於Guava的事件機制實現分佈式Job的事件追踪 /636
11.5.2 用數據庫持久化分佈式Job的運行狀態和日誌 /643
11.5.3 【實例】將Spring Cloud Ala應用接入Elastic Job,並開啟分佈式Job的事件追踪 /652
12章 分庫分錶和讀寫分離——基於ShardingSphere
12.1 認識ShardingSphere /655
12.1.1 什麼是分佈式數據庫 /655
12.1.2 什麼是ShardingSphere /658
12.2 將應用接入ShardingSphere JDBC /662
作者介紹
胡弦
2012年畢業於杭州電子科技大學自動化學院,碩士研究生。
一名工作10年的IT老兵,曾就職於網易、連連支付等企業。
從Java工程師開始,一路“打怪升級”成為“獨角獸”公司的高級技術專家、資深架構師和技術負責人,是一名技術狂熱愛好者。