spring cloud 二刷總結摘抄記錄

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud包含了多個子項目(針對分佈式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。

 

什麼是“微服務架構”呢?簡單的說,微服務架構就是將一個完整的應用從數據存儲開始垂直拆分成多個不同的服務,每個服務都能獨立部署、獨立維護、獨立擴展,服務與服務間通過諸如RESTful API的方式互相調用。https://mp.weixin.qq.com/s/fzk-kENu0I22P3F2Vu7KBA?

 

  1. 註冊中心Eureka

作用:實現服務治理(服務註冊與發現)

簡介:Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。

 

2.服務消費(Ribbon)(消費者,客戶端)

作用:Ribbon,主要提供客戶側的軟件負載均衡算法。

簡介:Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用(輪詢訪問以達到均衡負載的作用)。

 

3.服務消費(Feign)(消費者,客戶端)

Spring Cloud Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。我們只需要通過創建接口並用註解來配置它既可完成對Web服務接口的綁定。它具備可插拔的註解支持,包括Feign註解、JAX-RS註解。它也支持可插拔的編碼器和解碼器。Spring Cloud Feign還擴展了對Spring MVC註解的支持,同時還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。Feign還整合的Hystrix來實現服務的容錯保護,默認是關閉的。(創建一個Feign的客戶端接口定義。使用@FeignClient註解來指定這個接口所要調用的服務名稱,接口中定義的各個函數使用Spring MVC的註解就可以來綁定服務提供方的REST接口)。

 

  1. 服務容錯保護Hystrix

作用:斷路器,保護系統,控制故障範圍。

簡介:在微服務架構中,我們將系統拆分成了一個個的服務單元,各單元應用間通過服務註冊與訂閱的方式互相依賴。由於每個單元都在不同的進程中運行,依賴通過遠程調用的方式執行,這樣就有可能因爲網絡原因或是依賴服務自身問題出現調用故障或延遲,而這些問題會直接導致調用方的對外服務也出現延遲,若此時調用方的請求不斷增加,最後就會出現因等待出現故障的依賴方響應而形成任務積壓,線程資源無法釋放,最終導致自身服務的癱瘓,進一步甚至出現故障的蔓延最終導致整個系統的癱瘓。如果這樣的架構存在如此嚴重的隱患,那麼相較傳統架構就更加的不穩定。爲了解決這樣的問題,因此產生了斷路器等一系列的服務保護機制。針對上述問題,在Spring Cloud Hystrix中實現了線程隔離、斷路器等一系列的服務保護功能。它也是基於Netflix的開源框架 Hystrix實現的,該框架目標在於通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、線程隔離、請求緩存、請求合併以及服務監控等強大功能。

 

Hystrix依賴隔離:

Hystrix的熔斷器隔離模式目前有兩種方式:信號量模式和線程池模式。

信號量:當n個併發請求去調用一個目標服務接口時,都要獲取一個信號量才能真正去調用目標服務接口,但信號量有限,默認是10個,可以使用maxConcurrentRequests參數配置,如果併發請求數多於信號量個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走fallback流程,從而達到限流和防止雪崩的目的。因爲信號量並不支持超時,當被調服務發生問題時,所以有少部分用戶會長時間無法得到響應。 

 

線程池:當n個請求線程併發對某個接口請求調用時,會先從hystrix管理的線程池裏面獲得一個線程,然後將參數傳遞給這個線程去執行真正調用。線程池的大小有限,默認是10個線程,可以使用maxConcurrentRequests參數配置,如果併發請求數多於線程池線程個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走fallback流程。

 

信號量模式從始至終都只有請求線程自身,是同步調用模式,不支持超時調用,不支持直接熔斷,由於沒有線程的切換,開銷非常小。

線程池模式可以支持異步調用,支持超時調用,支持直接熔斷,存在線程切換,開銷大。

 

Hystrix斷路器:

當我們把服務提供者eureka-client中加入了模擬的時間延遲之後,在服務消費端的服務降級邏輯因爲hystrix命令調用依賴服務超時,觸發了降級邏輯,但是即使這樣,受限於Hystrix超時時間的問題,我們的調用依然很有可能產生堆積。

這個時候斷路器就會發揮作用,那麼斷路器是在什麼情況下開始起作用呢?這裏涉及到斷路器的三個重要參數:快照時間窗、請求總數下限、錯誤百分比下限。這個參數的作用分別是:

快照時間窗:斷路器確定是否打開需要統計一些請求和錯誤數據,而統計的時間範圍就是快照時間窗,默認爲最近的10秒。

請求總數下限:在快照時間窗內,必須滿足請求總數下限纔有資格根據熔斷。默認爲20,意味着在10秒內,如果該hystrix命令的調用此時不足20次,即時所有的請求都超時或其他原因失敗,斷路器都不會打開。

錯誤百分比下限:當請求總數在快照時間窗內超過了下限,比如發生了30次調用,如果在這30次調用中,有16次發生了超時異常,也就是超過50%的錯誤百分比,在默認設定50%下限情況下,這時候就會將斷路器打開。

那麼當斷路器打開之後會發生什麼呢?我們先來說說斷路器未打開之前,對於之前那個示例的情況就是每個請求都會在當hystrix超時之後返回fallback,每個請求時間延遲就是近似hystrix的超時時間,如果設置爲5秒,那麼每個請求就都要延遲5秒纔會返回。當熔斷器在10秒內發現請求總數超過20,並且錯誤百分比超過50%,這個時候熔斷器打開。打開之後,再有請求調用的時候,將不會調用主邏輯,而是直接調用降級邏輯,這個時候就不會等待5秒之後才返回fallback。通過斷路器,實現了自動地發現錯誤並將降級邏輯切換爲主邏輯,減少響應延遲的效果。

在斷路器打開之後,處理邏輯並沒有結束,我們的降級邏輯已經被成了主邏輯,那麼原來的主邏輯要如何恢復呢?對於這一問題,hystrix也爲我們實現了自動恢復功能。當斷路器打開,對主邏輯進行熔斷之後,hystrix會啓動一個休眠時間窗,在這個時間窗內,降級邏輯是臨時的成爲主邏輯,當休眠時間窗到期,斷路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那麼斷路器將繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器繼續進入打開狀態,休眠時間窗重新計時。

通過上面的一系列機制,hystrix的斷路器實現了對依賴資源故障的端口、對降級策略的自動切換以及對主邏輯的自動恢復機制。這使得我們的微服務在依賴外部服務或資源的時候得到了非常好的保護,同時對於一些具備降級邏輯的業務需求可以實現自動化的切換與恢復,相比於設置開關由監控和運維來進行切換的傳統實現方式顯得更爲智能和高效。

 

 

  1. 服務網關(Zuul)

服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了權限控制(過濾器)等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,爲微服務架構提供了前門保護的作用,同時將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集羣主體能夠具備更高的可複用性和可測試性。

 

  1. 消息驅動的微服務(Stream)

Spring Cloud Stream是一個用來爲微服務應用構建消息驅動能力的框架。它可以基於Spring Boot來創建獨立的、可用於生產的Spring應用程序。它通過使用Spring Integration來連接消息代理中間件以實現消息事件驅動的微服務應用。Spring Cloud Stream爲一些供應商的消息中間件產品提供了個性化的自動化配置實現,並且引入了發佈-訂閱、消費組(隊列模式)以及消息分區(點對點模式,指定接收)這三個核心概念。簡單的說,Spring Cloud Stream本質上就是整合了Spring Boot和Spring Integration,實現了一套輕量級的消息驅動的微服務框架。通過使用Spring Cloud Stream,可以有效地簡化開發人員對消息中間件的使用複雜度,讓系統開發人員可以有更多的精力關注於核心業務邏輯的處理。由於Spring Cloud Stream基於Spring Boot實現,所以它秉承了Spring Boot的優點,實現了自動化配置的功能幫忙我們可以快速的上手使用,但是目前爲止Spring Cloud Stream只支持下面兩個著名的消息中間件的自動化配置:RabbitMQ、Kafka。

 

Spring Cloud Stream構建的應用程序與消息中間件之間是通過綁定器Binder相關聯的,綁定器對於應用程序而言起到了隔離作用,它使得不同消息中間件的實現細節對應用程序來說是透明的。所以對於每一個Spring Cloud Stream的應用程序來說,它不需要知曉消息中間件的通信細節,它只需要知道Binder對應用程序提供的概念去實現即可,而這個概念就是在快速入門中我們提到的消息通道:Channel。如下圖案例,在應用程序和Binder之間定義了兩條輸入通道和三條輸出通道來傳遞消息,而綁定器則是作爲這些通道和消息中間件之間的橋樑進行通信。

綁定器

Binder綁定器是Spring Cloud Stream中一個非常重要的概念。在沒有綁定器這個概念的情況下,我們的Spring Boot應用要直接與消息中間件進行信息交互的時候,由於各消息中間件構建的初衷不同,它們的實現細節上會有較大的差異性,這使得我們實現的消息交互邏輯就會非常笨重,因爲對具體的中間件實現細節有太重的依賴,當中間件有較大的變動升級、或是更換中間件的時候,我們就需要付出非常大的代價來實施。

通過定義綁定器作爲中間層,完美地實現了應用程序與消息中間件細節之間的隔離。通過嚮應用程序暴露統一的Channel通道,使得應用程序不需要再考慮各種不同的消息中間件實現。當我們需要升級消息中間件,或是更換其他消息中間件產品時,我們要做的就是更換它們對應的Binder綁定器而不需要修改任何Spring Boot的應用邏輯。這一點在上一章實現消息總線時,從RabbitMQ切換到Kafka的過程中,已經能夠讓我們體驗到這一好處。

 

 

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud包含了多個子項目(針對分佈式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。

 

什麼是“微服務架構”呢?簡單的說,微服務架構就是將一個完整的應用從數據存儲開始垂直拆分成多個不同的服務,每個服務都能獨立部署、獨立維護、獨立擴展,服務與服務間通過諸如RESTful API的方式互相調用。https://mp.weixin.qq.com/s/fzk-kENu0I22P3F2Vu7KBA?

 

  1. 註冊中心Eureka

作用:實現服務治理(服務註冊與發現)

簡介:Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。

 

2.服務消費(Ribbon)(消費者,客戶端)

作用:Ribbon,主要提供客戶側的軟件負載均衡算法。

簡介:Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用(輪詢訪問以達到均衡負載的作用)。

 

3.服務消費(Feign)(消費者,客戶端)

Spring Cloud Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。我們只需要通過創建接口並用註解來配置它既可完成對Web服務接口的綁定。它具備可插拔的註解支持,包括Feign註解、JAX-RS註解。它也支持可插拔的編碼器和解碼器。Spring Cloud Feign還擴展了對Spring MVC註解的支持,同時還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。Feign還整合的Hystrix來實現服務的容錯保護,默認是關閉的。(創建一個Feign的客戶端接口定義。使用@FeignClient註解來指定這個接口所要調用的服務名稱,接口中定義的各個函數使用Spring MVC的註解就可以來綁定服務提供方的REST接口)。

 

  1. 服務容錯保護Hystrix

作用:斷路器,保護系統,控制故障範圍。

簡介:在微服務架構中,我們將系統拆分成了一個個的服務單元,各單元應用間通過服務註冊與訂閱的方式互相依賴。由於每個單元都在不同的進程中運行,依賴通過遠程調用的方式執行,這樣就有可能因爲網絡原因或是依賴服務自身問題出現調用故障或延遲,而這些問題會直接導致調用方的對外服務也出現延遲,若此時調用方的請求不斷增加,最後就會出現因等待出現故障的依賴方響應而形成任務積壓,線程資源無法釋放,最終導致自身服務的癱瘓,進一步甚至出現故障的蔓延最終導致整個系統的癱瘓。如果這樣的架構存在如此嚴重的隱患,那麼相較傳統架構就更加的不穩定。爲了解決這樣的問題,因此產生了斷路器等一系列的服務保護機制。針對上述問題,在Spring Cloud Hystrix中實現了線程隔離、斷路器等一系列的服務保護功能。它也是基於Netflix的開源框架 Hystrix實現的,該框架目標在於通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、線程隔離、請求緩存、請求合併以及服務監控等強大功能。

 

Hystrix依賴隔離:

Hystrix的熔斷器隔離模式目前有兩種方式:信號量模式和線程池模式。

信號量:當n個併發請求去調用一個目標服務接口時,都要獲取一個信號量才能真正去調用目標服務接口,但信號量有限,默認是10個,可以使用maxConcurrentRequests參數配置,如果併發請求數多於信號量個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走fallback流程,從而達到限流和防止雪崩的目的。因爲信號量並不支持超時,當被調服務發生問題時,所以有少部分用戶會長時間無法得到響應。 

 

線程池:當n個請求線程併發對某個接口請求調用時,會先從hystrix管理的線程池裏面獲得一個線程,然後將參數傳遞給這個線程去執行真正調用。線程池的大小有限,默認是10個線程,可以使用maxConcurrentRequests參數配置,如果併發請求數多於線程池線程個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走fallback流程。

 

信號量模式從始至終都只有請求線程自身,是同步調用模式,不支持超時調用,不支持直接熔斷,由於沒有線程的切換,開銷非常小。

線程池模式可以支持異步調用,支持超時調用,支持直接熔斷,存在線程切換,開銷大。

 

Hystrix斷路器:

當我們把服務提供者eureka-client中加入了模擬的時間延遲之後,在服務消費端的服務降級邏輯因爲hystrix命令調用依賴服務超時,觸發了降級邏輯,但是即使這樣,受限於Hystrix超時時間的問題,我們的調用依然很有可能產生堆積。

這個時候斷路器就會發揮作用,那麼斷路器是在什麼情況下開始起作用呢?這裏涉及到斷路器的三個重要參數:快照時間窗、請求總數下限、錯誤百分比下限。這個參數的作用分別是:

快照時間窗:斷路器確定是否打開需要統計一些請求和錯誤數據,而統計的時間範圍就是快照時間窗,默認爲最近的10秒。

請求總數下限:在快照時間窗內,必須滿足請求總數下限纔有資格根據熔斷。默認爲20,意味着在10秒內,如果該hystrix命令的調用此時不足20次,即時所有的請求都超時或其他原因失敗,斷路器都不會打開。

錯誤百分比下限:當請求總數在快照時間窗內超過了下限,比如發生了30次調用,如果在這30次調用中,有16次發生了超時異常,也就是超過50%的錯誤百分比,在默認設定50%下限情況下,這時候就會將斷路器打開。

那麼當斷路器打開之後會發生什麼呢?我們先來說說斷路器未打開之前,對於之前那個示例的情況就是每個請求都會在當hystrix超時之後返回fallback,每個請求時間延遲就是近似hystrix的超時時間,如果設置爲5秒,那麼每個請求就都要延遲5秒纔會返回。當熔斷器在10秒內發現請求總數超過20,並且錯誤百分比超過50%,這個時候熔斷器打開。打開之後,再有請求調用的時候,將不會調用主邏輯,而是直接調用降級邏輯,這個時候就不會等待5秒之後才返回fallback。通過斷路器,實現了自動地發現錯誤並將降級邏輯切換爲主邏輯,減少響應延遲的效果。

在斷路器打開之後,處理邏輯並沒有結束,我們的降級邏輯已經被成了主邏輯,那麼原來的主邏輯要如何恢復呢?對於這一問題,hystrix也爲我們實現了自動恢復功能。當斷路器打開,對主邏輯進行熔斷之後,hystrix會啓動一個休眠時間窗,在這個時間窗內,降級邏輯是臨時的成爲主邏輯,當休眠時間窗到期,斷路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那麼斷路器將繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器繼續進入打開狀態,休眠時間窗重新計時。

通過上面的一系列機制,hystrix的斷路器實現了對依賴資源故障的端口、對降級策略的自動切換以及對主邏輯的自動恢復機制。這使得我們的微服務在依賴外部服務或資源的時候得到了非常好的保護,同時對於一些具備降級邏輯的業務需求可以實現自動化的切換與恢復,相比於設置開關由監控和運維來進行切換的傳統實現方式顯得更爲智能和高效。

 

 

  1. 服務網關(Zuul)

服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了權限控制(過濾器)等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,爲微服務架構提供了前門保護的作用,同時將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集羣主體能夠具備更高的可複用性和可測試性。

 

  1. 消息驅動的微服務(Stream)

Spring Cloud Stream是一個用來爲微服務應用構建消息驅動能力的框架。它可以基於Spring Boot來創建獨立的、可用於生產的Spring應用程序。它通過使用Spring Integration來連接消息代理中間件以實現消息事件驅動的微服務應用。Spring Cloud Stream爲一些供應商的消息中間件產品提供了個性化的自動化配置實現,並且引入了發佈-訂閱、消費組(隊列模式)以及消息分區(點對點模式,指定接收)這三個核心概念。簡單的說,Spring Cloud Stream本質上就是整合了Spring Boot和Spring Integration,實現了一套輕量級的消息驅動的微服務框架。通過使用Spring Cloud Stream,可以有效地簡化開發人員對消息中間件的使用複雜度,讓系統開發人員可以有更多的精力關注於核心業務邏輯的處理。由於Spring Cloud Stream基於Spring Boot實現,所以它秉承了Spring Boot的優點,實現了自動化配置的功能幫忙我們可以快速的上手使用,但是目前爲止Spring Cloud Stream只支持下面兩個著名的消息中間件的自動化配置:RabbitMQ、Kafka。

 

Spring Cloud Stream構建的應用程序與消息中間件之間是通過綁定器Binder相關聯的,綁定器對於應用程序而言起到了隔離作用,它使得不同消息中間件的實現細節對應用程序來說是透明的。所以對於每一個Spring Cloud Stream的應用程序來說,它不需要知曉消息中間件的通信細節,它只需要知道Binder對應用程序提供的概念去實現即可,而這個概念就是在快速入門中我們提到的消息通道:Channel。如下圖案例,在應用程序和Binder之間定義了兩條輸入通道和三條輸出通道來傳遞消息,而綁定器則是作爲這些通道和消息中間件之間的橋樑進行通信。

綁定器

Binder綁定器是Spring Cloud Stream中一個非常重要的概念。在沒有綁定器這個概念的情況下,我們的Spring Boot應用要直接與消息中間件進行信息交互的時候,由於各消息中間件構建的初衷不同,它們的實現細節上會有較大的差異性,這使得我們實現的消息交互邏輯就會非常笨重,因爲對具體的中間件實現細節有太重的依賴,當中間件有較大的變動升級、或是更換中間件的時候,我們就需要付出非常大的代價來實施。

通過定義綁定器作爲中間層,完美地實現了應用程序與消息中間件細節之間的隔離。通過嚮應用程序暴露統一的Channel通道,使得應用程序不需要再考慮各種不同的消息中間件實現。當我們需要升級消息中間件,或是更換其他消息中間件產品時,我們要做的就是更換它們對應的Binder綁定器而不需要修改任何Spring Boot的應用邏輯。這一點在上一章實現消息總線時,從RabbitMQ切換到Kafka的過程中,已經能夠讓我們體驗到這一好處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章