现在有许多博文都在提响应式编程的好处,如果应用在SpringBoot的web开发中,能给我们带来什么便利呢?
首先 我想说的是 这个东西 写起来 真的很优雅 很舒服 看着也清晰 感觉代码就应该这么写
其次 我想说 如果只是用于数据的展示 (不提交数据 或者只是将数据取出来 然后处理)这个用起来 是非常棒的 但是要是处理业务的话 最好还是用原生的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有点接近了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。