近日,流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布。

该版本引入 Reactive 的支持,并提供多项新特性与改进。从 1.5.0 版本开始,Sentinel 仅支持 JDK 1.7 及以上版本,不再支持 JDK 1.6。现在,我们可以利用 Java 7 的 try-with-resources 特性来更为简洁地使用 Sentinel API:

// 1.5.0 版本开始可以利用 try-with-resources 特性,自动 exit
try (Entry entry = SphU.entry("resourceName")) {
// 被保护的业务逻辑
} catch (BlockException ex) {
// 资源访问阻止,被限流或被降级,在此处进行相应的处理操作
}

下面我们来一起探索一下 Sentinel 1.5.0 的新特性。

Reactor 适配

Reactive 的事件驱动设计理念、流式函数式 API 使得开发者可以更优雅地设计和编写程序,并且在一些场景下可以提升应用的吞吐量。越来越多的人开始用 RxJava 和 Reactor,Java 9 也将 Reactive Streams 的接口引入了 JDK,Spring 5.0 也引入了 Spring WebFlux / Project Reactor。可以说 reactive 是 Java 社区未来的一个发展趋势。

Sentinel 1.5.0 引入了 Reactor 适配模块 sentinel-reactor-adapter,从而具备了与 Spring WebFlux、Spring Cloud Gateway 等 reactive 框架的整合能力,应用范围更加广泛。

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 实现。

在使用 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 的自动配置,无需编写配置类,引入对应依赖即可生效。

滑动窗口统计结构的改进

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!


本文作者:中间件小哥

原文链接

本文为云栖社区原创内容,未经允许不得转载。

Sentinel 1.5.0 正式发布,引入 Reactive 支持的更多相关文章

  1. Sentinel 1.7.0 发布,支持 Envoy 集群流量控制

    流控降级中间件Sentinel 1.7.0版本正式发布,引入了 Envoy 集群流量控制支持.properties 文件配置.Consul/Etcd/Spring Cloud Config 动态数据源 ...

  2. 全球首发-基于.NET 6长线支持Zoomla!逐浪CMS v8.6.0正式发布

    传送门: https://www.z01.com/down/3778.shtml 全新Zoomla!逐浪CMS v8.6.0 全于首个基于.net 6长线支持的CMS-Zoomla!逐浪CMS v8. ...

  3. Spring Boot 2.2.0 正式发布,支持 JDK 13!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 推荐阅读: Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Centr ...

  4. CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

    CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF https://devblogs.microsoft.com/dotnet/corewcf-v1-relea ...

  5. Spring Boot 2.0正式发布,新特性解读

    作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...

  6. AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!

    文章更新: AppBox v6.0中实现子页面和父页面的复杂交互 AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox ...

  7. Apache Spark2.0正式发布

    Apache Spark2.0正式发布 7月26日起Databricks开始提供Apache Spark 2.0的下载,这个版本是基于社区在过去两年的经验总结而成,不但加入了用户喜爱的功能,也修复了之 ...

  8. avalon1.0正式发布

    2013年最后的收成:avalon1.0正式发布 大半年前我就说过,MVVM是前端究极的解决方案,因此之后我大多数时间都在折腾avalon,成立了专门的QQ群与感兴趣的一起讨论.感谢第一批吃螃蟹的人, ...

  9. Angular4.0.0正式发布,附新特性及升级指南

    本文首发地址:Angular4.0.0正式发布,附新特性及升级指南 作者|孙薇 编辑|尾尾 经历了6个RC版本之后,Angular项目组终于发布了新版,即正式版 Angular 4.0.0.新版的 A ...

随机推荐

  1. 关于mysql8授权的问题,mysql萌新小白采坑记录

    记录本人第一次使用mysql时踩的坑,因为我从官网下载最新的版本8.0.15msi版本的,直接下一步下一步安装完成之后,本地访问正常,然后服务器安装访问也正常.然后本地连接服务器上的mysql时报错. ...

  2. 表碎片处理方法OPTIMIZE

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  3. 转:Linux fork与vfork的深入分析

    源地址:http://linux.chinaitlab.com/c/831529.html 一)fork的概述 .操作系统对进程的管理,是通过进程表完成的.进程表中的每一个表项,记录的是当前操作系统中 ...

  4. java基础之集合(Set,Map,List)总结

    一.Collection接口 1.Collection接口两个子接口     -List接口         -ArrayList:         -Vector:         -LinkedL ...

  5. jmeter体系结构

    jmeter体系结构 jmeter体系结构: 1.取样器.断言.监听器组合在一起就可以帮助我们完成发送请求.验证结果及记录结果三项工作 (1)取样器的访问路径:[测试计划]---[线程组]       ...

  6. css3新特性概览

    一.特性 1.强大的选择器 2.半透明度效果的实现 3.多栏布局 4.多背景图 css3允许背景属性设置多个属性值,如:background-image,background-repeat,backg ...

  7. Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他

    本文主要讲解主节点部分重同步的实现,以及主从复制中的其他功能.本文是Redis主从复制机制的最后一篇文章. 主节点在收到从节点发来的PSYNC命令之前,主节点的部分重同步流程,与完全重同步流程是一样的 ...

  8. Wsgi研究

    //转载自http://blog.kenshinx.me/blog/wsgi-research/ wsgi是一个搞web开发的pythoner必须了解的内容,之前也零散的看过一些文章,但总感觉好多概念 ...

  9. Web应用托管服务(Web+)隐藏的十个上云最佳姿势

    随着云计算浪潮的推进,技术架构云化已经成为大势所趋.特别是最近由CNCF推动的云原生概念,将符合云原生标准的各种开源技术方案推向了前所未有的高度.在这一波浪潮的推动下,越来越多的企业开始了自身的数字化 ...

  10. TZ_08_maven把第三方 jar 包放入本地仓库或私服

    --安装第三方jar包到本地仓库 需求:首先下载jar包并且找到对应的 -DgroupId=? -DartifactId=? -Dversion=? -Dpackaging=jar  -Dfile=j ...