引子:被譽爲「中國大數據第一人」的塗子沛先生在其成名做《數據之巔》裏提到,摩爾定律、社交媒體、數據挖掘是大數據的三大成因。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中有關響應式編程支持的一些簡單介紹,歡迎你到個人留言板分享,和你們一塊兒過過招。下一篇我將聊一下我對響應式編程的一些理解,敬請期待。