近日,流控降级组件 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!
原文连接 本文为云栖社区原创内容,未经容许不得转载。