引子:被誉为“中国大数据第一人”的涂子沛先生在其成名做《数据之巅》里提到,摩尔定律、社交媒体、数据挖掘是大数据的三大成因。IBM的研究称,整我的类文明所得到的所有数据中,有90%是过去两年内产生的。在此背景下,包括NoSQL,Hadoop, Spark, Storm, Kylin在内的大批新技术应运而生。其中以RxJava和Reactor为表明的响应式(Reactive)编程技术针对的就是经典的大数据4V定义(Volume,Variety,Velocity,Value)中的Velocity,即高并发问题,而在即将发布的Spring 5中,也引入了响应式编程的支持。在接下来的几周,我会围绕响应式编程分三期与你分享个人一些学习心得。做为第一篇,首先从Spring 5谈起。html
和敏捷宣言同样,提及响应式编程,必先提到响应式宣言。java
We want systems that are Responsive, Resilient, Elastic and Message Driven. We call these Reactive Systems. - The Reactive Manifestoreact
图片出处:The Reactive Manifestogit
不知道是否是为了向敏捷宣言致敬,响应式宣言中也包含了4组关键词:程序员
Responsive: 可响应的。要求系统尽量作到在任什么时候候都能及时响应。github
Resilient: 可恢复的。要求系统即便出错了,也能保持可响应性。web
Elastic: 可伸缩的。要求系统在各类负载下都能保持可响应性。spring
Message Driven: 消息驱动的。要求系统经过异步消息链接各个组件。编程
能够看到,对于任何一个响应式系统,首先要保证的就是可响应性,不然就称不上是响应式系统。从这个意义上来讲,动不动就蓝屏的Windows系统显然不是一个响应式系统。并发
PS: 若是你赞同响应式宣言,不妨到官网)上留下的你电子签名,个人编号是18989,试试看能不能找到我。
做为Java世界首个响应式Web框架,Spring 5最大的亮点莫过于提供了完整的端到端响应式编程的支持。
图片出处:Spring Framework Reference Documentation
左侧是传统的基于Servlet的Spring Web MVC框架,右侧是5.0版本新引入的基于Reactive Streams的Spring WebFlux框架,从上到下依次是Router Functions,WebFlux,Reactive Streams三个新组件。
Router Functions: 对标@Controller,@RequestMapping等标准的Spring MVC注解,提供一套函数式风格的API,用于建立Router,Handler和Filter。
WebFlux: 核心组件,协调上下游各个组件提供响应式编程支持。
Reactive Streams: 一种支持背压(Backpressure)的异步数据流处理标准,主流实现有RxJava和Reactor,Spring WebFlux默认集成的是Reactor。
在Web容器的选择上,Spring WebFlux既支持像Tomcat,Jetty这样的的传统容器(前提是支持Servlet 3.1 Non-Blocking IO API),又支持像Netty,Undertow那样的异步容器。无论是何种容器,Spring WebFlux都会将其输入输出流适配成Flux<DataBuffer>
格式,以便进行统一处理。
值得一提的是,除了新的Router Functions接口,Spring WebFlux同时支持使用老的Spring MVC注解声明Reactive Controller。和传统的MVC Controller不一样,Reactive Controller操做的是非阻塞的ServerHttpRequest和ServerHttpResponse,而再也不是Spring MVC里的HttpServletRequest和HttpServletResponse。
下面是我GitHub上的示例工程里的一个例子,
@RestController public class RestaurantController { private final RestaurantRepository restaurantRepository; private final ReactiveMongoTemplate reactiveMongoTemplate; public RestaurantController(RestaurantRepository restaurantRepository, ReactiveMongoTemplate reactiveMongoTemplate) { this.restaurantRepository = restaurantRepository; this.reactiveMongoTemplate = reactiveMongoTemplate; } @GetMapping("/reactive/restaurants") public Flux<Restaurant> findAll() { return restaurantRepository.findAll(); } @GetMapping("/reactive/restaurants/{id}") public Mono<Restaurant> get(@PathVariable String id) { return restaurantRepository.findById(id); } @PostMapping("/reactive/restaurants") public Flux<Restaurant> create(@RequestBody Restaurant[] restaurants) { return Flux.just(restaurants) .log() .flatMap(r -> Mono.just(r).subscribeOn(Schedulers.parallel()), 10) .flatMap(reactiveMongoTemplate::insert); } }
除了响应式编程支持,Spring 5还包括了不少Java程序员期待已久的特性,包括JDK 9,Junit 5,Servlet 4以及HTTP/2支持。目前Spring 5的最新版本是RC1,而Spring Boot也刚刚发布了2.0.0 M1版本。根据Spring官方博客,Spring 5将在JDK 9 GA以后随即发布,也就是今年的7月底先后。
以上就是我对Spring 5中有关响应式编程支持的一些简单介绍,欢迎你到个人留言板分享,和你们一块儿过过招。下一篇我将聊一下我对响应式编程的一些理解,敬请期待。