爲了更好的實現領域驅動設計的落地,不只要在設計思路上作到領域職責清晰、系統邊界明確,還須要使用到Spring Boot、Spring Cloud框架服務體系來更好的構建微服務。後續部分章節將針對Spring Cloud的使用以及有益於構建微服務的知識技能作系列案例整理,以最終完成架構設計專題案例。網上難免有不少優秀的文章,但爲了系統的學習更須要事必躬親,親力親爲。html
Built directly on Spring Boot's innovative approach to enterprise Java, Spring Cloud simplifies distributed, microservice-style architecture by implementing proven patterns to bring resilience, reliability, and coordination to your microservices.
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用 Spring Boot 的開發風格作到一鍵啓動和部署。Spring 並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過 Spring Boot 風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。前端
微服務的概念源於Martin Fowler於2014年3月25日寫的一篇文章https://martinfowler.com/arti...git
微服務架構模式(Microservices Architecture Pattern)的目的是將大型的、複雜的、長期運行的應用程序構建爲一組相互配合的服務,每一個服務均可以很容易得局部改良。 Micro 這個詞意味着每一個服務都應該足夠小,可是,這裏的小不能用代碼量來比較,而應該是從業務邏輯上比較 —— 符合 SRP(單一職責) 原則的才叫微服務。spring
設計模式六大原則
關於微服務的一個形象表達:
數據庫
X軸:運行多個負載均衡器以後的運行實例
Y軸:將應用進一步分解爲微服務(分庫)
Z軸:大數據量時,將服務分區(分表)後端
而Spring Cloud是Spring爲微服務架構思想作的一個一站式實現。從某種程度是能夠簡單的理解爲,微服務是一個概念、一個項目開發的架構思想。Spring Cloud 是微服務架構的一種 Java 實現。設計模式
簡單來講,服務化的核心就是將傳統的一站式應用根據業務拆分紅一個一個的服務,而微服務在這個基礎上要更完全地去耦合(再也不共享 DB、KV,去掉重量級 ESB),而且強調 DevOps 和快速演化。這就要求咱們必須採用與一站式時代、泛 SOA 時代不一樣的技術棧,而 Spring Cloud 就是其中的佼佼者。緩存
DevOps 是英文 Development 和 Operations 的合體,他要求開發、測試、運維進行一體化的合做,進行更小、更頻繁、更自動化的應用發佈,以及圍繞應用架構來構建基礎設施的架構。這就要求應用充分的內聚,也方便運維和管理。這個理念與微服務理念不謀而合。
複雜度可控:在將應用分解的同時,規避了本來複雜度無止境的積累。每個微服務專一於單一功能,並經過定義良好的接口清晰表述服務邊界。因爲體積小、複雜度低,每一個微服務可由一個小規模開發團隊徹底掌控,易於保持高可維護性和開發效率。安全
獨立部署:因爲微服務具有獨立的運行進程,因此每一個微服務也能夠獨立部署。當某個微服務發生變動時無需編譯、部署整個應用。由微服務組成的應用至關於具有一系列可並行的發佈流程,使得發佈更加高效,同時下降對生產環境所形成的風險,最終縮短應用交付週期。服務器
技術選型靈活:微服務架構下,技術選型是去中心化的。每一個團隊能夠根據自身服務的需求和行業發展的現狀,自由選擇最適合的技術棧。因爲每一個微服務相對簡單,故須要對技術棧進行升級時所面臨的風險就較低,甚至徹底重構一個微服務也是可行的。
容錯高:當某一組建發生故障時,在單一進程的傳統架構下,故障頗有可能在進程內擴散,造成應用全局性的不可用。在微服務架構下,故障會被隔離在單個服務中。若設計良好,其餘服務可經過重試、平穩退化等機制實現應用層面的容錯。
可擴展:每一個服務能夠各自進行 x 擴展和 z 擴展,並且,每一個服務能夠根據本身的須要部署到合適的硬件服務器上。當應用的不一樣組件在擴展需求上存在差別時,微服務架構便體現出其靈活性,由於每一個服務能夠根據實際需求獨立進行擴展。
Eureka
Eureka 是 Netflix 開源的一款提供服務註冊和發現的產品,它提供了完整的 Service Registry 和 Service Discovery 實現。也是 Spring Cloud 體系中最重要最核心的組件之一。它將全部的能夠提供的服務都註冊到它這裏來管理,其它各調用者須要的時候去註冊中心獲取,而後再進行調用,避免了服務之間的直接調用,方便後續的水平擴展、故障轉移等。
Hystrix
在微服務架構中一般會有多個服務層調用,基礎服務的故障可能會致使級聯故障,進而形成整個系統不可用的狀況,這種現象被稱爲服務雪崩效應。服務雪崩效應是一種因 「服務提供者」 的不可用致使 「服務消費者」 的不可用,並將不可用逐漸放大的過程。
Hystrix Dashboard 和 Turbine
當熔斷髮生的時候須要迅速的響應來解決問題,避免故障進一步擴散,那麼對熔斷的監控就變得很是重要。熔斷的監控如今有兩款工具:Hystrix-dashboard 和 Turbine
Hystrix-dashboard 是一款針對 Hystrix 進行實時監控的工具,經過 Hystrix Dashboard 咱們能夠直觀地看到各 Hystrix Command 的請求響應時間,請求成功率等數據。可是隻使用 Hystrix Dashboard 的話,你只能看到單個應用內的服務信息,這明顯不夠。咱們須要一個工具能讓咱們彙總系統內多個服務的數據並顯示到 Hystrix Dashboard 上,這個工具就是 Turbine.
Spring Cloud Config
隨着微服務不斷的增多,每一個微服務都有本身對應的配置文件。在研發過程當中有測試環境、UAT 環境、生產環境,所以每一個微服務又對應至少三個不一樣環境的配置文件。這麼多的配置文件,若是須要修改某個公共服務的配置信息,如:緩存、數據庫等,不免會產生混亂,這個時候就須要引入 Spring Cloud 另一個組件:Spring Cloud Config。
Spring Cloud Config 是一個解決分佈式系統的配置管理方案。它包含了 Client 和 Server 兩個部分,Server 提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,Client 經過接口獲取數據、並依據此數據初始化本身的應用。
其實就是 Server 端將全部的配置文件服務化,須要配置文件的服務實例去 Config Server 獲取對應的數據。將全部的配置文件統一整理,避免了配置文件碎片化。配置中心 git 實例參考:配置中心 git 示例;
若是服務運行期間改變配置文件,服務是不會獲得最新的配置信息,須要解決這個問題就須要引入 Refresh。能夠在服務的運行期間從新加載配置文件,具體能夠參考這篇文章:配置中心 svn 示例和 refresh
當全部的配置文件都存儲在配置中心的時候,配置中心就成爲了一個很是重要的組件。若是配置中心出現問題將會致使災難性的後果,所以在生產中建議對配置中心作集羣,來支持配置中心高可用性。
Spring Cloud Bus
上面的 Refresh 方案雖然能夠解決單個微服務運行期間重載配置信息的問題,可是在真正的實踐生產中,可能會有 N 多的服務須要更新配置,若是每次依靠手動 Refresh 將是一個巨大的工做量,這時候 Spring Cloud 提出了另一個解決方案:Spring Cloud Bus
Spring Cloud Bus 經過輕量消息代理鏈接各個分佈的節點。這會用在廣播狀態的變化(例如配置變化)或者其它的消息指令中。Spring Cloud Bus 的一個核心思想是經過分佈式的啓動器對 Spring Boot 應用進行擴展,也能夠用來創建一個或多個應用之間的通訊頻道。目前惟一實現的方式是用 AMQP 消息代理做爲通道。
Spring Cloud Bus 是輕量級的通信組件,也能夠用在其它相似的場景中。有了 Spring Cloud Bus 以後,當咱們改變配置文件提交到版本庫中時,會自動的觸發對應實例的 Refresh,
Spring Cloud Zuul
在微服務架構模式下,後端服務的實例數通常是動態的,對於客戶端而言很難發現動態改變的服務實例的訪問地址信息。所以在基於微服務的項目中爲了簡化前端的調用邏輯,一般會引入 API Gateway 做爲輕量級網關,同時 API Gateway 中也會實現相關的認證邏輯從而簡化內部服務之間相互調用的複雜度。
Spring Cloud 體系中支持 API Gateway 落地的技術就是 Zuul。Spring Cloud Zuul 路由是微服務架構中不可或缺的一部分,提供動態路由,監控,彈性,安全等的邊緣服務。Zuul 是 Netflix 出品的一個基於 JVM 路由和服務端的負載均衡器。
它的具體做用就是服務轉發,接收並轉發全部內外部的客戶端調用。使用 Zuul 能夠做爲資源的統一訪問入口,同時也能夠在網關作一些權限校驗等相似的功能。
鏈路跟蹤
隨着服務的愈來愈多,對調用鏈的分析會愈來愈複雜,如服務之間的調用關係、某個請求對應的調用鏈、調用之間消費的時間等,對這些信息進行監控就成爲一個問題。在實際的使用中咱們須要監控服務和服務之間通信的各項指標,這些數據將是咱們改進系統架構的主要依據。所以分佈式的鏈路跟蹤就變的很是重要,Spring Cloud 也給出了具體的解決方案:Spring Cloud Sleuth 和 Zipkin
Spring Cloud Sleuth 爲服務之間調用提供鏈路追蹤。經過 Sleuth 能夠很清楚的瞭解到一個服務請求通過了哪些服務,每一個服務處理花費了多長時間。從而讓咱們能夠很方便的理清各微服務間的調用關係。
Zipkin 是 Twitter 的一個開源項目,容許開發者收集 Twitter 各個服務上的監控數據,並提供查詢接口
分佈式鏈路跟蹤須要 Sleuth+Zipkin 結合來實現
Spring Cloud 各個組件如何來配套使用:
從上圖能夠看出 Spring Cloud 各個組件相互配合,合做支持了一套完整的微服務架構。