天天看點

【第二十一篇】商城系統-服務熔斷降級Sentinel

【第二十一篇】商城系統-服務熔斷降級Sentinel

Sentinel

【第二十一篇】商城系統-服務熔斷降級Sentinel
【第二十一篇】商城系統-服務熔斷降級Sentinel
【第二十一篇】商城系統-服務熔斷降級Sentinel

一、熔斷、降級、限流

1.熔斷

  服務熔斷的作用類似于我們家用的保險絲,當某服務出現不可用或響應逾時的情況時,為了防止整個系統出現雪崩,暫時停止對該服務的調用。

停止是說,目前服務一旦對下遊服務進行熔斷,當請求到達時,目前服務不再對下遊服務進行調用,而是使用設定好的政策(如建構預設值)直接傳回。

暫時是說,熔斷後,并不會一直不再調用下遊服務,而是以一定的政策(如每分鐘調用 10 次,若均傳回成功,則增大調用量)試探調用下遊服務,當下遊服務恢複可用時,自動停止熔斷。

【第二十一篇】商城系統-服務熔斷降級Sentinel

2.降級

  降級是指當自身服務壓力增大時,采取一些手段,增強自身服務的處理能力,以保障服務的持續可用。比如,下線非核心服務以保證核心服務的穩定、降低實時性、降低資料一緻性。

  為了預防某些功能出現負荷過載或者響應慢的情況,在其内部暫時舍棄一些非核心接口和資料的請求(如評論、積分),而直接傳回一個提前準備好的 fallback(退路) 錯誤處理資訊。釋放CPU和記憶體資源,以保證整個系統的穩定性和可用性。

3.限流

  限流是指上遊服務對本服務請求 QPS 超過阙值時,通過一定的政策(如延遲處理、拒絕處理)對上遊服務的請求量進行限制,以保證本服務不被壓垮,進而持續提供穩定服務。常見的限流算法有滑動視窗、令牌桶、漏桶等。

二、Sentinel

1.其他元件對比

【第二十一篇】商城系統-服務熔斷降級Sentinel

2.Sentinel介紹

  随着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個次元保護服務的穩定性。

Sentinel 的曆史:

  • 2012 年,Sentinel 誕生,主要功能為入口流量控制。
  • 2013-2017 年,Sentinel 在阿裡巴巴集團内部迅速發展,成為基礎技術子產品,覆寫了所有的核心場景。Sentinel 也是以積累了大量的流量歸整場景以及生産實踐。
  • 2018 年,Sentinel 開源,并持續演進。
  • 2019 年,Sentinel 朝着多語言擴充的方向不斷探索,推出 C++ 原生版本,同時針對 Service Mesh 場景也推出了 Envoy 叢集流量控制支援,以解決 Service Mesh 架構下多語言限流的問題。
  • 2020 年,推出 Sentinel Go 版本,繼續朝着雲原生方向演進。

Sentinel 分為兩個部分:

  • 核心庫(Java 用戶端)不依賴任何架構/庫,能夠運作于所有 Java 運作時環境,同時對 Dubbo / Spring Cloud 等架構也有較好的支援。
  • 控制台(Dashboard)基于 Spring Boot 開發,打包後可以直接運作,不需要額外的 Tomcat 等應用容器。

Sentinel 可以簡單的分為 Sentinel 核心庫和 Dashboard。核心庫不依賴 Dashboard,但是結合 Dashboard 可以取得最好的效果。

3. 基本概念及作用

基本概念:

資源:是 Sentinel 的關鍵概念。它可以是 Java 應用程式中的任何内容,例如,由應用程式提供的服務,或由應用程式調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。

隻要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來标示資源。

規則:圍繞資源的實時狀态設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動态實時調整。

主要作用:

  1. 流量控制
  2. 熔斷降級
  3. 系統負載保護

我們說的資源,可以是任何東西,服務,服務裡的方法,甚至是一段代碼。使用 Sentinel 來進行資源保護,主要分為幾個步驟:

  1. 定義資源
  2. 定義規則
  3. 檢驗規則是否生效

先把可能需要保護的資源定義好,之後再配置規則。也可以了解為,隻要有了資源,我們就可以在任何時候靈活地定義各種流量控制規則。在編碼的時候,隻需要考慮這個代碼是否需要保護,如果需要保護,就将之定義為一個資源。

4.Sentinel應用

官方文檔:​​https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel​​

4.1 Sentinel控制台搭建

下載下傳對應的jar包:https://github.com/alibaba/Sentinel/releases 下載下傳适合自己的版本

通過指令行啟動:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

啟動後需要輸入賬号密碼:sentinel sentinel

【第二十一篇】商城系統-服務熔斷降級Sentinel

登入成功後看到的頁面

【第二十一篇】商城系統-服務熔斷降級Sentinel

4.2 服務監控

  如果我們需要把自己的服務被Sentinel監控,那麼我們需要添加對應的依賴

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>      

然後需要添加對應的屬性資訊

【第二十一篇】商城系統-服務熔斷降級Sentinel

然後我們通路請求後,在控制台就可以看到對應的監控資訊了

【第二十一篇】商城系統-服務熔斷降級Sentinel

然後我們可以指定簡單的限流規則

【第二十一篇】商城系統-服務熔斷降級Sentinel

表示1秒中内隻能有一個QPS。超過就限流

【第二十一篇】商城系統-服務熔斷降級Sentinel

測試我們發送請求快一點就會出現限流的處理

4.3 實時監控

  實時監控這塊需要引入Acuator

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>      

endpoint端點:

【第二十一篇】商城系統-服務熔斷降級Sentinel

4.4 限流資訊自定義

@Component
public class SentinelUrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        R r = R.error(500,"通路太快,稍後再試!");
        httpServletResponse.setContentType("application/json;charset=UTF-8");
        httpServletResponse.getWriter().write(JSON.toJSONString(r));
    }
}      
【第二十一篇】商城系統-服務熔斷降級Sentinel

5.sentinel容器安裝

  直接在windows中安裝Sentinel啟動管理還是不太友善,是以我們還是把Sentinel安裝在Docker容器中

拉取對應的鏡像檔案

docker pull bladex/sentinel-dashboard:1.7.2      

啟動容器

docker run --name sentinel  -d -p 8858:8858 -d  bladex/sentinel-dashboard:tagname      

開機自啟動

docker update --restart=always sentinel      

通路:

【第二十一篇】商城系統-服務熔斷降級Sentinel

對應的用戶端的使用:需要調整的配置資訊

【第二十一篇】商城系統-服務熔斷降級Sentinel
【第二十一篇】商城系統-服務熔斷降級Sentinel

6.Sentinel監控所有服務

  我們需要對每一個服務都添加Sentinel的配置。

【第二十一篇】商城系統-服務熔斷降級Sentinel

7.熔斷降級

​​https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel​​

1.添加對應的配置

【第二十一篇】商城系統-服務熔斷降級Sentinel

2.添加托底的方法

【第二十一篇】商城系統-服務熔斷降級Sentinel
【第二十一篇】商城系統-服務熔斷降級Sentinel

手動配置:用戶端的Sentinel版本需要和伺服器的版本要保持一緻。

8.自定義資源