近日,流控降級組件 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
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 從 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 控制檯支持移除離線的機器和應用。用戶能夠在「機器列表」頁面手動剔除離線的機器實例,或者配置自動移除離線的機器和應用。支持的配置項:
感謝社區用戶 @jasonjoo2010 對該功能的貢獻。
除了上面的重要特性以外,Sentinel 1.5.0 還帶來了如下的特性和改進:
詳細信息請參考 Release Notes,歡迎你們使用並提出建議。
同時,咱們也很是歡迎你們參與社區貢獻。若您有意願參與社區貢獻,能夠參考 貢獻指南 來入門,或者在 good first issue
中挑選感興趣的 issue 來解決。咱們會發展貢獻較多的開發者成爲社區 Committer。Now start hacking!
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。