在 Kubernetes 這類雲原生平台上,最流行的應用架構是微服務(microservices)風格。這種軟體開發技術透過將商業能力模組化來對付軟體複雜度,本質上是拿開發複雜度去換維運複雜度。
伴隨微服務運動,出現了大量理論與輔助技術,教你如何從零打造微服務、或把單體(monolith)切分成微服務。這些實踐大多建立在 Evans(Eric Evans)的《Domain-Driven Design》(Addison-Wesley)之上,核心是受限脈絡(bounded context)與聚合(aggregate):受限脈絡把龐大的模型切分成不同元件來處理;聚合則進一步把受限脈絡歸併成具有明確交易邊界的模組。
但除了這些商業領域層面的考量之外,任何分散式系統——無論是否基於微服務——都還有大量圍繞組織方式、結構與執行期行為的技術性問題。容器與 Kubernetes 這類容器編排器,正是為了處理這些分散式應用的問題,提供了許多新的原語(primitive)與抽象。
容器裡裝了什麼,決定了一切#
本書全篇把容器當作黑盒子來看待容器與平台的互動。但這一節要特別強調容器裡放進了什麼有多重要。
容器與雲原生平台確實為分散式應用帶來巨大好處,但如果你往容器裡塞的是垃圾,你得到的只會是大規模的分散式垃圾。

圖 1-1:通往雲原生之路——打造良好雲原生應用所需的技能組合
四個抽象層次#
宏觀來看,一個雲原生應用存在多個抽象層次,每一層都需要不同的設計考量:
程式碼層(最底層):你定義的每個變數、寫的每個方法、決定實例化的每個類別,都影響應用的長期可維護性。無論用什麼容器技術與編排平台,開發團隊與他們產出的成品才是影響最大的因素。因此要培養這樣的開發者:致力於寫出乾淨的程式碼、有適量的自動化測試、持續重構以改善品質,骨子裡是軟體工匠。
領域驅動設計(Domain-Driven Design):從商業視角切入軟體設計,讓架構盡可能貼近真實世界。這套方法在物件導向語言上效果最好,但要為真實問題建模與設計,也還有其他好途徑。一個具備正確商業與交易邊界、易於使用的介面、豐富 API 的模型,才是日後成功容器化與自動化的基礎。
微服務架構風格:它極快地演變成常態,為設計「會持續變動的分散式應用」提供了寶貴的原則與實踐。套用這些原則,能讓你的實作在規模、韌性與變更速度上得到最佳化——而這正是當代軟體的共同需求。
容器與雲原生:容器很快就成為封裝與執行分散式應用的標準做法。建立模組化、可重用、稱職的雲原生容器是另一個根本前提。當組織內的容器數量不斷成長,就需要更有效的方法與工具來管理它們。「雲原生」是一個相對新的詞彙,用來描述大規模自動化容器化微服務的原則、模式與工具。本書將雲原生與 Kubernetes 交替使用,因為後者是當今最流行的開源雲原生平台。
本書不涵蓋乾淨程式碼、領域驅動設計或微服務本身,只聚焦於處理容器編排問題的模式與實踐。但這些模式要能發揮效果,你的應用必須先從內部被設計好——透過乾淨程式碼實踐、領域驅動設計、微服務模式與其他相關設計技術。