【Spring 5】響應式Web框架前瞻

Emac發表於2017-05-30

引子:被譽為“中國大資料第一人”的塗子沛先生在其成名作《資料之巔》裡提到,摩爾定律、社交媒體、資料探勘是大資料的三大成因。IBM的研究稱,整個人類文明所獲得的全部資料中,有90%是過去兩年內產生的。在此背景下,包括NoSQL,Hadoop, Spark, Storm, Kylin在內的大批新技術應運而生。其中以RxJavaReactor為代表的響應式(Reactive)程式設計技術針對的就是經典的大資料4V定義(Volume,Variety,Velocity,Value)中的Velocity,即高併發問題,而在即將釋出的Spring 5中,也引入了響應式程式設計的支援。在接下來的幾周,我會圍繞響應式程式設計分三期與你分享我的一些學習心得。作為第一篇,首先從Spring 5談起。

1 響應式宣言

敏捷宣言一樣,說起響應式程式設計,必先提到響應式宣言。

We want systems that are Responsive, Resilient, Elastic and Message Driven. We call these Reactive Systems. - The Reactive Manifesto

【Spring 5】響應式Web框架前瞻

圖片出處:The Reactive Manifesto

不知道是不是為了向敏捷宣言致敬,響應式宣言中也包含了4組關鍵詞:

  • Responsive: 可響應的。要求系統儘可能做到在任何時候都能及時響應。
  • Resilient: 可恢復的。要求系統即使出錯了,也能保持可響應性。
  • Elastic: 可伸縮的。要求系統在各種負載下都能保持可響應性。
  • Message Driven: 訊息驅動的。要求系統通過非同步訊息連線各個元件。

可以看到,對於任何一個響應式系統,首先要保證的就是可響應性,否則就稱不上是響應式系統。從這個意義上來說,動不動就藍屏的Windows系統顯然不是一個響應式系統。

PS: 如果你贊同響應式宣言,不妨到官網上留下的你電子簽名,我的編號是18989,試試看能不能找到我。

2 Spring 5前瞻

作為Java世界首個響應式Web框架,Spring 5最大的亮點莫過於提供了完整的端到端響應式程式設計的支援。

【Spring 5】響應式Web框架前瞻

圖片出處: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);
    }
}複製程式碼

3 小結

除了響應式程式設計支援,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中有關響應式程式設計支援的一些簡單介紹,歡迎你到我的留言板分享,和大家一起過過招。下一篇我將聊一下我對響應式程式設計的一些理解,敬請期待。

4 參考

相關文章