推 薦 序
很多時候人們常常把軟件架構和建築學做類比,兩者的英語原文都是Architect。Architect這個詞源於建築學,後來被軟件領域采用。雖然軟件領域和建築領域中的“架構”一詞在概念層面有著相似性,但是到了實際落地層面,兩者卻是截然不同的。
建築領域中的“架構”是從一開始就設計好了的,後面的施工建設隻是依據這個架構圖紙去一比一地實現。需要多少塊磚、需要多少資源都是事先可以精確預估的。然而,軟件領域中的“架構”更像是一種設計哲學,或者說是一種設計藝術,即使采用相同的架構設計理念,最後實現的代碼也可能會完全不同。因此,我在各種公開場合都一直強調“軟件的架構從來不是設計出來的,而是生長出來的”。
縱觀歷史,軟件架構的發展經歷了很多裡程碑,從早期的單體架構,到後來的分層架構,再到SOA、微服務,以及下一代微服務技術——服務網格(Service Mesh)。每一次的架構迭代都是為了解決之前架構設計中的“坑”。可以說,軟件架構的迭代歷史就是一部不折不扣的“挖坑和填坑”的歷史。
時至今日,微服務架構早已從概念階段走到了有大量應用的巔峰階段。從技術層面上講,Spring Cloud、Docker和Kubernetes已經成為事實上的標杆;從商業層面上講,微服務架構也已經實現了“利用技術上的確定性來應對業務端的不確定性”這一關鍵目標。作為新時代的軟件研發人員,不管你是從一開始就使用微服務,還是從原本的分布式架構向微服務架構轉型,都非常有必要深入學習微服務落地實踐的方方面面。因此,我們急需一本理論與實踐相結合,能夠結合實際案例講解的圖書。本書的出版可以說填補了這一空缺。
當我拿到這本書的樣章時,有一種驚喜的感覺,因為這是目前為數不多的由國人出品的面向初學者的微服務架構實戰類圖書。當我懷著欣喜的心情讀了本書的部分章節後,不僅感受到幾位作者多年來對微服務架構在實際項目中落地的深刻理解和認識,而且發現這是一本學習曲線非常平滑,但又不失技術先進性和工程實戰性的微服務實戰好書。
其實,市面上各自講解Spring Cloud、Docker和Kubernetes的書不在少數,但是本書使用了一個貫穿全書的優惠券實戰項目,通過實際項目的需求驅動方式,將Spring Boot、Spring Cloud的核心知識點與Docker容器技術及容器編排領域的標杆Kubernetes結合,做到了技術路徑上的一脈相承。
本書既有理論體繫上庖丁解牛、細致入微的分析和講解,又有面向初學者的實戰技術指導和具體實踐說明,從而讓讀者對企業落地微服務架構的方案與最佳實踐有了一個更全面、更體繫化的認識。可以說,本書是軟件開發人員繫統性地認識微服務架構、實踐微服務架構“躬身入局”的必讀佳作。
茹炳晟
騰訊 技術工程事業群 基礎架構部 T4級專家
騰訊研究院 特約研究員
前言
寫作初衷
在這裡,筆者想和大家聊聊筆者與這本書的緣分。一個偶然的機會,編輯老師問筆者,是否有意願寫一本面向初學者的微服務與容器化的實戰圖書。編輯老師話雖短,但包含的信息量著實不小,既要介紹微服務和容器化的實用技術,又要讓初學者能夠讀懂,還要緊扣實戰。一番思索之後,筆者欣然應允。
自微服務架構的概念在2012年由Fred George提出以來,至今已經過了近十個年頭。在這期間,隨著互聯網和雲服務技術的蓬勃發展,微服務架構也逐漸從“陽春白雪”走入了“尋常百姓家”。Spring Cloud作為微服務領域的弄潮兒,利用Spring Boot提供的“開箱即用”的特性,極大地簡化了分布式繫統基礎設施的構建。借助Docker容器化技術和Kubernetes容器編排技術,我們可以輕松地實現微服務應用的跨平臺快速部署和彈性伸縮。Spring Cloud+Docker+Kubernetes的組合已經逐漸成為各大公司落地微服務架構的首選方案。
本書特色
新版本:針對Spring Cloud Hoxton.SR5版本+Spring Boot 2.2.x.RELEASE版本。
專注實踐:全書風格緊貼實戰,學練結合。通過一個優惠券實戰項目貫穿全書章節,帶讀者體驗將單體應用逐步改造為微服務應用的全過程。
技術全面:實戰案例涵蓋了Spring Boot、Spring Cloud核心組件庫和容器化技術的知識點,介紹了Spring Boot的核心功能和服務治理組件Eureka及Nacos,講解了Spring Cloud的第二代網關組件Spring Cloud Gateway、負載均衡組件Ribbon、服務間調用組件OpenFeign、配置中心組件Spring Cloud Config、批量消息推送組件Bus、服務容錯組件Hystrix+Turbine+Dashboard、防流量哨兵組件Sentinel、鏈路追蹤組件Sleuth+Zipkin+ELK、消息驅動組件Stream,分析了分布式事務框架Seata和用於DevOps實踐的Docker容器化技術、Kubernetes容器編排技術及下一代微服務技術Service Mesh。
低門檻:本書為初學者構建了非常友好的學習曲線,通過實戰項目手把手帶讀者從Spring Boot應用的核心功能模塊入手,逐漸過渡到微服務和容器化部分。
深入剖析:對於書中的知識點,通過實戰案例向讀者展示業界主流的微服務架構最佳實踐。
適用讀者
本書適合具備一定Java基礎的開發人員及對微服務架構和Spring Cloud技術、容器編排技術感興趣的讀者。對處在微服務架構轉型期的團隊來說,本書具有很大的實踐指導價值。
本書內容
本書共22章,每章的具體內容如下:
第1章:熱身運動。
這一章主要介紹了在進行Spring Boot開發之前所需的準備工作,例如相關常識的介紹、常規軟件的安裝和開發環境的搭建等,此後再通過幾個例子介紹了Java Web應用開發的進化史。
第2章:Spring Boot介紹。
這一章首先簡單介紹了Spring框架的歷史並穿插了一些業界趣聞,然後講解了Spring框架的基石技術IoC、AOP及Spring主要組件,接著解釋了Spring Boot出現的契機及原因,最後重點介紹了Spring Boot的工作原理、組件及如何利用Spring Boot進行應用開發。
第3章:Spring Boot實戰。
這一章主要通過優惠券項目細致地講解了如何基於Spring Boot進行項目實戰開發,先用Spring Boot構建應用的核心功能,再循序漸進地引入更多主流開源軟件與項目集成,以實現更豐富的應用功能來應對各種各樣的開發場景。
第4章:微服務與Spring Cloud。
這一章首先介紹微服務架構的理念及服務拆分規範,然後介紹目前一線大廠的服務治理方案,接著介紹Spring Cloud及Netflix組件庫和Alibaba組件庫,最後介紹實戰項目中采用的微服務技術選型方案。
第5章:使用Eureka實現服務治理。
這一章首先向讀者介紹服務治理的概念和Spring Cloud中常用的服務注冊中心,然後著重介紹Eureka的核心概念和微服務生命周期的管理流程,最後通過實戰項目落地一套高可用化的注冊中心方案。
第6章:使用Nacos實現服務治理。
這一章首先介紹如何安裝Nacos,並對Eureka和Nacos做了簡單比較,最後演示了如何使用Nacos實現服務治理。
第7章:使用Ribbon實現負載均衡。
這一章介紹了負載均衡的基本概念,並針對Ribbon內置的負載均衡策略及各個負載均衡策略適用的業務場景,探討了Ribbon的IPing機制,最後通過將Ribbon集成到實戰案例來鞏固學習效果。
第8章:使用OpenFeign實現服務間調用。
在這一章中,為了避免煩瑣的REST API調用流程,我們通過Feign組件實現了一種類似於“本體方法調用”的簡易步驟,我們隻需要定義一個Feign接口,就可以將該接口注入Java類中實現遠程REST API調用。我們還深入介紹了Feign組件的工作原理,以及Feign的超時配置和數據壓縮配置。
第9章:使用Hystrix實現服務間容錯。
這一章通過一個“服務雪崩”的例子來理解服務容錯的幾種常規手段,進而學習Hystrix如何通過服務降級、服務熔斷和線程隔離的方式實現服務容錯。在這個過程中,我們還介紹了Hystrix的兩個好搭檔,即分別用來聚合服務調用數據的Turbine和服務大盤監控組件的Hystrix Dashboard。
第10章:使用Sentinel實現限流控制。
這一章首先介紹了如何安裝Sentinel,再介紹了Hystrix和Sentinel之間的異同,最後演示了如何使用Sentinel在不同場景下對服務進行限流控制。
第11章:使用Spring Cloud Config和Bus搭建配置中心。
這一章首先介紹了分布式配置中心在微服務架構中的用途,然後落地了一套Spring Cloud Config+GitHub的遠程配置中心,最後通過集成Bus組件實現了配置項的動態推送。在這個過程中,我們還介紹了如何對配置中心進行高可用化改造,以及如何使用對稱密鑰和非對稱密鑰將敏感信息進行加密存儲。
第12章:使用Spring Cloud Gateway搭建服務網關。
這一章介紹了Spring Cloud的第二代網關組件Spring Cloud Gateway,它與Nginx這類外部網關不同,Spring Cloud Gateway主要用來承接經由外部網關導向微服務集群的服務請求,並基於這些服務請求的路徑及參數等信息做服務轉發。除了介紹如何設置請求轉發規則,我們還介紹了如何在網關層添加過濾器和限流規則(底層采用Redis+Lua實現限流)。
第13章:使用Sleuth進行調用鏈路追蹤。
在一個大型微服務繫統中完成一個復雜的業務流程可能需要調用數十個微服務模塊,從調用鏈分析及線上故障排查的角度來看,我們需要將每一次服務請求中的所有調用鏈路通過某種標記串聯起來。這一章介紹了一款調用鏈路“打標工具”Sleuth,通過對Sleuth底層數據結構的介紹使讀者了解它的工作原理,並將打標後的日志信息傳輸到Zipkin和ELK組件中,實現調用鏈路分析和日志檢索功能。
第14章:使用Stream集成消息隊列。
這一章介紹了如何通過Stream組件簡化微服務應用與消息隊列組件的對接,我們首先介紹了發布訂閱、消費組和消費分區三個重要場景,然後通過實際案例介紹了消息的異常處理手段,比如本機重試、消息重新入隊、降級流程和死信隊列,最後介紹了消息隊列的一個特殊場景“延遲消息”。
第15章:使用Seata實現分布式事務。
這一章首先介紹分布式事務的基本概念,再通過傳統的XA事務模式了解分布式事務所要解決的問題,了解XA模式在高並發場景下的性能瓶頸。然後,我們引出阿裡開源的Seata分布式事務框架,了解Seata內置的多種分布式事務解決方案。在這個過程中,我們重點學習Seata官方推薦的AT方案,深入學習AT方案的原理及讀寫隔離策略。最後,我們將AT方案集成到實戰項目中。
第16章:走進容器化的世界。
這一章是容器部分的起始章節,重點介紹了微服務落地的難點:高內聚和低耦合需求、異構部署需求、雲原生12因素、康威定律等,以及如何通過容器化技術來攻克難點。這一章縱向分析了容器技術的前世今生和未來展望,橫向比對了不同容器技術的差異和選擇。
第17章:Docker容器技術。
這一章從HelloWorld起步,介紹了Docker的安裝和容器的部署;講述了Docker的整體架構和核心概念,包括鏡像、容器、存儲、網絡、倉庫等;並以貫穿全書的優惠券項目為例,講解了微服務Docker容器化改造的實戰細節。
第18章:Kubernetes基礎。
這一章是容器部分的核心章節,從容器編排的概念到Kubernetes的整體框架,從Kubernetes的集群搭建到Pod、Controller、Namespace的控制管理,完整地闡述了Kubernetes容器編排的基礎。本章針對優惠券項目,講解了應該如何采用無狀態部署的方式進行應用容器的編排管理。
第19章:Kubernetes網絡互聯。
這一章介紹了Kubernetes的網絡互聯模型和主流的服務發現、負載均衡方式。本章針對優惠券項目,實戰了不同類型的應用部署和服務發現手段。
第20章:Kubernetes數據存儲。
這一章介紹了Kubernetes的數據存儲模型,以及Volume卷、ConfigMap和Secret的管理。本章針對優惠券項目講解了環境變量加載和應用磁盤掛載的實戰細節。
第21章:Kubernetes高級功能。
這一章從安全性、可用性、擴展性、易用性、可觀察性等多個角度描述了容器化部署的非功能性需求,並以優惠券項目為示範,實現了整套應用的高可用、彈性擴展和監控告警。
第22章:Service Mesh。
這一章的核心是微服務的非侵入式治理。本章重點描述了Service Mesh的興起和優勢、Istio框架的原理和架構,以及如何實現服務流量治理、服務安全增強、自動化監控追蹤。最後,以優惠券項目的全透明授權驗證和拓撲監控收尾。
第1章~第3章,第6章,第10章,作者卿睿;第4章,第5章,第7章~第9章,第11章~第15章,作者姚秋辰;第16章~第22章,作者張昕。
相關資源:
本書提供了一個GitHub項目供讀者學習和實踐,其中包括優惠券項目的所有源碼。若讀者在啟動項目的過程中遇到異常報錯,可以參考GitHub根目錄下的README文檔中的解決方案。具體下載方式可以參考下方(或封底)的讀者服務。
作 者
2021年9月1日
.