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

Spring?Boot?Reactor?整合?Resilience4j詳析

 更新時間:2022年09月22日 14:25:24   作者:六七十三  
這篇文章主要介紹了Spring?Boot?Reactor整合Resilience4j詳析,文章通過引入pom包展開詳細介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下

1 引入 pom 包

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-all</artifactId>
</dependency>
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
</dependency>

2 配置說明

2.1 限流 ratelimiter

兩個限流配置:backendA 1s 中最多允許 10 次請求;

backendB 每 500ms 最多允許 6 次請求。

resilience4j.ratelimiter:
  instances:
    backendA:
      limitForPeriod: 10
      limitRefreshPeriod: 1s
      timeoutDuration: 10ms
      registerHealthIndicator: true
      eventConsumerBufferSize: 100
    backendB:
      limitForPeriod: 6
      limitRefreshPeriod: 500ms
      timeoutDuration: 3s
配置屬性默認值描述
timeoutDuration5【s】一個線程等待許可的默認等待時間
limitRefreshPeriod500【ns】限制刷新的周期。在每個周期之后,速率限制器將其權限計數(shù)設置回 limitForPeriod 值
limitForPeriod50一個 limitRefreshPeriod (周期)允許訪問的數(shù)量(許可數(shù)量)

2.2 重試 retry

注意指定需要重試的異常,不是所有的異常重試都有效。比如 DB 相關校驗異常,如唯一約束等,重試也不會成功的。

重試配置:

resilience4j.retry:
  instances:
    backendA:
      maxAttempts: 3
      waitDuration: 10s
      enableExponentialBackoff: true
      exponentialBackoffMultiplier: 2
      retryExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException

    backendB:
      maxAttempts: 3
      waitDuration: 10s
      retryExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException
配置屬性默認值描述
maxAttempts3最大重試次數(shù)(包括第一次)
waitDuration500【ms】兩次重試之間的等待間隔
intervalFunctionnumOfAttempts -> waitDuration修改失敗后等待間隔的函數(shù)。默認情況下,等待時間是個常量。
retryOnResultPredicateresult->false配置一個判斷結果是否應該重試的 predicate 函數(shù)。如果結果應該重試,Predicate 必須返回 true,否則它必須返回 false。
retryExceptionPredicatethrowable -> true和 retryOnResultPredicate 類似,如果要重試,Predicate 必須返回true,否則返回 false。
retryExceptions需要重試的異常類型列表
ignoreExceptions不需要重試的異常類型列表
failAfterMaxAttemptsfalse當重試達到配置的 maxAttempts 并且結果仍未通過 retryOnResultPredicate 時啟用或禁用拋出 MaxRetriesExceededException 的布爾值
intervalBiFunction(numOfAttempts, Either<throwable, result>) -> waitDuration根據(jù) maxAttempts 和結果或異常修改失敗后等待間隔時間的函數(shù)。與 intervalFunction 一起使用時會拋出 IllegalStateException。

2.3 超時 TimeLimiter

超時配置:

resilience4j.timelimiter:
  instances:
    backendA:
      timeoutDuration: 2s
      cancelRunningFuture: true
    backendB:
      timeoutDuration: 1s
      cancelRunningFuture: false

超時配置比較簡單,主要是配置 timeoutDuration 也就是超時的時間。

cancelRunningFuture 的意思是:是否應該在運行的 Future 調用 cancel 去掉調用。

2.4 斷路器 circuitbreaker

斷路器有幾種狀態(tài):關閉、打開、半開。注意:打開,意味著不能訪問,會迅速失敗。

CircuitBreaker 使用滑動窗口來存儲和匯總調用結果。您可以在基于計數(shù)的滑動窗口和基于時間的滑動窗口之間進行選擇。基于計數(shù)的滑動窗口聚合最后 N 次調用的結果。基于時間的滑動窗口聚合了最后 N 秒的調用結果。

斷路器配置:

resilience4j.circuitbreaker:
  instances:
    backendA:
      // 健康指標參數(shù),非斷路器屬性
      registerHealthIndicator: true
      slidingWindowSize: 100
配置屬性默認值描述
slidingWindowSize100記錄斷路器關閉狀態(tài)下(可以訪問的情況下)的調用的滑動窗口大小
failureRateThreshold50(百分比)當失敗比例超過 failureRateThreshold 的時候,斷路器會打開,并開始短路呼叫
slowCallDurationThreshold60000【ms】請求被定義為慢請求的閾值
slowCallRateThreshold100(百分比)慢請求百分比大于等于該值時,打開斷路器開關
permittedNumberOfCalls10半開狀態(tài)下允許通過的請求數(shù)
maxWaitDurationInHalfOpenState0配置最大等待持續(xù)時間,該持續(xù)時間控制斷路器在切換到打開之前可以保持在半開狀態(tài)的最長時間。

值 0 表示斷路器將在 HalfOpen 狀態(tài)下無限等待,直到所有允許的調用都已完成。

2.5 壁倉 bulkhead

resilience4j 提供了兩種實現(xiàn)壁倉的方法:

  • SemaphoreBulkhead 使用 Semaphore 實現(xiàn)
  • FixedThreadPoolBulkhead 使用有界隊列和固定線程池實現(xiàn)
resilience4j.bulkhead:
  instances:
    backendA:
      maxConcurrentCalls: 10
    backendB:
      maxWaitDuration: 10ms
      maxConcurrentCalls: 20

resilience4j.thread-pool-bulkhead:
  instances:
    backendC:
      maxThreadPoolSize: 1
      coreThreadPoolSize: 1
      queueCapacity: 1

2.5.1 SemaphoreBulkhead

配置屬性默認值描述
maxConcurrentCalls25允許的并發(fā)執(zhí)行的數(shù)量
maxWaitDuration0嘗試進入飽和隔板時線程應被阻止的最長時間

2.5.2 FixedThreadPoolBulkhead

配置屬性默認值描述
maxThreadPoolSizeRuntime.getRuntime().availableProcessors()線程池最大線程個數(shù)
coreThreadPoolSizeRuntime.getRuntime().availableProcessors()-1線程池核心線程個數(shù)
queueCapacity100線程池隊列容量
keepAliveDuration20【ms】線程數(shù)超過核心線程數(shù)之后,空余線程在終止之前等待的最長時間

3 使用

3.1 配置

在 application.yml 文件中添加以下 resilience4j 配置:

resilience4j.circuitbreaker:
  instances:
    backendA:
      registerHealthIndicator: true
      slidingWindowSize: 100

resilience4j.retry:
  instances:
    backendA:
      maxAttempts: 3
      waitDuration: 10s
      enableExponentialBackoff: true
      exponentialBackoffMultiplier: 2
      retryExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException

    backendB:
      maxAttempts: 3
      waitDuration: 10s
      retryExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException


resilience4j.bulkhead:
  instances:
    backendA:
      maxConcurrentCalls: 10
    backendB:
      maxWaitDuration: 10ms
      maxConcurrentCalls: 20

resilience4j.thread-pool-bulkhead:
  instances:
    backendC:
      maxThreadPoolSize: 1
      coreThreadPoolSize: 1
      queueCapacity: 1

resilience4j.ratelimiter:
  instances:
    backendA:
      limitForPeriod: 10
      limitRefreshPeriod: 1s
      timeoutDuration: 10ms
      registerHealthIndicator: true
      eventConsumerBufferSize: 100
    backendB:
      limitForPeriod: 6
      limitRefreshPeriod: 500ms
      timeoutDuration: 3s

resilience4j.timelimiter:
  instances:
    backendA:
      timeoutDuration: 2s
      cancelRunningFuture: true
    backendB:
      timeoutDuration: 1s
      cancelRunningFuture: false

3.2 使用注解實現(xiàn)

直接在需要限流的方法上增加注解@RateLimiter 實現(xiàn)限流;增加注解@Retry 實現(xiàn)重試;增加注解 @CircuitBreaker 熔斷;增加注解 @Bulkhead 實現(xiàn)壁倉。name 屬性中分別填寫限流器、重試、熔斷、壁倉組件的名字。

@Bulkhead(name = "backendA")
@CircuitBreaker(name = "backendA")
@Retry(name = "backendA")
@RateLimiter(name = "backendA")
public Mono<List<User>> list() {
  long startTime = System.currentTimeMillis();
  return Mono.fromSupplier(() -> {
        return userRepository.findAll();
      }).doOnError(e -> {
        // 打印異常日志&增加監(jiān)控(自行處理)
        logger.error("list.user.error, e", e);
      })
      .doFinally(e -> {
        // 耗時 & 整體健康
        logger.info("list.user.time={}, ", System.currentTimeMillis() - startTime);
      });
}
  
@Bulkhead(name = "backendA")
@CircuitBreaker(name = "backendA")//最多支持10個并發(fā)量
@Retry(name = "backendA")//使用 backendA 重試器,如果拋出 IOException 會重試三次。
@RateLimiter(name = "backendA")// 限流 10 Qps
public Mono<Boolean> save(User user) {
  long startTime = System.currentTimeMillis();
  return Mono.fromSupplier(() -> {
        return userRepository.save(user) != null;
      })
      .doOnError(e -> {
        // 打印異常日志&增加監(jiān)控(自行處理)
        logger.error("save.user.error, user={}, e", user, e);
      })
      .doFinally(e -> {
        // 耗時 & 整體健康
        logger.info("save.user.time={}, user={}", user, System.currentTimeMillis() - startTime);
      });
}

注意:以上所有組件,都支持自定義。

到此這篇關于Spring Boot Reactor 整合 Resilience4j詳析的文章就介紹到這了,更多相關Spring Boot Reactor 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JDBC數(shù)據(jù)源連接池配置及應用

    JDBC數(shù)據(jù)源連接池配置及應用

    這篇文章主要介紹JDBC建立數(shù)據(jù)庫連接的兩種方式,使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,效率更高,推薦使用,希望能給大家做一個參考。
    2016-06-06
  • SpringBoot多文件分布式上傳功能實現(xiàn)

    SpringBoot多文件分布式上傳功能實現(xiàn)

    本文詳細介紹了如何在SpringBoot中實現(xiàn)多文件分布式上傳,并用代碼給出了相應的實現(xiàn)思路和實現(xiàn)步驟,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • java 教你如何給你的頭像添加一個好看的國旗

    java 教你如何給你的頭像添加一個好看的國旗

    這篇文章主要介紹了java 教你如何給你的頭像添加一個好看的國旗,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • java按豎線分割的實現(xiàn)

    java按豎線分割的實現(xiàn)

    在Java中,我們可以使用split()方法按豎線分割字符串,本文將介紹如何使用Java中的字符串分割方法來按豎線進行分割,同時提供代碼示例來幫助讀者理解,感興趣的可以了解一下
    2024-01-01
  • Spring事件監(jiān)聽機制使用和原理解析

    Spring事件監(jiān)聽機制使用和原理解析

    Spring的監(jiān)聽機制基于觀察者模式,就是就是我們所說的發(fā)布訂閱模式,這種模式可以在一定程度上實現(xiàn)代碼的解耦,本文將從原理上解析Spring事件監(jiān)聽機制,需要的朋友可以參考下
    2023-06-06
  • 圖文詳解JAVA實現(xiàn)快速排序

    圖文詳解JAVA實現(xiàn)快速排序

    這篇文章主要給大家介紹了關于JAVA實現(xiàn)快速排序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Spring Boot常見外部配置文件方式詳析

    Spring Boot常見外部配置文件方式詳析

    這篇文章主要給大家介紹了關于Spring Boot常見外部配置文件方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • maven?grpc整合springboot?demo

    maven?grpc整合springboot?demo

    這篇文章主要為大家介紹了基于maven?grpc整合springboot?demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • 淺談JSONObject的使用及示例代碼(JSON解析)

    淺談JSONObject的使用及示例代碼(JSON解析)

    這篇文章主要介紹了淺談JSONObject的使用及示例代碼(JSON解析),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java并發(fā)編程之顯式鎖機制詳解

    Java并發(fā)編程之顯式鎖機制詳解

    這篇文章主要為大家詳細介紹了Java并發(fā)編程之顯式鎖機制的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

报价| 孟村| 青阳县| 始兴县| 长阳| 尉犁县| 合山市| 泸州市| 青龙| 巴林右旗| 双城市| 饶阳县| 长春市| 永修县| 赣州市| 社旗县| 恩施市| 两当县| 奉化市| 洮南市| 汪清县| 新民市| 呼伦贝尔市| 花莲市| 磐安县| 永川市| 渭源县| 九龙城区| 沛县| 望江县| 微山县| 保靖县| 崇州市| 确山县| 宜阳县| 昌黎县| 祥云县| 延吉市| 合作市| 玉山县| 汾阳市|