SpringCloud及其組件詳解

1、Spring Cloud

Spring Cloud 是實現微服務思想落地開發的一整套技術的集合。
Spring Cloud專注於提供良好的開箱即用經驗的典型用例和可擴展性機制覆蓋。

  • 分佈式/版本化配置
  • 服務註冊和發現
  • 路由
  • service - to - service調用
  • 負載均衡
  • 斷路器
  • 分佈式消息傳遞

Spring Cloud上下文爲Spring Cloud應用程序(引導上下文,加密,刷新範圍和環境端點)的ApplicationContext提供實用程序和特殊服務。Spring Cloud Commons是一組在不同的Spring Cloud實現中使用的抽象和常用類(例如Spring Cloud Netflix vs. Spring Cloud Consul)。

1.1 Spring Cloud和Dubbo的區別圖解

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lIf6pXsZ-1593414229484)(https://img2018.cnblogs.com/blog/1654189/202001/1654189-20200127222343299-1071763521.png)]

1.2 微服務的技術棧

2、Spring Cloud 概述

2.1 SpringBoot和SpringCloud的區別?

  • SpringBoot專注於快速方便的開發單個個體微服務。
  • SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,
  • 爲各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分佈式會話等等集成服務
  • SpringBoot可以離開SpringCloud獨立使用開發項目, 但是SpringCloud離不開SpringBoot ,屬於依賴的關係
  • SpringBoot專注於快速、方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。

3、Eureka

3.1 Eureka和ZooKeeper都可以提供服務註冊與發現的功能,請說說兩個的區別

1、 ZooKeeper中的節點服務掛了就要選舉 在選舉期間註冊服務癱瘓,雖然服務最終會恢復,但是選舉期間不可用的, 選舉就是改微服務做了集羣,必須有一臺主其他的都是從
2、 Eureka各個節點是平等關係,服務器掛了沒關係,只要有一臺Eureka就可以保證服務可用,數據都是最新的。 如果查詢到的數據並不是最新的,就是因爲Eureka的自我保護模式導致的
3、 Eureka本質上是一個工程,而ZooKeeper只是一個進程
4、 Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像ZooKeeper 一樣使得整個註冊系統癱瘓
5、 ZooKeeper保證的是CP,Eureka保證的是AP

CAP: C:一致性>Consistency; 取捨:(強一致性、單調一致性、會話一致性、最終一致性、弱一致性) A:可用性>Availability; P:分區容錯性>Partition tolerance;

4、Zuul

4.1 什麼是網關?

網關相當於一個網絡服務架構的入口,所有網絡請求必須通過網關轉發到具體的服務。

4.2 網關的作用是什麼

統一管理微服務請求,權限控制、負載均衡、路由轉發、監控、安全控制黑名單和白名單等

4.3 什麼是Spring Cloud Zuul(服務網關)

  • Zuul是對SpringCloud提供的成熟對的路由方案,他會根據請求的路徑不同,網關會定位到指定的微服務,並代理請求到不同的微服務接口,他對外隱蔽了微服務的真正接口地址。 三個重要概念:動態路由表,路由定位,反向代理:
  • 動態路由表:Zuul支持Eureka路由,手動配置路由,這倆種都支持自動更新
  • 路由定位:根據請求路徑,Zuul有自己的一套定位服務規則以及路由表達式匹配
  • 反向代理:客戶端請求到路由網關,網關受理之後,在對目標發送請求,拿到響應之後在 給客戶端
  • 它可以和Eureka,Ribbon,Hystrix等組件配合使用,
  • Zuul的應用場景:
  • 對外暴露,權限校驗,服務聚合,日誌審計等

4.4 網關與過濾器有什麼區別

網關是對所有服務的請求進行分析過濾,過濾器是對單個服務而言。

4.5 常用網關框架有那些?

Nginx、Zuul、Gateway

4.6 Zuul與Nginx有什麼區別?

Zuul是java語言實現的,主要爲java服務提供網關服務,尤其在微服務架構中可以更加靈活的對網關進行操作。Nginx是使用C語言實現,性能高於Zuul,但是實現自定義操作需要熟悉lua語言,對程序員要求較高,可以使用Nginx做Zuul集羣。

4.7 ZuulFilter常用有那些方法

  • Run():過濾器的具體業務邏輯
  • shouldFilter():判斷過濾器是否有效
  • filterOrder():過濾器執行順序
  • filterType():過濾器攔截位置

5、Ribbon

5.1 Ribbon是什麼?

  • Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟件負載均衡算法
  • Ribbon客戶端組件提供一系列完善的配置項,如連接超時,重試等。簡單的說,就是在配置文件中列出後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。(有點類似Nginx)

5.2 Nginx與Ribbon的區別

  • Nginx是反向代理同時可以實現負載均衡,nginx攔截客戶端請求採用負載均衡策略根據upstream配置進行轉發,相當於請求通過nginx服務器進行轉發。Ribbon是客戶端負載均衡,從註冊中心讀取目標服務器信息,然後客戶端採用輪詢策略對服務直接訪問,全程在客戶端操作。

5.3 Ribbon底層實現原理

Ribbon使用discoveryClient從註冊中心讀取目標服務信息,對同一接口請求進行計數,使用%取餘算法獲取目標服務集羣索引,返回獲取到的目標服務信息。

5.4 @LoadBalanced註解的作用

開啓客戶端負載均衡。

6、Hystrix

6.1 什麼是斷路器

  • 當一個服務調用另一個服務由於網絡原因或自身原因出現問題,調用者就會等待被調用者的響應 當更多的服務請求到這些資源導致更多的請求等待,發生連鎖效應(雪崩效應)
  • 斷路器有三種狀態

打開狀態:一段時間內 達到一定的次數無法調用 並且多次監測沒有恢復的跡象 斷路器完全打開 那麼下次請求就不會請求到該服務
半開狀態:短時間內 有恢復跡象 斷路器會將部分請求發給該服務,正常調用時 斷路器關閉
關閉狀態:當服務一直處於正常狀態 能正常調用

6.2 什麼是 Hystrix?

  • 在分佈式系統,我們一定會依賴各種服務,那麼這些個服務一定會出現失敗的情況,就會導致雪崩,Hystrix就是這樣的一個工具,防雪崩利器,它具有服務降級,服務熔斷,服務隔離,監控等一些防止雪崩的技術。
  • Hystrix有四種防雪崩方式:
  • 服務降級:接口調用失敗就調用本地的方法返回一個空
  • 服務熔斷:接口調用失敗就會進入調用接口提前定義好的一個熔斷的方法,返回錯誤信息
  • 服務隔離:隔離服務之間相互影響
  • 服務監控:在服務發生調用時,會將每秒請求數、成功請求數等運行指標記錄下來。

6.3 談談服務雪崩效應

  • 雪崩效應是在大型互聯網項目中,當某個服務發生宕機時,調用這個服務的其他服務也會發生宕機,大型項目的微服務之間的調用是互通的,這樣就會將服務的不可用逐步擴大到各個其他服務中,從而使整個項目的服務宕機崩潰.發生雪崩效應的原因有以下幾點
  • 單個服務的代碼存在bug. 2請求訪問量激增導致服務發生崩潰(如大型商城的槍紅包,秒殺功能). 3.服務器的硬件故障也會導致部分服務不可用.

6.4 在微服務中,如何保護服務?

  • 一般使用使用Hystrix框架,實現服務隔離來避免出現服務的雪崩效應,從而達到保護服務的效果。當微服務中,高併發的數據庫訪問量導致服務線程阻塞,使單個服務宕機,服務的不可用會蔓延到其他服務,引起整體服務災難性後果,使用服務降級能有效爲不同的服務分配資源,一旦服務不可用則返回友好提示,不佔用其他服務資源,從而避免單個服務崩潰引發整體服務的不可用.

6.5 服務雪崩效應產生的原因

  • 因爲Tomcat默認情況下只有一個線程池來維護客戶端發送的所有的請求,這時候某一接口在某一時刻被大量訪問就會佔據tomcat線程池中的所有線程,其他請求處於等待狀態,無法連接到服務接口。

6.6 談談服務降級、熔斷、服務隔離

  • 服務降級:當客戶端請求服務器端的時候,防止客戶端一直等待,不會處理業務邏輯代碼,直接返回一個友好的提示給客戶端。
  • 服務熔斷是在服務降級的基礎上更直接的一種保護方式,當在一個統計時間範圍內的請求失敗數量達到設定值(requestVolumeThreshold)或當前的請求錯誤率達到設定的錯誤率閾值(errorThresholdPercentage)時開啓斷路,之後的請求直接走fallback方法,在設定時間(sleepWindowInMilliseconds)後嘗試恢復。
  • 服務隔離就是Hystrix爲隔離的服務開啓一個獨立的線程池,這樣在高併發的情況下不會影響其他服務。服務隔離有線程池和信號量兩種實現方式,一般使用線程池方式。

6.7 服務降級底層是如何實現的?

  • Hystrix實現服務降級的功能是通過重寫HystrixCommand中的getFallback()方法,當Hystrix的run方法或construct執行發生錯誤時轉而執行getFallback()方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章