欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí)的代碼示例

 更新時(shí)間:2023年05月21日 10:06:35   作者:Supersist  
Sentinel是面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,本文將詳細(xì)為大家介紹如何使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí),文中有相關(guān)的代碼示例,需要的朋友可以參考下

伴隨著微服務(wù)的興起,服務(wù)間的調(diào)用的可靠性也越發(fā)重要了起來,在下面的這種服務(wù)調(diào)用關(guān)系中:

1.服務(wù)調(diào)用關(guān)系圖

A服務(wù)調(diào)用服務(wù)C,B服務(wù)調(diào)用服務(wù)D,服務(wù)C/D調(diào)用服務(wù)E,而服務(wù)會(huì)進(jìn)行數(shù)據(jù)庫(kù)讀寫,如果服務(wù)E在服務(wù)C/D的頻繁調(diào)用下不堪重負(fù),使得服務(wù)E宕掉了,則將導(dǎo)致整個(gè)服務(wù)集群不可用,這種現(xiàn)象簡(jiǎn)稱為服務(wù)雪崩,因此為了避免這種情況,就需要額外的技術(shù)保證服務(wù)的可用性。如常用的hystrixsentinel 就是用來處理這種情況的。前者是 Spring Cloud Netflix 常使用的組件,而后者是 Spring Cloud Alibaba 經(jīng)常使用的組件。本文以介紹 sentinel 為主。

本文主要有以下內(nèi)容:

  • Sentinel組件的簡(jiǎn)單介紹
  • Sentinel流控規(guī)則
  • Sentinel服務(wù)降級(jí)方案

什么是Sentinel

隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。

服務(wù)雪崩現(xiàn)象的發(fā)生,一般有兩種原因,一種是外部的大量請(qǐng)求調(diào)用,如在上面的例子中服務(wù)C/D頻繁調(diào)用服務(wù)E,導(dǎo)致服務(wù)E不堪重負(fù),另外一種是自身的原因,如服務(wù)E內(nèi)部發(fā)生了不可預(yù)知的錯(cuò)誤,如數(shù)數(shù)據(jù)庫(kù)讀寫效率過低,亦或者自身業(yè)務(wù)邏輯代碼拋出了異常等。

為了解決這兩種情況,Sentinel提供了針對(duì)外部的流量整形和針對(duì)本身的服務(wù)異常服務(wù)容錯(cuò)治理。

針對(duì)外部原因:提供了三種流控規(guī)則和三種流控效果來進(jìn)行服務(wù)限流。

  • 流控規(guī)則
    • 直接流控
    • 關(guān)聯(lián)流控
    • 鏈路流控
  • 流控效果
    • 快速失敗
    • Warm Up
    • 排隊(duì)等待

針對(duì)內(nèi)部原因:提供了服務(wù)降級(jí)方案和服務(wù)熔斷的方式來保證服務(wù)的穩(wěn)定性。

  • 服務(wù)降級(jí):針對(duì)單次服務(wù)調(diào)用,如服務(wù)C調(diào)用服務(wù)E時(shí),服務(wù)E的方法出現(xiàn)了異常導(dǎo)致無法完成正常的處理邏輯,如響應(yīng)超時(shí)、服務(wù)異常,此時(shí)我們給服務(wù)C提供一個(gè)默認(rèn)的返回值,保證此次調(diào)用得到處理。
  • 服務(wù)熔斷:指服務(wù)的異常調(diào)用占到一定的數(shù)量或者比例,達(dá)到了我們的判定條件,如在一個(gè)統(tǒng)計(jì)的時(shí)間窗口內(nèi),服務(wù)異常比例占比到達(dá)70%,觸發(fā)了服務(wù)熔斷,即所有的后續(xù)請(qǐng)求直接進(jìn)入降級(jí)邏輯,不再調(diào)用目標(biāo)訪問方法。

對(duì)外部流量的控制

首先搭建sentinel的運(yùn)行環(huán)境:

在 Sentinel官網(wǎng)頁(yè)面下載可執(zhí)行的jar文件,版本sentinel-dashboard-1.8.2.jar。下載完成后通過命令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar啟動(dòng) Sentinel 。通過 127.0.0.1:8080訪問 sentinel控制臺(tái),默認(rèn)的賬戶密碼均為sentinel

接著在項(xiàng)目中集成sentinel

pom.xml添加下列依賴

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

application.yml中添加如下配置

    spring:
      cloud:
     ?  sentinel:
     ? ?  transport:
     ? ? ? ?# sentinel api端口,默認(rèn)8719
     ? ? ?  port: 8719
     ? ? ? ?# dashboard地址
     ? ? ?  dashboard: localhost:8080

ConsumerController添加如下代碼

    @GetMapping("sentinel")
    @SentinelResource(
     ? ?value = "sentinel",
     ? ?blockHandler = "consumerSentinelResource_Blocked",
     ? ?fallback = "consumerSentinelResource_fallback")
    public String consumerSentinelResource() {
     ?//  if (Math.random() > 0.6 ){
     ?// ? ? System.out.println("執(zhí)行fallback降級(jí)邏輯");
     ?// ? ?  throw new RuntimeException("RuntimeException");
     ?//  }
     ? ?return "正常返回值";
    }
    ?
    public String consumerSentinelResource_Blocked(BlockException blockException){
     ? ?System.out.println("執(zhí)行BlockException降級(jí)邏輯");
     ? ?return new Date().toLocaleString() + "BlockException: 服務(wù)被降級(jí)";
    }
    ?
    public String consumerSentinelResource_fallback(){
     ? ?return new Date().toLocaleString() + ?"通用異常解決方法: 服務(wù)被降級(jí)";
    }

@SentinelResource 注解表明這是一個(gè)Sentinel資源。

  • value屬性:資源名稱必須填寫。
  • blockHandler:處理因觸發(fā)流控規(guī)則的請(qǐng)求拋出的BlockException,執(zhí)行的的降級(jí)方法

流控規(guī)則

啟動(dòng) sentinel并登錄控制臺(tái)后,側(cè)邊欄初始狀態(tài)下并沒有我們的服務(wù),這時(shí)需要我們?cè)L問一下服務(wù),隨便調(diào)用一個(gè)服務(wù)接口,側(cè)邊欄就會(huì)出現(xiàn)我們注冊(cè)的服務(wù)。

2.sentinel控制臺(tái)截圖

點(diǎn)開我們的服務(wù),在側(cè)邊欄有個(gè)流控規(guī)則按鈕,點(diǎn)擊流控規(guī)則,在頁(yè)面的右上角有一個(gè)新增流控規(guī)則按鈕,點(diǎn)擊此按鈕,就可以新增流控規(guī)則。

直接流控

直接流控是我們常用的流控,一般情況下直接添加即可。按照下圖添加流控規(guī)則:

3.直接流控截圖

規(guī)則說明:在每秒請(qǐng)求數(shù)超過1個(gè)時(shí),就觸發(fā)流控規(guī)則,即執(zhí)行consumerSentinelResource_Blocked()方法的邏輯,通過postman 調(diào)試接口即可得到下圖的結(jié)果:

4.觸發(fā)直接流控規(guī)則

關(guān)聯(lián)流控

如果兩個(gè)資源之間存在競(jìng)爭(zhēng)關(guān)系,如共享一個(gè)線程池或者數(shù)據(jù)庫(kù)連接池,這時(shí)候就可以使用關(guān)聯(lián)流控,此時(shí)在低優(yōu)先級(jí)的資源上設(shè)置流控規(guī)則,進(jìn)而使得高優(yōu)先級(jí)的資源獲得競(jìng)爭(zhēng)優(yōu)勢(shì),

例如:資源A和資源B存在競(jìng)爭(zhēng)關(guān)系,此時(shí)在資源A上設(shè)置流控規(guī)則和判斷閾值,此時(shí)當(dāng)高優(yōu)先級(jí)的請(qǐng)求數(shù)量達(dá)到判斷閾值時(shí),就會(huì)對(duì)低優(yōu)先級(jí)的資源進(jìn)行流控,

ConsumerController添加如下代碼:

    @SentinelResource(value = "condition")
    @GetMapping("condition")
    public String condition() {
     ? ?return "condition: 我是高優(yōu)先級(jí)的資源";
    }

在控制臺(tái)添加如下規(guī)則

5.配置關(guān)聯(lián)流控規(guī)則

ps:通過postman工具怎么都無法出現(xiàn)低優(yōu)先級(jí)服務(wù)降級(jí)的響應(yīng),于是乎我使用了一個(gè)python腳本模擬http請(qǐng)求,關(guān)聯(lián)流控規(guī)則就起作用了!腳本內(nèi)容如下

    import requests
     
    url = "http://127.0.0.1:10001/consumer/condition"
    url2 = "http://127.0.0.1:10001/consumer/sentinel"
    while(True):
     ? ?res = requests.get(url=url)
     ? ?res2 = requests.get(url=url2) 
     ? ?print("condition response:",res.text) ?# 返回請(qǐng)求結(jié)果
     ? ?print("sentinel response:",res2.text) ?# 返回請(qǐng)求結(jié)果
     ? ?print("------------------------------")

響應(yīng)結(jié)果如下圖

6.關(guān)聯(lián)流控規(guī)則

鏈路流控

在一個(gè)應(yīng)用中,對(duì)同一個(gè)資源有多條不同的訪問路徑時(shí),如果需要對(duì)訪問路徑限流,則可以選用鏈路流控。如下圖:

7.鏈路流控示意圖

query 和 query2 都能訪問到 resource, 如果想要對(duì)api/query2進(jìn)行流控,則此時(shí)可以選擇鏈路流控的方式。具體配置如下

8.配置鏈路流控規(guī)則

流控效果

快速失敗

在前面的示例中,所有的流控效果都是快速失敗,快速失敗是sentinel默認(rèn)的流控效果,即到達(dá)我們的設(shè)置的閾值之后就失敗。

Warm Up

這種方式實(shí)現(xiàn)了預(yù)熱的效果,即在設(shè)定的預(yù)熱時(shí)間內(nèi),閾值從起始閾值逐漸提升到我們?cè)O(shè)定的閾值,起始閾值的值為設(shè)定的 單機(jī)閾值 / 冷加載因子sentinel默認(rèn)的冷加載因子為 3。

9.Warm Up配置

以上圖的配置,則流控效果在 10s100 / 3 = 33 緩慢提升到 100。

內(nèi)部降級(jí)邏輯

降級(jí)方案

流控規(guī)則和流控效果是作用在外部流量的,而對(duì)自身服務(wù)而言,當(dāng)服務(wù)調(diào)用出現(xiàn)足夠多的異常時(shí),為保證服務(wù)的穩(wěn)定性,可采取服務(wù)熔斷策略,服務(wù)熔斷是多次異常調(diào)用的累積結(jié)果。

在上面的示例代碼中,我們?cè)谑褂?code>@SentinelResource注解時(shí),配置了blockHandler、 fallback這兩個(gè)屬性, 這兩個(gè)屬性的值都是編寫降級(jí)邏輯的,但是稍有不同。

blockHandler 只能處理服務(wù)拋出的異常時(shí)BlockException的情況,BlockExceptionSentinel組件配置的流控規(guī)則起作用時(shí)拋出的異常,即被當(dāng)請(qǐng)求被流控規(guī)則攔截時(shí),拋出的異常。

    public String consumerSentinelResource_Blocked(BlockException blockException){
     ? ?String s = new Date().toLocaleString() + "BlockException: 服務(wù)被降級(jí)";
     ? ?return s;
    }

在編寫blockHandler的方法時(shí),需要在參數(shù)列表的最后添加一個(gè)BlockException類型的參數(shù),否則降級(jí)邏輯不會(huì)起作用。

fallback使用場(chǎng)景是當(dāng)調(diào)用的方法拋出了除BlockException類型的其他運(yùn)行時(shí)異常,如代碼中分子為 0 拋出的java.lang.ArithmeticException: / by zero。

fallback適用于編寫通用的降級(jí)邏輯,fallback方法的編寫不需要添加額外參數(shù),和 controller 中的方法形參保持一致即可。

熔斷策略

sentinel中,定義了三種熔斷策略:

異常比例

在統(tǒng)計(jì)時(shí)長(zhǎng)指定的時(shí)間內(nèi),異常調(diào)用比例超過設(shè)置的比例閾值,且請(qǐng)求數(shù)滿足設(shè)置的最小請(qǐng)求數(shù),則進(jìn)行服務(wù)熔斷,直接進(jìn)入降級(jí)邏輯。如果請(qǐng)求數(shù)沒有滿足設(shè)置的最小請(qǐng)求數(shù),則即使高于這個(gè)比例也不會(huì)熔斷。如最小請(qǐng)求數(shù)是 10,比例為 0.5,即使前 9 次都失敗了,也不會(huì)熔斷。

異常數(shù)

在統(tǒng)計(jì)時(shí)長(zhǎng)指定的時(shí)間內(nèi),異常調(diào)用比例大于設(shè)置的請(qǐng)求數(shù),且請(qǐng)求數(shù)滿足設(shè)置的最小請(qǐng)求數(shù),則進(jìn)行服務(wù)熔斷,直接進(jìn)入降級(jí)邏輯。這里大于指的是加入設(shè)置的異常數(shù)是3,則熔斷發(fā)生在第四次失敗調(diào)用之后。

慢調(diào)用比例

在統(tǒng)計(jì)時(shí)間窗口內(nèi),請(qǐng)求響應(yīng)的時(shí)間大于了設(shè)置的 最大RT 時(shí)間的請(qǐng)求數(shù)所占全部請(qǐng)求數(shù)的比例超過了設(shè)置的比例閾值,且總請(qǐng)求數(shù)大于等于最小請(qǐng)求數(shù),則觸發(fā)熔斷規(guī)則。

最大RT是判斷慢請(qǐng)求的條件,不是觸發(fā)熔斷的條件。

熔斷狀態(tài)的轉(zhuǎn)換

Sentinel 的熔斷器有三個(gè)狀態(tài):關(guān)閉,全開,半開,在沒有達(dá)到觸發(fā)熔斷的條件時(shí),熔斷器處于關(guān)閉狀態(tài),當(dāng)達(dá)到熔斷開始的條件時(shí),熔斷器出處于全開狀態(tài),當(dāng)熔斷時(shí)長(zhǎng)結(jié)束時(shí),熔斷器不會(huì)立馬關(guān)閉,而是處于半開狀態(tài),此時(shí),下一個(gè)請(qǐng)求的狀態(tài)決定了是關(guān)閉還是全開,如果下一個(gè)請(qǐng)求請(qǐng)求成功,則關(guān)閉熔斷器,退出熔斷狀態(tài),如果失敗,則立馬進(jìn)入熔斷狀態(tài),不需要再次滿足設(shè)置的條件。

10.熔斷狀態(tài)轉(zhuǎn)換示意圖

需要說明的是:開源的Sentinel組件的配置的規(guī)則并沒有被持久化,因此當(dāng)我們重啟應(yīng)用或者重啟sentinel組件,都需要重新配置相關(guān)規(guī)則。

以上就是使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí)的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Sentinel 流控和服務(wù)降級(jí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot數(shù)據(jù)庫(kù)初始化datasource配置方式

    SpringBoot數(shù)據(jù)庫(kù)初始化datasource配置方式

    這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫(kù)初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • spring中jdbcTemplate.batchUpdate的幾種使用情況

    spring中jdbcTemplate.batchUpdate的幾種使用情況

    本文主要介紹了spring中jdbcTemplate.batchUpdate的幾種使用情況,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Spring Boot 的創(chuàng)建和運(yùn)行示例代碼詳解

    Spring Boot 的創(chuàng)建和運(yùn)行示例代碼詳解

    Spring Boot 的誕生是為了簡(jiǎn)化Spring程序的開發(fā),今天給大家介紹下Spring Boot 的創(chuàng)建和運(yùn)行,主要包括Spring Boot基本概念和springboot優(yōu)點(diǎn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解

    Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解

    二叉搜索樹作為一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時(shí)查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • Java詳解線上內(nèi)存暴漲問題定位和解決方案

    Java詳解線上內(nèi)存暴漲問題定位和解決方案

    本篇文章介紹了我在開發(fā)過程中遇到的線上內(nèi)存暴漲的問題,以及定位問題原因和解決該問題的過程及思路,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Guava的注解處理機(jī)制全面講解

    Guava的注解處理機(jī)制全面講解

    這篇文章主要為大家介紹了Guava的注解處理機(jī)制全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • SpringMVC核心技術(shù)

    SpringMVC核心技術(shù)

    這篇文章主要介紹了SpringMVC入門實(shí)例,在springmvc入門教程里算是比較不錯(cuò)的,結(jié)構(gòu)也比較完整,需要的朋友可以參考。希望可以幫助到你
    2021-07-07
  • Spring注解實(shí)現(xiàn)循環(huán)重試功能(適用場(chǎng)景分析)

    Spring注解實(shí)現(xiàn)循環(huán)重試功能(適用場(chǎng)景分析)

    這篇文章主要介紹了Spring注解實(shí)現(xiàn)循環(huán)重試功能,本篇主要簡(jiǎn)單介紹了Springboot中的Retryable的使用,主要的適用場(chǎng)景和注意事項(xiàng),當(dāng)需要重試的時(shí)候還是很有用的,需要的朋友可以參考下
    2023-04-04
  • 詳解Java比較器

    詳解Java比較器

    這篇文章主要介紹了Java比較器的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java實(shí)現(xiàn)寫入并保存txt文件的代碼詳解

    java實(shí)現(xiàn)寫入并保存txt文件的代碼詳解

    在本篇文章里小編給大家整理了關(guān)于java實(shí)現(xiàn)寫入并保存txt文件的代碼實(shí)例內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02

最新評(píng)論