Sentinel 1.5.0 正式發佈,引入 Reactive 支持

近日,流控降級組件 Sentinel 的又一個里程碑版本 1.5.0 正式發佈。react

該版本引入 Reactive 的支持,並提供多項新特性與改進。從 1.5.0 版本開始,Sentinel 僅支持 JDK 1.7 及以上版本,再也不支持 JDK 1.6。如今,咱們能夠利用 Java 7 的 try-with-resources 特性來更爲簡潔地使用 Sentinel API:git

// 1.5.0 版本開始能夠利用 try-with-resources 特性,自動 exit
try (Entry entry = SphU.entry("resourceName")) {
  // 被保護的業務邏輯
} catch (BlockException ex) {
  // 資源訪問阻止,被限流或被降級,在此處進行相應的處理操做
}

下面咱們來一塊兒探索一下 Sentinel 1.5.0 的新特性。github

Reactor 適配

Reactive 的事件驅動設計理念、流式函數式 API 使得開發者能夠更優雅地設計和編寫程序,而且在一些場景下能夠提高應用的吞吐量。愈來愈多的人開始用 RxJava 和 Reactor,Java 9 也將 Reactive Streams 的接口引入了 JDK,Spring 5.0 也引入了 Spring WebFlux / Project Reactor。能夠說 reactive 是 Java 社區將來的一個發展趨勢。web

Sentinel 1.5.0 引入了 Reactor 適配模塊 sentinel-reactor-adapter,從而具有了與 Spring WebFlux、Spring Cloud Gateway 等 reactive 框架的整合能力,應用範圍更加普遍。spring

Sentinel Reactor 適配分別針對 Mono 和 Flux 實現了對應的 Sentinel Operator,從而在各類事件觸發時匯入 Sentinel 的相關邏輯。同時 Sentinel 在上層提供了 SentinelReactorTransformer 用於在組裝期裝入對應的 operator,用戶使用時只須要經過 transform 操做符來進行變換便可:框架

someService.doSomething() // return type: Mono<T> or Flux<T>
   .transform(new SentinelReactorTransformer<>(resourceName)) // 在此處進行變換
   .subscribe();

Spring WebFlux 適配

Spring 從 5.0 開始引入了響應式的 Web 框架 —— Spring WebFlux,而且 Spring Boot 2.0 版本開始也支持 Spring WebFlux。Spring WebFlux 頂層基於 Reactor 抽象出了一套 reactive 的接口和適配器,底層能夠基於 Netty、異步 Servlet 等實現 Web Server。與傳統 Servlet 容器相比,Spring WebFlux 在不少 I/O 密集型的場景下能夠提高應用的吞吐量,所以愈來愈多的用戶開始使用 Spring WebFlux。異步

Sentinel 1.5.0 提供與 Spring WebFlux 的整合模塊 sentinel-spring-webflux-adapter,從而 Reactive Web 應用也能夠利用 Sentinel 的流控降級來保障穩定性。該整合模塊基於 Sentinel Reactor Adapter 實現。ide

在使用 sentinel-spring-webflux-adapter 的時候,咱們只須要引入相應依賴,而後引入對應的配置便可生效:函數

@Configuration
public class WebFluxConfig {

    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public WebFluxConfig(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                         ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(-1)
    public SentinelBlockExceptionHandler sentinelBlockExceptionHandler() {
        // 註冊 SentinelBlockExceptionHandler 處理流控降級異常
        return new SentinelBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    @Bean
    @Order(-1)
    public SentinelWebFluxFilter sentinelWebFluxFilter() {
        // 註冊 SentinelWebFluxFilter
        return new SentinelWebFluxFilter();
    }
}

Spring Cloud Alibaba Sentinel 將來也會支持 Spring WebFlux 的自動配置,無需編寫配置類,引入對應依賴便可生效。this

滑動窗口統計結構的改進

Sentinel 1.5.0 對底層的滑動窗口統計結構進行了升級,添加了「佔用」機制,容許在當前 QPS 已經達到限流閾值時,同個資源高優先級的請求提早佔用將來時間窗口的配額數,等待到對應時間窗口到達時直接經過,從而能夠實現「最終經過」的效果而不是被當即拒絕;而同個資源低優先級的請求則不能佔用將來的配額,閾值達到時就會被限流。

Sentinel 1.5.0 引入了 FutureBucketLeapArray,這是一種特殊的滑動窗口,僅維持當前時間之後的格子,從而能夠用於統計將來被預先佔用的配額數目。Sentinel 將普通的滑動窗口與 FutureBucketLeapArray 組合成可佔用的滑動窗口 OccupiableBucketLeapArray,從而實現了「部分高優先級請求最終經過」的效果。咱們能夠調用 SphU.entryWithPriority(resourceName) 來標識本次調用爲高優先級(prioritized = true)。

控制檯支持剔除離線機器和應用

從 1.5.0 版本開始,Sentinel 控制檯支持移除離線的機器和應用。用戶能夠在「機器列表」頁面手動剔除離線的機器實例,或者配置自動移除離線的機器和應用。支持的配置項:

  • 機器失聯斷定的超時時間(默認 1 分鐘)
  • 當機器失聯超過必定時長,是否自動刪除失聯節點
  • 當應用全部機器所有失聯,而且最近心跳時間超出指定時長,自動在頁面隱藏或後臺剔除該應用

感謝社區用戶 @jasonjoo2010 對該功能的貢獻。

其它

除了上面的重要特性以外,Sentinel 1.5.0 還帶來了如下的特性和改進:

  • 系統自適應限流支持 CPU usage 指標。
  • transport 模塊引入 ApiCommandHandler,用戶能夠經過此命令查看全部可用的 API 以及相應描述。
  • Sentinel 控制檯增長權限控制接口,用戶能夠自行擴展實現權限控制的需求。

詳細信息請參考 Release Notes,歡迎你們使用並提出建議。

同時,咱們也很是歡迎你們參與社區貢獻。若您有意願參與社區貢獻,能夠參考 貢獻指南 來入門,或者在 good first issue 中挑選感興趣的 issue 來解決。咱們會發展貢獻較多的開發者成爲社區 Committer。Now start hacking!


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索