天天看點

《微服務架構之Spring Cloud》一、簡介

本文中我們主要介紹微服務開發架構——Spring Cloud。盡管Spring Cloud帶有"Cloud"的字樣,但它并不是雲計算解決方案,而是Spring Boot的基礎上建構的,用于快速建構分布式系統的通用模式的工具集。

Spring Cloud的特點

Spring Cloud有以下特點:

  • 約定優于配置;
  • 适用于各種環境。開發、部署PC Server或各種雲環境(例如阿裡雲、AWS等)均可;
  • 隐藏了元件的複雜性,并提供聲明式、無xml的配置方式;
  • 開箱即用,快速啟動;
  • 輕量級的元件。Spring Cloud整合的元件大多比較輕量。例如Eureka、Zuul等,都是各自領域輕量級的實作;
  • 元件豐富,功能齊全。Spring Cloud 為微服務架構提供了非常完整的支援。例如、配置管理、服務發現、斷路器、微服務網關等;
  • 選型中立、豐富。例如,Spring Cloud支援使用Eureka、Zookeeper或Consul實作服務發現;
  • 靈活。Spring Cloud的組成部分是解耦的,開發人員可以按需靈活挑選技術選型。

Spring Cloud版本簡介

《微服務架構之Spring Cloud》一、簡介

Spring Cloud版本

由上圖可知,Spring Cloud是以英文單詞+SR+數字的形式命名版本号的。那麼英文單詞和SR分别表示什麼呢?

因為Spring Cloud是一個綜合項目,它包含很多子項目。由于子項目也維護着自己的版本号,Spring Cloud采用了這種命名方式,進而避免與子項目的版本混淆。其中英文單詞如Edware是倫敦某地鐵站名,它們按照字母順序發行,可以将其了解為主版本的演進。SR表示"Service Release",一般表示Bug修複。

版本相容性如下

《微服務架構之Spring Cloud》一、簡介

版本相容性

版本内容

《微服務架構之Spring Cloud》一、簡介

版本内容

可參考官方文檔:​​https://spring.io/projects/spring-cloud#overview​​

Spring Cloud分布式開發五大元件

  • 服務發現——Netflix Eureka
  • 用戶端負載均衡——Netflix Ribbon
  • 斷路器——Netflix Hystrix
  • 服務網關——Netflix Zuul
  • 分布式配置——Spring Cloud Config

Eureka

《微服務架構之Spring Cloud》一、簡介

Eureka

我的上一篇部落格(微服務理論篇)中談到,對單體應用進行服務拆分得到各個微服務,而這些服務又是互相獨立的,那麼我們如何知道各個微服務的健康狀态、如何知道某個微服務的存在呢?由此、一個擁有服務發現的架構顯得尤為重要。這也就是Eureka誕生的原因。

  • Eureka是由Netflix開發的服務發現架構,本身是一個基于RESTful的服務,主要用于定位運作在AWS域中的中間層服務。
  • 由兩個元件組成:Eureka Server和Eureka Client。Eureka Server提供服務注冊服務,各個節點啟動後,會在Eureka Server中進行注冊,這樣EurekaServer中的服務系統資料庫中将會存儲所有可用服務節點的資訊,服務節點的資訊可以在界面中直覺的看到。Eureka Client即為微服務節點。
  • Eureka Client啟動後,将會注冊到Eureka Server中,同時會定時發送心跳(預設無配置情況下為30s),如果Eureka Server在多個心跳周期内沒有接收到某個節點的心跳,那麼Eureka Server将會從服務系統資料庫中把這個節點移除(預設90s)。
  • Eureka Server之間通過複制的方式完成資料同步,Eureka還提供了用戶端緩存機制,即使所有的Eureka Server都挂掉,用戶端依然可以利用緩存中的資訊消費其他服務的API。

綜上,Eureka通過心跳檢查、用戶端緩存等機制,確定了系統的高可用性、靈活性和可伸縮性。

Ribbon

《微服務架構之Spring Cloud》一、簡介

Ribbon

通過使用Eureka已經實作了微服務的注冊與發現。啟動各個微服務時,Eureka Client會把自己的網絡資訊注冊到Eureka Server上。似乎一切更美好了一些。然而,這樣的架構依然有一些問題,如負載均衡。一般來說,各個微服務都會部署多個執行個體。那麼服務消費者要如何将請求分攤到多個服務提供執行個體上呢?

  • Ribbon(負載均衡器)的作用正是提供負載均衡機制,當為Ribbon配置服務提供者位址清單後,Ribbon就可以基于某種負載均衡算法,自動地幫助服務消費者去請求。
  • Ribbon提供的負載均衡算法有多種,例如輪詢、權重響應時間、随機和區域感覺輪詢。
  • Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server擷取服務提供者位址清單,并基于負載均衡算法,請求其中一個服務提供者示例。(大緻架構如下圖)
  • 《微服務架構之Spring Cloud》一、簡介
  • Ribbon與Eureka配合使用

Hystrix

如果服務提供者相應非常慢,那麼消費者對提供者的請求就會被強制等待,知道提供者響應或逾時。在高負載場景下,如果不作任何處理,此類問題可能會導緻服務消費者的資源耗竭甚至整個系統崩潰。

微服務架構的應用系統通常包含多個服務層。微服務之間通過網絡進行通信,進而支撐起整個應用系統,是以,微服務之間難免存在依賴關系。而這種由于"基礎服務故障"導緻"級聯故障"的現象稱為雪崩效應。

《微服務架構之Spring Cloud》一、簡介

雪崩效應

如圖所示,A最為服務提供者(基礎服務),B為A的服務消費者,C和D是B的服務消費者。當A不可用引起了B的不可用,并将不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了。

那麼Hystrix是如何容錯的呢?

  • 為網絡請求設定逾時;
  • 使用斷路器模式:斷路器可了解為對容易導緻錯誤操作的代理。這種代理能夠統計一段時間内調用失敗的次數,并決定是正常請求依賴的服務還是直接傳回;斷路器可以實作快速失敗,如果它在一段時間内檢測到許多類似的錯誤(例如逾時),就會在之後的一段時間内,強迫對該服務的調用快速失敗,即不請求所依賴的服務。這樣,應用程式就無須再浪費CPU時間去等待長時間的逾時。斷路器也可以自動診斷依賴的服務是否已經恢複正常,如果發現依賴的服務已經恢複正常,那麼就會恢複請求該服務。
  • 《微服務架構之Spring Cloud》一、簡介
  • 斷路器狀态轉換圖

以下對該圖做個簡單講解:

  • 正常情況下,斷路器關閉,可以正常請求依賴的服務;
  • 當一段時間内,請求失敗率達到一定門檻值(例如錯誤率達到50%,或100次/分鐘等),斷路器就會打開,此時,就不會再去請求依賴的服務;
  • 斷路器打開一段時間後,會自動進入"半開"狀态。此時,斷路器允許一個請求通路依賴的服務。如果請求能夠調用成功,則關閉斷路器;否則繼續保持打開狀态。

Zuul

Zuul作為微服務架構中的微服務網關。微服務架構經過前幾個元件的組合,已經有了基本的雛形了,那麼我們為什麼還要使用微服務網關呢?我們可以想象,一般情況下我們一個業務并不是隻調用一個接口就可以完成一個業務需求。

如果讓用戶端直接與各個微服務通信,會有以下問題:

  • 用戶端會多次請求不同的微服務,增加了用戶端的複雜性;
  • 存在跨域請求,在一定場景下處理相對複雜;
  • 認證複雜,每個服務都需要獨立認證;
  • 難以重構,随着項目的疊代,可能需要重新劃分微服務,如果直接與微服務通信,那麼重構會很難實施;
《微服務架構之Spring Cloud》一、簡介

微服務網關

如圖,微服務網關封裝了應用程式的内部結構,用戶端隻須跟網關互動,而無須直接調用特定微服務接口。同時,還有以下優點:

  • 易于監控;
  • 易于認證:可在微服務網關上進行認證,然後再将請求轉發到後端的微服務,而無須在每個微服務中進行認證;
  • 減少了用戶端與各個微服務之間的互動次數。
  • 集中管理配置:一個使用微服務架構的應用系統可能會包含成百上千個微服務,是以,集中管理配置是很有必要的;
  • 不同環境不同配置。例如,資料源配置在不同的環境(開發、測試、預釋出、生産等)中是不同的;
  • 運作期間可動态調整:例如,可根據各個微服務的負載情況,動态調整資料源連接配接池的大小或熔斷門檻值,并且在調整配置時不停止微服務;
  • 配置修改後可自動更新:如配置内容發生變化,微服務能夠自動更新配置。

繼續閱讀