基於 Spring Cloud 的微服務架構分析

Spring Cloud 是一個相對比較新的微服務框架,2016 年才推出 1.0 的 release 版本. 雖然 Spring Cloud 時間最短, 但是相比 Dubbo 等 RPC 框架, Spring Cloud 提供的全套的分佈式系統解決方案。

Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用 Spring Boot 的開發風格做到一鍵啓動和部署。

Spring 並沒有重複製造輪子,它只是將目前各家公司 (主要是 Netflix) 開發的比較成熟、經得起實際考驗的服務框架組合起來,通過 Spring Boot 風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。

Spring Cloud 的核心組件


1. Eureka(註冊中心)

Eureka 是 Spring Cloud 微服務架構中的註冊中心,專門負責服務的註冊與發現, 裏面有一個註冊表, 保存了各個服務器的 機器和端口。

Eureka Server 的高可用實際上就是將自己作爲服務向其他註冊中心註冊自己,這樣就可以形成一組互相註冊的服務註冊中心,以實現服務清單的互相同步,達到高可用效果。

2. Zuul(服務網關)

Zuul 網關負責轉發請求給對應的服務,這個組件是負責網絡路由的。

Spring Cloud Zuul 通過與 Spring Cloud Eureka 進行整合,將自身註冊爲 Eureka 服務治理下的應用,同時從 Eureka 中獲得了所有其他微服務的實例信息

對於路由規則的維護,Zuul 默認會將通過以服務名作爲 ContextPath 的方式來創建路由映射

Zuul 提供了一套過濾器機制,可以支持在 API 網關無附上進行統一調用來對微服務接口做前置過濾,已實現對微服務接口的攔截和校驗

3. Ribbon(負載均衡)

提供雲端負載均衡,有多種負載均衡策略可供選擇,可配合服務發現和斷路器使用。

Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡器,它可以在通過客戶端中配置的ribbonServerList服務端列表去輪詢訪問以達到服務均衡的作用。

當 Ribbon 和 Eureka 聯合使用時,Ribbon 的服務實例清單RibbonServerList會被DiscoveryEnabledNIWSServerList重寫,擴展成從 Eureka 註冊中心中獲取服務端列表。同時它也會用NIWSDiscoveryPing來取代 IPing,它將職責委託給 Eureka 來去定服務端是否已經啓動

在客戶端負載均衡中,所有客戶端節點都維護着自己要訪問的服務端清單,而這些服務端的清單來自於服務註冊中心(比如 Eureka)。在客戶端負載均衡中也需要心跳去維護服務端清單的健康性,只是這個步驟需要與服務註冊中心配合完成。

通過 Spring Cloud Ribbon 的封裝,我們在微服務架構中使用客戶端負載均衡調用只需要如下兩步:

4. Hystrix(熔斷保護器)

熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點, 從而對延遲和故障提供更強大的容錯能力。
提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。

在微服務架構中,存在着那麼多的服務單元,若一個單元出現故障,就很容易因依賴關係而引發故障的蔓延,最終導致整個系統的癱瘓,這樣的架構相較傳統架構更加不穩定。爲了解決這樣的問題,產生了斷路器等一系列的服務保護機制

在分佈式架構中,當某個服務單元發生故障之後,通過斷路器的故障監控,向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延

Hystrix 具備服務降級、服務熔斷、線程和信號隔離、請求緩存、請求合併以及服務監控等強大功能

Hystrix 使用艙壁模式實現線程池的隔離,它會爲每一個依賴服務創建一個獨立的線程池,這樣就算某個依賴服務出現延遲過高的情況,也只是對該依賴服務的調用產生影響,而不會拖慢其他的依賴服務

5. Feign(REST 轉換器)

基於動態代理機制,根據註解和選擇的機器,拼接請求 url 地址,發起請求。Feign 的關鍵機制是使用了動態代理

Feign 是和 Ribbon 以及 Eureka 緊密協作的

6. Config(分佈式配置)

配置管理工具包,讓你可以把配置放到遠程服務器,集中化管理集羣配置,目前支持本地存儲、Git 以及 Subversion。

註冊中心與 API 網關的分析

微服務網關更多是在前後端分離,或者說涉及到獨立的類似手機 APP 等前端應用的時候使用的最多,即把內部各個微服務組件模塊的 API 接口能力統一註冊和接入到網關,對於 APP 也只需要訪問網關暴露的接口即可,同時通過網關還可以進一步的實現安全隔離。

也就是說在這種場景下,網關更多的是實現了接口服務的代理和路由轉發能力,更多的是向外的一種能力發佈。

  1. 一個獨立的開發團隊,爲保證獨立自治,以及內部多個微服務模塊間的交互集成,最好啓用獨立的服務註冊中心實現服務註冊,發現能力。即開發團隊內部多個微服務模塊間的集成,不需要通過網關,只需要通過服務註冊中心進行集成即可。

  2. 開發團隊需要暴露能力給外部,包括暴露能力給其它的開發團隊,需要考慮將該 API 接口註冊到外部的網關上。在這裏建議是拆分兩個獨立網關,一個是內部 API 網關,一個是放置到 DMZ 區面對公網訪問的 API 網關。對於服務如果同時涉及到內部和外部使用,則兩邊註冊。建議不要通過兩次網關去路由,一個是影響性能,一個是不方便後續問題排查。

  3. 構建在開發團隊之外的 API 網關必須具備負載均衡能力,可以配置多個 IP 地址。通過該 API 網關也最好具備和 Docker 容器擴展後的服務自動註冊和地址加入擴展能力。

Eureka 的競品分析:Nacos、ZooKeeper、Etcd

服務發現是一個古老的話題,當應用開始脫離單機運行和訪問時,服務發現就誕生了。目前的網絡架構是每個主機都有一個獨立的 IP 地址,那麼服務發現基本上都是通過某種方式獲取到服務所部署的 IP 地址。DNS 協議是最早將一個網絡名稱翻譯爲網絡 IP 的協議,在最初的架構選型中,DNS+LVS+Nginx 基本可以滿足所有的 RESTful 服務的發現,此時服務的 IP 列表通常配置在 Nginx 或者 LVS。後來出現了 RPC 服務,服務的上下線更加頻繁,人們開始尋求一種能夠支持動態上下線並且推送 IP 列表變化的註冊中心產品。

Eureka

1. ZooKeeper

這是一款經典的服務註冊中心產品(雖然它最初的定位並不在於此),在很長一段時間裏,它是國人在提起 RPC 服務註冊中心時心裏想到的唯一選擇,這很大程度上與 Dubbo 在中國的普及程度有關。

2. Nacos

Nacos 是阿里巴巴旗下的開源項目,在 2018 年開源,攜帶着阿里巴巴大規模服務生產經驗,試圖在服務註冊和配置管理這個市場上,提供給用戶一個新的選擇。

值得一提的是,Nacos 作爲配置中心的持久化機制可以依賴於Mysql來完成(默認依賴於內置數據庫)。只需要將 Nacos 目錄下的 sql 腳本放到 mysql 中執行(會生成 11 個表),然後在 nacos 配置文件裏面配一下 mysql 的賬號密碼即可。這樣使用 mysql 作爲數據源的方式相比於 nacos 內置數據庫來說更容易管理

3. Consul

Consul 是 HashiCorp 公司推出的一個開源工具。

4. Etcd(待續)

對比 SpringCloud,Kubernetes 也提供完整的分佈式微服務管理框架,幾乎所有組件都有對應的產品,其中 Etcd 也可以提供類似 Eureka 的註冊中心。

在 Go 生態中,還可以選擇基於 Etcd 作爲註冊中心,Etcd 是由 CoreOS 團隊維護的、高可用分佈式鍵值存儲數據庫,可用於爲集羣提供配置和服務發現功能,Google 開源的容器管理工具 Kuberbetes 就是基於 Etcd 的。

和 Consul 一樣,Etcd 也是基於 Raft 協議作爲分佈式一致性算法來解決領導者選舉和日誌複製問題,同樣也是基於 Go 語言編寫。

Etcd 也支持代理模式(proxy),只不過在 Etcd 中,代理模式和 Consul 的客戶端代理模式類似,安裝在部署服務的節點上,用來轉發請求到 Etcd 集羣,本身不存儲任何數據,Etcd 集羣相當於 Consul 中以服務端模式運行的 Consul 集羣,通常要求配置三個及以上節點(不要太多,3~5 就夠了,以便可用性和性能上達到平衡),負責真正的請求處理 —— 服務註冊與發現。

在目前最新版本的 Etcd v3 中,通過網關模式(gateway)取代了 V2 版本中的代理模式(proxy)。

從服務發現的實現原理上來說,Consul 和 Etcd 的基本設計思路是一致的,Etcd 更簡單,Consul 則更像一個全棧的解決方案,功能比 Etcd 要更豐富,比如支持可視化的 Web UI 管理界面、支持多數據庫中心、安全層面除了 HTTPS 外還支持 ACL、更加全面的健康檢查功能、內置 DNS Server 等,這些都是 Etcd 所不具備的,但是更全面的功能往往意味着更高的複雜性,針對微服務的服務註冊和發現場景,Etcd 完全夠用了。

Spring Cloud 全家桶的簡介

參考文獻

作者:Alex

來源:blog.caogo.cn/2021/06/20/%E5%9F%BA%E4%BA%8ESpring-Cloud%E7%9A%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90/

架構師

我們都是架構師!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bY3MsjH_Ha0jfD8cJMpjmw