webflux-响应式编程

响应式流

 

Java 9 新引入了Reactive Stream(响应式流),而应用了响应式流的编程即为响应式编程

Reactive Stream标准:异步的流处理,并支持非阻塞式的 backpressure(背压? 很拗口的翻译,就是生产者与消费者之者应有流量控制)

webflux-响应式编程_第1张图片

既然 Reactive Stream 和 Java 8 引入的 Stream 都叫做流,它们之间有什么关系呢?有一点关系,Java 8 的 Stream 主要关注在流的过滤,映射,合并,而  Reactive Stream 更进一层,侧重的是流的产生与消费,即流在生产与消费者之间的协调

 

2015 年,正式的 Reactive Stream 出台,发布在http://www.reactive-streams.org/

 

实现了Reactive Stream标准的有

  • Akka Streams(1.0-RC2)
  • MongoDB (1.0.0)
  • Ratpack (0.9.16), 可用来创建非阻塞式 HTTP 应用
  • Reactive Rabbit (1.0.0), Rabiit MQ /AMQP 的驱动
  • Reactor (Spring 5 的响应式 MVC 就是用的它)
  • RxJava (1.0.0), Netflix 出品
  • Slick (3.0.0), Scala 的函数式关系映射组件,用于操作 数据库
  • Vert.x 3.0 (milestone-5a), Ecl ip se 出品,也能用于构建非阻塞式 HTTP 应用
  • Java 9 Reactive Streams Flow API ,

 所以引入了Spring 5的已经可以开始使用了,不必将项目升级为Java 9支持

 参考:http://ju.outofmemory.cn/entry/360633

 

webflux学习demo

Handler:

package com.jesse.reactiveWebDemo.handler;

import com.jesse.reactiveWebDemo.domain.Man;
import com.jesse.reactiveWebDemo.repository.ManMongoRepository;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * ServerResponse 是对响应的封装,可以设置响应状态、响应头、响应正文。
 * 比如 ok 代表的是 200 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。
 * 

* 这里用 Mono 作为返回对象,是因为返回包含了一个 ServerResponse 对象,而不是多个元素。 */ @Component public class HelloHandler { // @Autowired // ManRepository manRepository; @Autowired ManMongoRepository manMongoRepository; public Mono hello(ServerRequest request) { return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN) .body(BodyInserters.fromObject("Hello, my lover!")); } public Mono save(Man man) { return manMongoRepository.save(man); } public Mono findCityById(ObjectId id) { return manMongoRepository.findById(id); } public Flux findAllCity() { return manMongoRepository.findAll(); } }

 Router

@Configuration
public class HelloRouter {
    @Bean
    public RouterFunction route(HelloHandler cityHandler) {

        BinaryOperator binaryOperator = (Long x, Long y) -> x + y;
        return RouterFunctions
                .route(RequestPredicates.GET("/save")
                                .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        cityHandler::hello);
    }
}

由于mysql不支持异步型的事务,所以无法使用webflux

故这里用了mongodb作为实例

 

webflux-demo源码

https://github.com/Jesse-so-cool/webflux-demo

你可能感兴趣的:(webflux-响应式编程)