Spring Cloud(零)《總有一偏概述告訴你SpringCloud是什么》
前言介紹

為了更好的實現領域驅動設計的落地,不僅要在設計思路上做到領域職責清晰、系統邊界明確,還需要使用到spring Boot、spring Cloud框架服務體系來更好的構建微服務。后續部分章節將針對Spring Cloud的使用以及有益于構建微服務的知識技能做系列案例整理,以最終完成架構設計專題案例。網上不免有很多優秀的文章,但為了系統的學習更需要事必躬親,親力親為。
內容概述
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 風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
微服務與SpringCloud
微服務的概念源于Martin Fowler于2014年3月25日寫的一篇文章https://martinfowler.com/articles/microservices.html
微服務架構模式(Microservices Architecture Pattern)的目的是將大型的、復雜的、長期運行的應用程序構建為一組相互配合的服務,每個服務都可以很容易得局部改良。 Micro 這個詞意味著每個服務都應該足夠小,但是,這里的小不能用代碼量來比較,而應該是從業務邏輯上比較 —— 符合 SRP(單一職責) 原則的才叫微服務。
設計模式六大原則
單一職責原則
里氏替換原則
依賴倒置原則
接口隔離原則
迪米特原則
開閉原則
關于微服務的一個形象表達:
X軸:運行多個負載均衡器之后的運行實例
Y軸:將應用進一步分解為微服務(分庫)
Z軸:大數據量時,將服務分區(分表)
而Spring Cloud是Spring為微服務架構思想做的一個一站式實現。從某種程度是可以簡單的理解為,微服務是一個概念、一個項目開發的架構思想。Spring Cloud 是微服務架構的一種 Java 實現。
簡單來說,服務化的核心就是將傳統的一站式應用根據業務拆分成一個一個的服務,而微服務在這個基礎上要更徹底地去耦合(不再共享 DB、KV,去掉重量級 ESB),并且強調 DevOps 和快速演化。這就要求我們必須采用與一站式時代、泛 SOA 時代不同的技術棧,而 Spring Cloud 就是其中的佼佼者。
DevOps 是英文 Development 和 Operations 的合體,他要求開發、測試、運維進行一體化的合作,進行更小、更頻繁、更自動化的應用發布,以及圍繞應用架構來構建基礎設施的架構。這就要求應用充分的內聚,也方便運維和管理。這個理念與微服務理念不謀而合。
使用微服務架構的好處
復雜度可控:在將應用分解的同時,規避了原本復雜度無止境的積累。每一個微服務專注于單一功能,并通過定義良好的接口清晰表述服務邊界。由于體積小、復雜度低,每個微服務可由一個小規模開發團隊完全掌控,易于保持高可維護性和開發效率。
獨立部署:由于微服務具備獨立的運行進程,所以每個微服務也可以獨立部署。當某個微服務發生變更時無需編譯、部署整個應用。由微服務組成的應用相當于具備一系列可并行的發布流程,使得發布更加高效,同時降低對生產環境所造成的風險,最終縮短應用交付周期。
技術選型靈活:微服務架構下,技術選型是去中心化的。每個團隊可以根據自身服務的需求和行業發展的現狀,自由選擇最適合的技術棧。由于每個微服務相對簡單,故需要對技術棧進行升級時所面臨的風險就較低,甚至完全重構一個微服務也是可行的。
容錯高:當某一組建發生故障時,在單一進程的傳統架構下,故障很有可能在進程內擴散,形成應用全局性的不可用。在微服務架構下,故障會被隔離在單個服務中。若設計良好,其他服務可通過重試、平穩退化等機制實現應用層面的容錯。
可擴展:每個服務可以各自進行 x 擴展和 z 擴展,而且,每個服務可以根據自己的需要部署到合適的硬件服務器上。當應用的不同組件在擴展需求上存在差異時,微服務架構便體現出其靈活性,因為每個服務可以根據實際需求獨立進行擴展。
Spring Cloud 技術總覽
服務治理:這是 Spring Cloud 的核心。目前 Spring Cloud 主要通過整合 Netflix 的相關產品來實現這方面的功能(Spring Cloud Netflix),包括用于服務注冊和發現的 Eureka,調用斷路器 Hystrix,調用端負載均衡 Ribbon,Rest 客戶端 Feign,智能服務路由 Zuul,用于監控數據收集和展示的 Spectator、Servo、Atlas,用于配置讀取的 Archaius 和提供 Controller 層 Reactive 封裝的 RxJava。除此之外,針對于服務的注冊和發現,除了 Eureka,Spring Cloud 也整合了 Consul 和 Zookeeper 作為備選,但是因為這兩個方案在 CAP 理論上都遵循 CP 而不是 AP(下一篇會詳細介紹這點),所以官方并沒有推薦使用。
分布式鏈路監控:Spring Cloud Sleuth 提供了全自動、可配置的數據埋點,以收集微服務調用鏈路上的性能數據,并發送給 Zipkin 進行存儲、統計和展示。
消息組件:Spring Cloud Stream 對于分布式消息的各種需求進行了抽象,包括發布訂閱、分組消費、消息分片等功能,實現了微服務之間的異步通信。Spring Cloud Stream 也集成了第三方的 RabbitMQ 和 Apache Kafka 作為消息隊列的實現。而 Spring Cloud Bus 基于 Spring Cloud Stream,主要提供了服務間的事件通信(比如刷新配置)。
配置中心:基于 Spring Cloud Netflix 和 Spring Cloud Bus,Spring 又提供了 Spring Cloud Config,實現了配置集中管理、動態刷新的配置中心概念。配置通過 Git 或者簡單文件來存儲,支持加解密。
安全控制:Spring Cloud Security 基于 OAuth2 這個開放網絡的安全標準,提供了微服務環境下的單點登錄、資源授權、令牌管理等功能。
命令行工具:Spring Cloud Cli 提供了以命令行和腳本的方式來管理微服務及 Spring Cloud 組件的方式。
集群工具:Spring Cloud Cluster 提供了集群選主、分布式鎖(暫未實現)、一次性令牌(暫未實現)等分布式集群需要的技術組件。
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 各個組件相互配合,合作支持了一套完整的微服務架構。
其中 Eureka 負責服務的注冊與發現,很好將各服務連接起來
Hystrix 負責監控服務之間的調用情況,連續多次失敗進行熔斷保護
Hystrix dashboard,Turbine 負責監控 Hystrix 的熔斷情況,并給予圖形化的展示
Spring Cloud Config 提供了統一的配置中心服務
當配置文件發生變化的時候,Spring Cloud Bus 負責通知各服務去獲取最新的配置信息
所有對外的請求和服務,我們都通過 Zuul 來進行轉發,起到 API 網關的作用
最后我們使用 Sleuth+Zipkin 將所有的請求數據記錄下來,方便我們進行后續分析
Spring Spring Cloud 微服務
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。