持續演進的 Cloud Native : 雲原生架構下微服務最佳實踐
內容描述
雲化架構是一個全新概念,包含微服務、十二因子、敏捷基礎設施和持續交付這些新老熱點。
而Cloud Native則是目前實現雲化架構最有希望的技術解決方案,其建築在傳統Cloud的三層(IaaS、PaaS、SaaS)概念之上,其中敏捷基礎設施對應IaaS部分,微服務則可以對應PaaS和SaaS部分。
本書內容基於Cloud Native原理展開,重點描述雲化架構的組成部分,及其相關理論和實踐。
本書來自作者在實際工作的經驗積累,內容既有經典理論,又有豐富的實戰案例,更不乏關鍵問題的完整解決方案。
編輯推薦
√雲原生架構是IT技術在雲計算時代的進化升級,標誌著雲端應用進入成熟階段,本書旨在首度提供與之匹配的成規模系統和團隊亟需的完整技術體系。
√雲原生技術變革為解決業務快速變化帶來的不確定性。本書全面介紹微服務架構演進的原則與實踐,闡述分佈式架構帶來的數據一致性問題的解決方案。
√本書傳授雲原生應用須滿足的可用性、伸縮性,可隨處運行、自動化部署和管理能力,以及如何通過持續集成及持續交付工具提高研發、測試與發布效率。
√實施微服務常見誤區:只關注微服務技術框架而忽視全局,沒有配套的微服務流水線、基礎設施自動化及對應的服務化團隊和組織結構,很難達到預期收益。
目錄大綱
第1章綜述1
1.1 Cloud Native的起源1
1.2 Cloud Native的組成4
1.3 Cloud Native背後的訴求5
1.4如何衡量Cloud Native的能力5
1.5 Cloud Native的原則6
第2章微服務架構11
2.1微服務架構的起源11
2.2為什麼採用微服務架構12
2.2.1單體架構與微服務架構12
2.2.2什麼時候開始微服務架構14
2.2.3如何決定微服務架構的拆分粒度14
2.3微服務設計原則15
2.4微服務架構實施的先決條件17
2.4.1研發環境和流程上的轉變17
2.4.2拆分前先做好解耦18
2.5微服務劃分模式20
2.5.1基於業務複雜度選擇服務劃分方法20
2.5.2基於數據驅動劃分服務21
2.5.3基於領域驅動劃分服務22
2.5.4從已有單體架構中逐步劃分服務23
2.5.5微服務拆分策略24
2.5.6如何衡量服務劃分的合理性25
2.6微服務劃分反模式26
2.7微服務API設計28
2.7.1優秀API的設計原則28
2.7.2服務間通信——RPC 28
2.7.3序列化——Protobuf 30
2.7.4服務間通信——RESTful 33
2.7.5通過Swagger實現RESTful 36
2.7.6通過Spring Boot、Springfox、Swagger實現RESTful 41
2.7.7 HTTP協議的進化——HTTP/2 46
2.7.8 HTTP/2和Protobuf的組合——gRPC 48
2.8微服務框架53
2.9基於Dubbo框架實現微服務54
2.10基於Spring Cloud框架實現微服務58
2.11服務發現場景下的ZooKeeper與Etcd 67
2.12微服務部署策略68
2.12.1服務獨享數據庫69
2.12.2服務獨享虛擬機/容器70
2.13為什麼總覺得微服務架構很彆扭70
第3章敏捷基礎設施及公共基礎服務73
3.1傳統基礎設施面臨的挑戰73
3.2什麼是敏捷基礎設施74
3.3基於容器的敏捷基礎設施75
3.3.1容器VS虛擬機76
3.3.2安裝Docker 77
3.3.3部署私有Docker Registry 79
3.3.4基於Spring Boot、Maven、Docker構建微服務79
3.3.5基於docker-compose管理容器84
3.4基於公共基礎服務的平台化85
3.5監控告警服務86
3.5.1監控數據採集87
3.5.2監控數據接收模式87
3.5.3通過時間序列數據庫存儲監控數據88
3.5.4開源監控系統實現Prometheus 88
3.5.5通過Prometheus和Grafana監控服務90
3.6分佈式消息中間件服務96
3.6.1分佈式消息中間件的作用97
3.6.2業界常用的分佈式消息中間件98
3.6.3 Kafka的設計原理99
3.6.4為什麼Kafka性能高100
3.6.5 Kafka的數據存儲結構102
3.6.6如何保證Kafka不丟消息104
3.6 .7 Kafka跨數據中心場景集群部署模式106
3.7分佈式緩存服務108
3.7.1分佈式緩存的應用場景109
3.7.2業界常用的分佈式緩存Memcached 110
3.7.3業界常用的分佈式緩存——Redis 111
3.7.4 Redis常用的分佈式緩存集群模式112
3.7.5基於Codis實現Redis分佈式緩存集群116
3.8分佈式任務調度服務118
3.8.1通過Tbschedule實現分佈式任務調度119
3.8.2通過Elastic-Job實現分佈式任務調度123
3.9如何生成分佈式ID 126
3.9.1 UUID 126
3.9.2 SnowFlake 127
3.9. 3 Ticket Server 128
3.9.4小結129
第4章可用性設計130
4.1綜述130
4.1.1可用性和可靠性的關係130
4.1.2可用性的衡量標準131
4.1.3什麼降低了可用性131
4.2逐步切換132
4.2. 1影子測試132
4.2.2藍綠部署133
4.2.3灰度發布/金絲雀發布134
4.3容錯設計135
4.3.1消除單點136
4.3.2特性開關136
4.3.3服務分級137
4.3.4降級設計138
4.3.5超時重試139
4.3.6隔離策略152
4.3.7熔斷器153
4.4流控設計157
4.4.1限流算法157
4.4.2流控策略159
4.4.3基於Guava限流160
4.4.4基於Nginx限流162
4.5容量預估163
4.6故障演練164
4.7數據遷移165
4.7.1邏輯分離,物理不分離166
4.7.2物理分離166
第5章可擴展性設計168
5.1加機器能解決問題嗎168
5.2橫向擴展169
5.3 AKF擴展立方體170
5.4如何擴展長連接172
5.5如何擴展數據庫175
5.5.1 X軸擴展——主從復制集群175
5.5.2 Y軸擴展——分庫、垂直分錶176
5.5.3 Z軸擴展——分片(sharding) 177
5.5.4為什麼要帶拆分鍵182
5.5.5分片後的關聯查詢問題183
5.5.6分片擴容(re-sharding) 184
5.5. 7精選案例187
5.6如何擴展數據中心190
5.6.1兩地三中心和同城多活190
5.6.2同城多活191
5.6.3異地多活192
第6章性能設計194
6.1性能指標195
6.2如何樹立目標195
6.3如何尋找平衡點196
6.4如何定位瓶頸點197
6.5服務通信優化198
6.5.1同步轉異步198
6.5.2阻塞轉非阻塞199
6.5.3序列化200
6.6通過消息中間件提升寫性能201
6.7通過緩存提升讀性能202
6.7.1基於ConcurrentHashMap實現本地緩存203
6.7.2基於Guava Cache實現本地緩存204
6.7.3緩存的常用模式205
6.7.4應用緩存的常見問題207
6.8數據庫優化208
6.8.1通過執行計劃分析瓶頸點208
6.8.2為搜索字段創建索引209
6.8.3通過慢查詢日誌分析瓶頸點210
6.8.4通過提升硬件能力優化數據庫211
6.9簡化設計212
6.9.1轉移複雜度212
6.9.2從業務角度優化212
第7章一致性設計214
7.1問題起源214
7.2基礎理論215
7.2.1什麼是分佈式事務216
7.2.2 CAP定理218
7.2.3 BASE理論219
7.2.4 Quorum機制(NWR模型) 219
7.2.5租約機制(Lease) 220
7.2.6狀態機(Replicated State Machine ) 221
7.3分佈式系統的一致性分類222
7.3.1以數據為中心的一致性模型223
7.3.2以用戶為中心的一致性模型226
7.3.3業界常用的一致性模型229
7.4如何實現強一致性230
7.4.1兩階段提交230
7.4.2三階段提交(3PC) 231
7.5如何實現最終一致性232
7.5.1重試機制232
7.5.2本地記錄日誌233
7.5.3可靠事件模式233
7.5.4 Saga事務模型235
7.5.5 TCC事務模型237
7.6分佈式鎖238
7.6.1基於數據庫實現悲觀鎖和樂觀鎖239
7.6.2基於ZooKeeper的分佈式鎖241
7.6.3基於Redis實現分佈式鎖242
7.7如何保證冪等性244
7.7.1冪等令牌(Idempotency Key) 244
7.7.2在數據庫中實現冪等性246
第8章未來值得關注的方向247
8.1 Serverless 247
8.1.1什麼是Serverless 247
8.1.2 Serverless的現狀248
8.1.3 Serverless的應用場景249
8.2 Service Mesh 250
8.2.1什麼是Service Mesh 250
8.2.2為什麼需要Service Mesh 252
8.2.3 Service Mesh的現狀253
8.2.4 Istio架構分析255
第9章研發流程258
9.1十二因子258
9.2為什麼選擇DevOps 261
9.3自動化測試263
9.3.1單元測試263
9.3.2 TDD 264
9.3.3提交即意味著可測試265
9.4 Code Review 265
9.4.1 Code Re
作者介紹
王啟軍
目前就職於華為公司架構部,負責華為公司的Cloud Native、微服務架構推進落地,前後參與了華為手機祥雲4.0、物聯網IoT 2.0的架構設計。
曾任噹噹架構師,主導電商平台架構設計,包括訂單、支付、價格、庫存、物流等。
曾就職於搜狐,負責手機微博的研發。
十餘年的技術歷練,也曾作為技術負責人帶領過近百人的團隊。
公眾號“奔跑中的蝸牛”的作者。