最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud?Sentinel服務保護詳解(請求限流、線程隔離、服務熔斷)

 更新時間:2025年05月09日 10:00:08   作者:昊坤說不出的夢  
這篇文章主要介紹了SpringCloud?Sentinel服務保護詳解(請求限流、線程隔離、服務熔斷),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

開發(fā)環(huán)境

環(huán)境:Java 11、MySQL 8.0、OpenFeign、sentinel-dashboard 1.8.6

為什么要保護

微服務在遠程調用時,可能存在以下問題:

1. 業(yè)務健壯性:

如,購物車服務、商品服務之間互相調用,當一方掛掉,需要做兜底處理從而優(yōu)化用戶體驗

假設,查詢購物車接口需要調用商品服務,商品服務掛了導致查詢失敗,但從業(yè)務角度為了提高用戶體驗,即使查詢失敗,購物車列表也應該展示出來(展示空數(shù)據(jù)/緩存數(shù)據(jù))。而不是丟給用戶一堆報錯信息。

2. 級聯(lián)失?。ㄑ┍绬栴}):

如,高峰期時查詢接口并發(fā)高,其他接口并發(fā)?。挥捎诟卟l(fā)接口占用過多的Tomcat連接,可能導致所有接口都延遲變高、長時間阻塞甚至失敗。

以此類推,當互相調用的服務間出現(xiàn)問題時,可能導致整個集群都不可用

Sentinel 實現(xiàn)保護

提示:這里可以添加要學的內容

例如:

  1. 搭建 Java 開發(fā)環(huán)境
  2. 掌握 Java 基本語法
  3. 掌握條件語句
  4. 掌握循環(huán)語句

策略1:請求限流

理解:限制/控制接口的請求流量

并發(fā)太高是導致服務故障的重要原因。

因此通過限制或控制接口的并發(fā)流量,避免服務因流量激增而出現(xiàn)故障。

策略2:線程隔離

理解:提前分配好資源(線程)給業(yè)務接口

當一個業(yè)務接口響應時間長,而且并發(fā)高時,就可能耗盡服務器的線程資源,導致服務內的其它接口受到影響。

因此為了降低/減小這種影響,使用線程隔離,其思想?yún)⒖寂摫谀P?/p>

如,查詢接口訪問頻繁,會無休止地占用更多的線程資源,而導致其他業(yè)務的線程資源緊張或無法分配。

線程隔離:鎖死查詢接口20線程,其他業(yè)務10線程,就算查詢接口并發(fā)再高,只給20線程資源去調用,確保了其他業(yè)務不被影響。

策略3:服務熔斷

理解:對故障/速度慢的接口進行暫時切斷,并提供一個友好提示以優(yōu)化用戶體驗

服務熔斷主要有兩點:

  • 編寫服務降級邏輯:調用失敗后的處理邏輯,可拋出異常/友好提示/默認數(shù)據(jù)/緩存數(shù)據(jù)。
  • 異常統(tǒng)計和熔斷:統(tǒng)計異常比例,當比例過高表明該接口會影響到其它服務,應該拒絕調用該接口,而是直接走降級邏輯。

Sentinel 流量控制

Sentinel 主要有兩部分

  • 核心庫(Jar包):直接引入到pom.xml就生效,在項目中可以編程式編寫限流、隔離、熔斷等規(guī)則。
  • 控制臺(DashBoard):負責管理推送規(guī)則、監(jiān)控、管理機器信息等。

依賴引入:

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

控制臺啟動:

下載:控制臺jar包
啟動:java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

配置application.yaml

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 開啟請求方式前綴(為了區(qū)分GET/POST/DELETE等請求)

配置策略

細節(jié)1:需要觸發(fā)一次請求才會在Sentinel面板看到該接口的簇點
細節(jié)2:默認直接在面板上的配置是臨時的,重啟服務后配置就清空了

具體的流控規(guī)則需要根據(jù)業(yè)務來進行設置

Sentinel 服務熔斷

問題1:當接口觸發(fā)Sentinel配置的流控規(guī)則時,拋出異常,用戶體驗不佳

解決方案:降級處理,展示空數(shù)據(jù)/緩存的舊數(shù)據(jù)

問題2:當A接口需要遠程調用B,而B延遲較高,拖慢了A的服務,用戶體驗差

解決方案:熔斷慢接口,直接停止使用B接口,走降級邏輯

本次練習采用的是OpenFeign遠程調用,使用遠程調用主要有兩種方式

  1. 方式一:FallbackClass,無法對遠程調用的異常做處理
  2. 方式二:FallbackFactory,可以對遠程調用的異常做處理,我們一般選擇這種方式。

故使用更為靈活的FallbackFactory

首先配置降級邏輯:返回空集合

@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("遠程調用ItemClient#queryItemByIds方法出現(xiàn)異常,參數(shù):{}", ids, cause);
                // 查詢購物車允許失敗,查詢失敗,返回空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("扣減商品庫存失敗!",cause);
                // 庫存扣減業(yè)務需要觸發(fā)事務回滾,查詢失敗,拋出異常
                throw new BizIllegalException(cause);
            }
        };
    }
}

將降級處理邏輯注冊成@Bean

 /**
 * Feign配置類
 */
public class DefaultFeignConfig {
    @Bean
    public ItemClientFallback itemClientFallback(){
        return new ItemClientFallback();
    }
}

在遠程調用的注解處配置:失敗處理邏輯的類

/**
 * 遠程調用商品服務
 */
@FeignClient(value = "item-service",fallbackFactory = ItemClientFallback.class)
public interface ItemClient {
...
}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MyBatis動態(tài)SQL表達式詳解

    MyBatis動態(tài)SQL表達式詳解

    動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關于Mybatis動態(tài)SQL特性的相關資料,文字通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • log4j2 項目日志組件的實例代碼

    log4j2 項目日志組件的實例代碼

    下面小編就為大家分享一篇log4j2 項目日志組件的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java中使用Closeable接口自動關閉資源詳解

    Java中使用Closeable接口自動關閉資源詳解

    這篇文章主要介紹了Java中使用Closeable接口自動關閉資源詳解,Closeable接口繼承于AutoCloseable,主要的作用就是自動的關閉資源,其中close()方法是關閉流并且釋放與其相關的任何方法,如果流已被關閉,那么調用此方法沒有效果,需要的朋友可以參考下
    2023-12-12
  • Mybatis返回Map數(shù)據(jù)方式示例

    Mybatis返回Map數(shù)據(jù)方式示例

    這篇文章主要為大家介紹了Mybatis返回Map數(shù)據(jù)方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解DES加密算法的原理與Java實現(xiàn)

    詳解DES加密算法的原理與Java實現(xiàn)

    DES 加密,是對稱加密。對稱加密,顧名思義,加密和解密的運算全都是使用的同樣的秘鑰。這篇文章主要為大家講講DES加密算法的原理與Java實現(xiàn),需要的可以參考一下
    2022-10-10
  • JavaBean四個作用域范圍的詳解

    JavaBean四個作用域范圍的詳解

    這篇文章主要介紹了JavaBean四個作用域范圍的詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    這篇文章主要介紹了Java 多線程并發(fā)AbstractQueuedSynchronizer詳情,文章圍繞主題展開想象的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • MyBatis中獲取Mysql數(shù)據(jù)庫插入記錄的主鍵值的實現(xiàn)

    MyBatis中獲取Mysql數(shù)據(jù)庫插入記錄的主鍵值的實現(xiàn)

    本文主要介紹了MyBatis中獲取Mysql數(shù)據(jù)庫插入記錄的主鍵值的實現(xiàn),包含了三種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Java預覽PDF時的文件名稱問題及解決

    Java預覽PDF時的文件名稱問題及解決

    這篇文章主要介紹了Java預覽PDF時的文件名稱問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringCache使用案例詳解

    SpringCache使用案例詳解

    這篇文章主要介紹了SpringCache使用案例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11

最新評論

宜良县| 富民县| 平昌县| 横山县| 金门县| 大关县| 巴里| 昌乐县| 萍乡市| 资阳市| 阜城县| 潜山县| 宝坻区| 佛冈县| 建阳市| 闽清县| 固安县| 荣昌县| 甘南县| 永平县| 金乡县| 隆林| 金堂县| 敦化市| 顺平县| 烟台市| 牙克石市| 绥滨县| 邢台县| 平乡县| 阜新| 文安县| 肥乡县| 沾益县| 全椒县| 富裕县| 新竹县| 泾川县| 梁河县| 铁岭县| 山西省|