开发者社区> 问答> 正文

[@倚贤][¥20]WebFlux给我们带来的好处

现在有许多博文都在提响应式编程的好处,如果应用在SpringBoot的web开发中,能给我们带来什么便利呢?

展开
收起
Nebula 2018-12-11 09:26:10 1885 0
1 条回答
写回答
取消 提交回答
  • 前一个帐号wangccsy@126.com不知道怎么的就成了企业帐号,改不成个人。所以重新注册了一个个人帐号。老程序员。精通JAVA,C#,数据库,对软件开发过程和流程熟悉。考取系统分析师,项目管理师和系统架构设计师等软件资格考试认证。愿意和大家一起前进。

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

    其次 我想说 如果只是用于数据的展示 (不提交数据 或者只是将数据取出来 然后处理)这个用起来 是非常棒的 但是要是处理业务的话 最好还是用原生的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有点接近了

    2019-07-17 23:19:43
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
电商网站需求分析和架构设计Spring Boot2.6入门 立即下载
如何利用Redisson分布式化传统Web项目 立即下载
spring cloud微服务架构设计与开发实践 立即下载