webflux的一点学习感悟

首先 我想说的是 这个东西 写起来 真的很优雅 很舒服 看着也清晰  感觉代码就应该这么写

其次 我想说 如果只是用于数据的展示 (不提交数据 或者只是将数据取出来 然后处理)这个用起来 是非常棒的 但是要是处理业务的话  最好还是用原生的Java代码

说一下和原生的servlet的区别

 我们之前用的东西(servlet) 都是将结果 处理处理好 然后 返回 一层一层的返回  就是说 在mapping到合适的方法后 这个方法执行完后  浏览器所期望的数据 已经生成了 然后 就是一层 一层的往外走 最后直接给浏览器  因而 如果请求很多的话  因为这个方法 要把 结果处理出来 才返回 所以 请量很大的时候 吞吐量就上不去了 (这里暂时想不到合适的例子)

webflux就不一样了  我之前 有疑惑但是明白这一点后 也就意识到为什么要这么做了

先说下结论  webflux 在mapping的方法里面 并不是返回结果 而是返回 数据与函数的组合(Mono Flux) 所以在mapping的方法中 不会花费很多时间 所以同等情况下 要比servlet的吞吐量大 

 @GetMapping(path = "/applications", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<Application>> applicationsStream() {
        return Flux.from(eventPublisher)
                   .flatMap(event -> registry.getInstance(event.getInstance()))
                   .map(this::getApplicationForInstance)
                   .flatMap(group -> toApplication(group.getT1(), group.getT2()))
                   .map(application -> ServerSentEvent.builder(application).build())
                   .mergeWith(ping());
    }

如上图代码  返回的是一个flux对象  里面包含了数据 与处理的方法  但是并不执行 只有在真正需要的时候 才去执行里面的方法 并放回最终的结果(和spark里的rdd处理 如出一辙)  一直说的异步io 关键点就在这里

至于后面的数据提取 最终返回 就要看里面的源码了

 

这里说下我之前的疑惑  Mono和Flux的都实现了 Publisher  里面有个subscribe方法

public abstract class Flux<T> implements Publisher<T> {
.....}
public abstract class Mono<T> implements Publisher<T> {
....}

public interface Publisher<T> {

    /**
     * Request {@link Publisher} to start streaming data.
     * <p>
     * This is a "factory method" and can be called multiple times, each time starting a new {@link Subscription}.
     * <p>
     * Each {@link Subscription} will work for only a single {@link Subscriber}.
     * <p>
     * A {@link Subscriber} should only subscribe once to a single {@link Publisher}.
     * <p>
     * If the {@link Publisher} rejects the subscription attempt or otherwise fails it will
     * signal the error via {@link Subscriber#onError}.
     *
     * @param s the {@link Subscriber} that will consume signals from this {@link Publisher}
     */
    public void subscribe(Subscriber<? super T> s);
}

数据的处理函数 貌似都是写到这个方法里面  最后在进行调用  当时我不明白的事  这个不是直接返回结果吗 干嘛还在这里面 写个类似订阅的方法

知道了上面的后 就说清楚了  结果不是立刻返回 而是在最后使用结果的时候 在调用具体的方法(这里其实是函数)然后获取结果

 

感觉这个和scala有点接近了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值