Spring Cloud Alibaba 微服務架構實戰派 (上下冊)

胡弦

買這商品的人也買了...

商品描述

本書覆蓋了微服務架構的主要技術點,包括分佈式服務治理、分佈式配置管理、分佈式流量防護、分佈式事務處理、分佈式消息處理、分佈式網關、分佈式鏈路追蹤、分佈式Job、分庫分表、讀寫分離、分佈式緩存、服務註冊/訂閱路由、全鏈路藍綠發布和灰度發布。在講解這些技術點,採用“是什麽→怎麽用→什麽原理(源碼解析)”的主線來講解。為了方便讀者在企業中落地Spring Cloud Alibaba項目,本書還包括幾個相對完整的項目實戰:全鏈路日誌平臺、中台架構、數據遷移平臺、業務鏈路告警平臺。本書的目標是:①讓讀者在動手中學習,而不是“看書時好像全明白了,一動手卻發現什麽都不會”;②讀者可以掌握微服務全棧技術,而不僅僅是Spring Cloud Alibaba框架,對於相關的技術(Seata、RocketMQ),基本都是從零講起,這樣避免了讀者為了學會微服務技術,得找Spring Cloud Alibaba的書、Seata的書、RocketMQ的書……本書是一站式解決方案。

作者簡介

胡弦
2012年畢業於杭州電子科技大學自動化學院,碩士研究生。
一名工作10年的IT老兵,曾就職於網易、連連支付等企業。
從Java工程師開始,一路“打怪升級”成為“獨角獸”公司的高級技術專家、資深架構師和技術負責人,是一名技術狂熱愛好者。

目錄大綱

★入門篇
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