內容提要
架構設計是技術人員成長和晉升過程中必須掌握的技能,但目前業界缺乏架構師學習和培養方面體系化的知識和實踐的指導,本書結合作者多年在架構設計方面的學習、思考、實踐,提出了完整的一套架構設計方法論,包括什麼是架構、架構設計的目的、架構設計原則、架構設計流程、架構設計模式和技巧、網際網路公司技術演進等內容。這套架構設計方法論適合不同行業,比如網際網路、企業套用等;也適合不同的技術領域,比如後端架構設計、前端架構設計、客戶端架構設計、測試平台架構設計、運維平台架構設計等。
本書由淺入深地闡述了架構設計的相關內容,比較適合以下類型的讀者:
· 沒有架構設計經驗,但對架構設計非常有興趣,希望學習架構設計技術,提升技術能力,成為“大廠面霸”的讀者;
· 已經嘗試了一些架構設計,但挖了各種“坑”或踩了各種“坑”,希望知道“為什麼”的技術人員;
· 具備一定的架構設計經驗,想進一步系統化地提升架構設計能力,成為令人羨慕的“高級技術專家”“資深技術專家”的讀者。
目錄
第1部分 概念和基礎
第1章 架構基礎
1.1 “架構”到底指什麼
1.1.1 系統與子系統
1.1.2 模組與組件
1.1.3 框架與架構
1.1.4 重新定義架構
1.2 架構設計的目的
1.2.1 架構設計的誤區
1.2.2 以史為鑑
1.2.3 架構設計的真正目的
1.3 複雜度來源
1.3.1 高性能
1.3.2 高可用
1.3.3 可擴展性
1.3.4 低成本
1.3.5 安全
1.3.6 規模
1.4 本章小結
第2章 架構設計原則
2.1 合適原則
2.2 簡單原則
2.3 演化原則
2.4 本章小結
第3章 架構設計流程
3.1 有的放矢—識別複雜度
3.2 按圖索驥—設計備選方案
3.3 深思熟慮—評估和選擇備選方案
3.3.1 業務背景
3.3.2 備選方案設計
3.3.3 備選方案360度環評
3.4 精雕細琢—詳細方案設計
3.5 本章小結
第2部分 高性能架構模式
第4章 存儲高性能
4.1 關係資料庫
4.1.1 讀寫分離
4.1.2 分庫分表
4.1.3 實現方法
4.2 NoSQL
4.2.1 K-V存儲
4.2.2 文檔資料庫
4.2.3 列式資料庫
4.3 快取
4.3.1 快取穿透
4.3.2 快取雪崩
4.3.3 快取熱點
4.4 本章小結
第5章 計算高性能
5.1 單伺服器高性能
5.1.1 PPC
5.1.2 prefork
5.1.3 TPC
5.1.4 prethread
5.1.5 Reactor
5.1.6 Proactor
5.2 集群高性能
5.2.1 負載均衡分類
5.2.2 負載均衡架構
5.2.3 負載均衡的算法
5.3 本章小結
第3部分 高可用架構模式
第6章 CAP
6.1 CAP理論
6.1.1 一致性(Consistency)
6.1.2 可用性
6.1.3 分區容忍性(Partition Tolerance)
6.2 CAP套用
6.2.1 CP—Consistency/Partition Tolerance
6.2.2 AP—Availability/Partition Tolerance
6.3 CAP細節
6.4 ACID、BASE
6.4.1 ACID
6.4.2 BASE
6.5 本章小結
第7章 FMEA
7.1 FMEA介紹
7.2 FMEA方法
7.3 FMEA實戰
7.4 本章小結
第8章 存儲高可用
8.1 主備複製
8.1.1 基本實現
8.1.2 優缺點分析
8.2 主從複製
8.2.1 基本實現
8.2.2 優缺點分析
8.3 主備倒換與主從倒換
8.3.1 設計關鍵
8.3.2 常見架構
8.4 主主複製
8.5 數據集群
8.5.1 數據集中集群
8.5.2 數據分散集群
8.5.3 分散式事務算法
8.5.4 分散式一致性算法
8.6 數據分區
8.6.1 數據量
8.6.2 分區規則
8.6.3 複製規則
8.7 本章小結
第9章 計算高可用
9.1 主備
9.2 主從
9.3 對稱集群
9.4 非對稱集群
9.5 本章小結
第10章 業務高可用
10.1 異地多活
10.1.1 異地多活架構
10.1.2 異地多活設計技巧
10.1.3 異地多活設計步驟
10.2 接口級的故障應對方案
10.2.1 降級
10.2.2 熔斷
10.2.3 限流
10.2.4 排隊
10.3 本章小結
第4部分 可擴展架構模式
第11章 可擴展模式
11.1 可擴展概述
11.2 可擴展的基本思想
11.3 可擴展方式
11.4 本章小結
第12章 分層架構
12.1 分層架構類型
12.2 分層架構詳解
12.3 本章小結
13.1 SOA歷史
13.2 SOA詳解
13.3 本章小結
第14章 微服務
14.1 微服務歷史
14.2 微服務與SOA的關係
14.3 微服務的陷阱
14.4 微服務最佳實踐
14.4.1 服務粒度
14.4.2 拆分方法
14.4.3 基礎設施
14.5 本章小結
第15章 微核心架構
15.1 基本概念
15.2 設計關鍵點
15.3 OSGi架構簡析
15.4 規則引擎架構簡析
15.5 本章小結
第5部分 架構實戰
第16章 訊息佇列設計實戰
16.1 需求
16.2 設計流程
16.2.1 識別複雜度
16.2.2 設計備選方案
16.2.3 評估和選擇備選方案
16.2.4 細化方案
16.3 本章小結
第17章 網際網路架構演進
17.1 技術演進
17.1.1 技術演進的動力
17.1.2 淘寶
17.1.3 手機QQ
17.1.4 微信
17.2 技術演進的模式
17.3 網際網路業務發展
17.3.1 業務複雜性
17.3.2 用戶規模
17.3.3 量變到質變
17.4 本章小結
第18章 網際網路架構模板
18.1 總體結構
18.2 存儲層技術
18.2.1 SQL
18.2.2 NoSQL
18.2.3 小檔案存儲
18.2.4 大檔案存儲
18.3 開發層技術
18.3.1 開發框架
18.3.2 Web伺服器
18.3.3 容器
18.4 服務層技術
18.4.1 配置中心
18.4.2 服務中心
18.4.3 訊息佇列
18.5 網路層技術
18.5.1 負載均衡
18.5.2 CDN
18.5.3 多機房
18.5.4 多中心
18.6 用戶層技術
18.6.1 用戶管理
18.6.2 訊息推送
18.6.3 存儲雲與圖片雲
18.7 業務層技術
18.8 平台技術
18.8.1 運維平台
18.8.2 測試平台
18.8.3 數據平台
18.8.4 管理平台
18.9 本章小結
第19章 架構重構
19.1 有的放矢
19.2 合縱連橫
19.2.1 合縱
19.2.2 連橫
19.3 運籌帷幄
19.4 文武雙全—項目管理+技術能力
19.5 本章小結
第20章 開源系統
20.1 選:如何選擇一個開源項目
20.1.1 聚焦是否滿足業務
20.1.2 聚焦是否成熟
20.1.3 聚焦運維能力
20.2 用:如何使用開源方案
20.2.1 深入研究,仔細測試
20.2.3 做好應急,以防萬一
20.3 改:如何基於開源項目做二次開發
20.3.1 保持純潔,加以包裝
20.3.2 發明你要的輪子
20.4 本章小結
作者簡介
阿里巴巴資深技術專家
專注於Java、Linux、MySQL、開源技術、系統分析、架構設計,熱愛技術,CSDN社區之星,CSDN部落格認證專家,UC資深軟體工程師
前言
為什麼寫這本書
每個程式設計師心中都有一個成為架構師的夢想,夢想是美好的,但道路是曲折的。
我在2006年開始參與架構設計,原本以為學習架構設計就像學習一門程式語言一樣,先學習基本的語法,再研究細節和原理,然後實踐一下就能夠快速掌握。但真正實踐後才發現,架構設計的難度和複雜度要高很多。從最早開始接觸架構設計,到自我感覺初步完整掌握架構設計,至少花費了6年時間。等到自我感覺徹底掌握架構設計的精髓,至少花費了8年時間(當然,在這個過程中我不是一直在做架構設計)。
我曾經以為是自己天資愚笨才會這樣,後來我帶了團隊,看到幾乎每個程式設計師在嘗試架構設計的時候,都面臨著我遇到過的各種困惑和瓶頸。特別是我作為職業等級晉升評審的時候,發現很多同學技術能力很強,業務也不錯,但卻卡在了架構設計這部分。我意識到這應該不是個人天資的問題,而是架構設計本身的一些特性導致的。
我總結了幾個架構設計相關的特性。
1. 架構設計的思維和程式設計的思維差異很大。
架構設計的關鍵思維是判斷和取捨,程式設計的關鍵思維是邏輯和實現。很多程式設計師在轉變為架構師後,很難一開始就意識到這個差異,還是按照寫代碼的方式去思考架構,這樣會導致很多困惑。
2. 架構設計沒有體系化的培訓和訓練機制。
大學的課程幾乎沒有架構設計相關的課程,架構設計的書籍更多也只是關注某個架構設計點,沒有體系化的架構設計書籍,導致程式設計師在學習上沒有明確的指導,只能自己慢慢摸索,效率低,容易踩坑。
3. 程式設計師對架構設計的理解存在很多誤區。
例如,要成為架構師必須要有很強的技術天分;架構師必須有很強的創造力;架構設計必須要高大上才能體現架構師能力;架構一定要具備高可用、高性能……這些似是而非的誤區讓很多技術人員望而生畏,還沒嘗試就已經放棄了。
得益於移動網際網路技術的快速發展,我有很多機會直接參與架構設計,這些架構背後的業務形形色色,包括社交、電商、遊戲、中間件、內部運營系統;用到的技術棧差異也比較大,包括PHP、Java、C++等。雖然每次架構設計對我來說都是一個新的挑戰,但正好也提供了非常好的機會,讓我親身體驗不同的架構設計。在這個過程中,我不斷學習、思考、實踐、總結、改進、交流,逐步形成了自己的一套架構設計方法論。
有了這套方法論後,首先,我在做架構設計的時候遊刃有餘,不管什麼樣的業務,不管什麼樣的技術,按照這套方法論都能夠設計出優秀的架構,在職業等級面評的時候,就算我之前從來沒有接觸過對方的業務,也能快速理解對方描述的架構和發現其中做得好或不好的地方;其次,在指導其他同事的時候思路很清晰,容易理解,效果明顯。原來對架構設計比較迷茫的同學,通過幾次結合案例進行方法論培訓,都能夠很快地掌握這套方法論並在實踐中套用。甚至有很多其他業務線的同學,遇到架構設計的困惑,也來找我交流和指導,按照這套架構設計方法論的指導,能夠較快地理清架構設計的思路。
本書的主要出發點就是將這套架構設計方法論分享給更多熱愛技術、有架構師夢想的技術人員,降低架構學習的成本,減少架構學習過程中走的彎路,助力大家更快地實現自己的架構師夢想。
本書內容已經在“極客時間”App上開設了“從0開始學架構”的專欄,訂閱人數已經超過25000人,成為“極客時間”最受歡迎的專欄,能夠得到這么多技術朋友的信任,相信書中的內容一定會讓你有所收穫。
本書的主要內容
本書涵蓋了我的整套架構設計方法論和架構實踐,主要包括以下內容。
架構基礎:先介紹架構設計的本質、歷史背景和目的,然後從複雜度來源,以及架構設計的原則和流程來詳細介紹架構基礎。
高性能架構模式:從存儲高性能、計算高性能方面介紹幾種設計方案的典型特徵和套用場景。
高可用架構模式:介紹CAP原理、FMEA分析方法,分析常見的高可用存儲架構和高可用計算架構,並給出一些設計方法和技巧。
可擴展架構模式:介紹可擴展模式及其基本思想,分析一些常見架構模式。
架構實戰:將理論和案例結合,落地前面提到的架構原則、架構流程和架構模式。
本書適合的對象
有一定的編程基礎的軟體開發工程師。
對架構設計有興趣的技術人員。例如,測試、運維等崗位的人員。
有初步的架構設計經驗,但需要繼續提升的技術人員。
勘誤與支持
因個人水平有限,且架構設計整體涵蓋的技術範圍很廣,技術深度很深,書中難免有不足之處,還望讀者批評指正。如果你對本書有比較好的建議或對書中內容有所疑惑,可與我聯繫。
致謝
首先感謝王行雲、胡晏秋、陳俊良、張怡炘等同事對本書的勘誤和審核,幫助完善了本書的很多細節和內容。
其次感謝家人的支持,在寫書的過程中父母、妻子承擔了家庭的重任,讓我能夠安心寫作。
特別感謝陳曉猛編輯,本書在他不斷督促下才最終寫完初稿,後期他耐心地指導、審稿、修改,最終才有了本書的誕生。
特別感謝極客時間架構專欄團隊郭蕾、何瀟、周君鳳等負責人,打造了一個非常成功的架構專欄,他們的高要求也讓整體內容更加完善、更加優質。
特別感謝高效運維創始人蕭田國、特贊科技CTO黃勇、騰訊雲高級總監熊普江、貝殼金服 2B2C CTO史海峰、資深技術專家於君澤(右軍)、21CTO社區創始人杜江(洛逸)幾位專家對本書的推薦。