Spring社区上月发布了基于事件驱动的异步框架 reactor。当前reactor还在密集研发中,代码几天大变样,非常的不稳定,这2周还完全重写了它自己的reactor-tcp。sample code也跟不上。这里只选取其其中最最基本和核心的功能,让大家先睹为快。
一:核心:基于事件驱动。
事件注册:
//初始化环境变量,若无,会从默认的读取classpath下默认的default.properties 文件
Environment env = new Environment();
//创建一个Reactor,指定的dispatcher为eventLoop,(dispatcher 种类下面会再细说)
Reactor reactor = R.reactor().using(env).dispatcher("eventLoop").get();
//注册一个名为event的事件,事件为Consumer
reactor.on($("event"), new Consumer<Event<String>>() {
@Override
public void accept(Event<String> t) {
System.out.println("This is sample code" + t.getData());
}
});
事件发布(或者事件触发)
//传入一个String事件,事件的值为Hello World!
reactor.notify("event", new Event<String>("Hello World!"));
运行后的结果为: This is sample code!
由此一个最最简单的事件驱动程序就完成了。
二. Composable的使用
Reactor里另外一个核心的功能就是Composable,当一个业务有很多步阻塞调用的时候,在不用callback的情况下,可以应用Composable将其中的阻塞调用,分割成异步非阻塞执行。
我们想象一个应用场景,一个账号服务,需要根据一个accountId来拿到一个account的余额。业务上可能需要这么几步:
a) 验证是否是有效用户 --> 调用authService.isValidUser
b) 根据accountId拿到整个account信息 -->accountService.getAccountById
c) 传入account获得account balance --> billService.getAccountBalance
那么代码怎么实现的。最最简单的直观的就是顺序阻塞调用。
代码A
public Long getAccountBalance1(Integer accountId){
boolean auth = authService.isValidUser(accountId);
if(auth){
Account account = accountService.getAccountById(accountId);
if(account!=null){
return billService.getAccountBalance(account);
}
else{
return -1l;
}
}
else{
return -1l;
}
}
先不论代码的逻辑正确性,上述的代码肯定是吞吐量不高。为求改善,现改为异步调用。最简单的异步就是加callback
代码B:
public Long getAccountBalance1(Integer id){
final Integer accountId = id;
final Future<Long> balanceFuture;
authService.isValidUser(accountId, new ICallback(){
@Override
public void callback(Object value) {
boolean auth = (boolean)value;
if(auth){
accountService.getAccountById(accountId, new ICallback(){
@Override
public void callback(Object value) {
if(value!=null){
Account account = (Account)value;
Long balance = billService.getAccountBalance(account);
balanceFuture.setValue(balance);
}
}
});
}
}
});
return balanceFuture.get(3000,TimeUnit.MILLISECONDS);
}
这断代码没有测试过。但是可以明显的看到这里用了嵌套的callback,代码很难看,不优雅,并对代码有侵入(需要有一个callback的同名接口)。
那么用了Reactor Composable的代码又将会是如何呢,请看:
public Long getAccountBalance(Integer id){
final Integer accountId = id;
Composable<Long> c = S.each(Arrays.asList(accountId))
.using(new Environment())
.dispatcher("eventLoop")
.get()
.map(new Function<Integer, Boolean>(){
@Override
public Boolean apply(Integer accountId) {
return authService.isValidUser(accountId);
}
})
.map(new Function<Boolean,Account>(){
@Override
public Account apply(Boolean auth) {
if(auth){
return accountService.getAccountById(accountId);
}
return null;
}
}).map(new Function<Account,Long>(){
@Override
public Long apply(Account account) {
return billService.getAccountBalance(account);
}
});
try {
return c.await(3, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1l;
}
}
显然代码优雅了很多,没有代码侵入。但这些都不是关键。
关键是业务中的,a,b,c都被分割成一个独立的事件注册到了reactor,每一步都是独立的线程执行,并且在这个列子中,是顺序执行的,线程安全。
三:Dispatcher
最后这里再详细介绍下之前提到的Reactor的Dispatcher,dispatcher是reactor的核心,顾名思义,就是一个分发器,用作事件的分发,当一个事件到达,(即Reacot.notify被调用)最终会由dispatcher进行任务分发调度(dispatcher.dipatch)
Dispatcher根据线程和队列分为下面几种dispatcher,系统现在默认为SynchronousDispatcher(不知道以后会不会变,之前默认的是BlockingQueueDispatcher)
SynchronousDispatcher
当一个事件到达时,直接由reactor所在的线程直接执行
BlockingQueueDispatcher(eventloop)
事件到达时先存储在一个Blockingqueue中,再由统一的后台线程一一顺序执行
ThreadPoolExecutorDispatcher(threadpool)
事件达到时将事件交由线程池统一调度。该线程池为固定大小线程池,(Executors.newFixedThreadPool)线程大小由配置文件指定。
RingBufferDispatcher(ringbuffer)
该dispatcher是吞吐量最高,使用了名头比较响的lmax的Disruptor构建的ringBuffer作为事件存储数组,其实就是一个不断递增,并可覆盖之前值环。(大家可以关注下lmax disruptpr)还是比较有意思的。
分享到:
相关推荐
Spring Webflux是Spring框架的一个扩展,引入了反应式编程模型,允许开发者构建非阻塞的Web应用。 在讨论ChannelPool的设计实现时,我们聚焦于如何有效地管理和复用与服务器的连接。ChannelPool是Netty中的一个重要...
**Spring Reactor 深度解析** Spring Reactor 是一个强大的反应式编程库,它是 Spring Framework 的一部分,特别是在 Spring 5.0 及...在实践中,配合 Spring 框架的其他组件,可以构建出适应现代云环境的微服务架构。
我想看看新的闪亮(好吧,不是真的)Spring Reactor与Vert.x的比较 这两个软件包都是用Groovy编写的。 这个想法是将9 hash get命令发送给redis。 这是通过以下方式完成的: 在vert.x示例中,使用Vertx-Redis-...
spring 最近(2013年5月30日)发布了 spring 的异步事件框架 Reactor. 符合高性能 .耦合性低. 易于使用的原则. 因为刚推出,官方没有 和spring mvc中使用的示例.在写博客的时候发现无法上传附件.放到csdn这里.
7. **SpringCloud Gateway**:相较于Zuul,SpringCloud Gateway是更现代的API Gateway,它基于Spring Framework 5、Project Reactor和Spring Boot 2,提供了更高效的性能和更丰富的路由策略。 8. **SpringCloud ...
Spring框架是Java后端开发中的核心框架之一,它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力而著名。Spring5是该框架的一个重要版本,带来了许多新特性...
在IT行业中,Spring框架无疑是Java后端开发的重要支柱,它为开发者提供了丰富的功能和便利性。随着技术的发展,Spring框架也不断进化,引入了响应式编程的概念,这使得Spring能够更好地适应现代微服务架构和高并发...
Spring框架是Java EE开发中的核心组件,特别是在企业级应用中广泛应用。Spring 5.0.2版本是一个重要的更新,它提供了许多新特性和改进,旨在提高开发效率和应用程序的性能。下面将详细介绍Spring框架以及Spring ...
12. **Reactive编程**:Spring5引入了对Reactive Streams的支持,提供了Reactor项目,使得Spring框架可以处理非阻塞I/O和响应式编程。 以上知识点构成了Spring5框架的主要内容,通过学习和实践,开发者可以有效地...
Reactor 是一个强大的开源库,它是 Spring Framework 的一部分,用于构建高效的、响应式的应用程序。这个框架专注于异步处理和非阻塞编程,充分利用了 Java 8 和 Reactive Streams 规范。文档主要分为多个部分,详细...
Reactor 3参考文档,reactor 3是一个围绕Reactive Streams规范构建的库,它在JVM上引入了响应式编程的一个范例。目前Spring5 引入的Webflux就是reactor 3实现的一个响应式web框架
Spring5还引入了对反应式编程的支持,通过Project Reactor库,可以在Java中实现非阻塞、异步编程,以适应高并发场景。Spring WebFlux是Spring MVC的补充,提供了反应式编程的API。 此外,Spring5还加强了与微服务...
8. **Spring WebFlux**:Spring5引入了Reactor库,支持响应式编程模型,可以构建非阻塞、高并发的Web应用。WebFlux与Spring MVC并存,为开发者提供了更多选择。 9. **测试支持**:Spring提供了全面的测试支持,包括...
Spring 5 框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。这个框架以其灵活的依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)架构模式以及丰富的生态系统而闻名。Spring 5针对Java 8进行了...
Spring5引入了Reactor库,支持反应式编程模型。这允许开发人员创建非阻塞、异步的应用,以应对现代高性能、低延迟系统的需求。 7. **数据访问** Spring Data模块在Spring5中得到了更新,提供了对JPA、MongoDB和...
同时,Spring Reactor作为响应式编程框架,为Java开发者提供了强大的非阻塞处理能力。本文将深入探讨一个名为"mqtt-spring-reactor-sample"的项目,它巧妙地将MQTT与Project Reactor结合,构建了一个高效的实时通信...
【标题】"mydemo:Spring Reactor Webflux" 指的是一个使用Spring框架和Reactor Webflux构建的示例项目。Spring Reactor Webflux是Spring Framework的一部分,它支持响应式编程模型,允许开发人员创建非阻塞、高并发...
Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。5.1.3.RELEASE是Spring框架的一个稳定版本,包含了多个关键特性和改进。在这个版本中,Spring提供了对Java 11的支持,同时也优化了对...
在IT领域,Spring Reactor是Spring框架的一部分,它是一个非阻塞的事件驱动模型库,用于构建高性能、反应式应用程序。本文将深入探讨Spring Reactor的核心测试,帮助开发者理解如何有效地测试Reactor代码,并确保...
5. **spring-webflux-5.0.2.RELEASE-javadoc.jar**:随着反应式编程的流行,Spring 5引入了WebFlux模块,支持非阻塞的、基于Reactor的Web应用开发,适应高并发场景。 6. **spring-jdbc-5.0.2.RELEASE-javadoc.jar**...