当前位置: 首页 > 科技观察

90-如何理解Webflux响应式编程?

时间:2023-03-19 10:09:43 科技观察

本文转载自微信公众号《Java时光屋》,作者JackJia。转载本文请联系爪哇时光屋公众号。前言1.什么是响应式编程:2.使用spring-boot-starter-webflux:3.如何区分Jetty、tomcat、undertow、netty:总结前言现在网关用的是spring-cloud-gateway,我们在期间发现使用过程编码采用了响应式编程,直接集成了spring-boot-starter-webflux依赖,顺带点燃了响应式编程。本文根据自己的理解对响应式编程做一个总结介绍,希望对大家有所帮助。1、什么是反应式编程:说到反应式编程,一开始可能不太容易和传统编程区分开来。Themostimportantdifferenceisthattraditionalprogrammingisblocking,whilereactiveprogrammingisnon-blockingandasynchronous.官网介绍响应式编程:Incomputing,reactiveprogrammingisanasynchronousprogrammingparadigmconcernedwithdatastreamsandthepropagationofchange.Thismeansthatitbecomespossibletoexpressstatic(e.g.arrays)ordynamic(e.g.eventemitters)datastreamswitheaseviatheemployedprogramminglanguage(s),andthataninferreddependencywithintheassociatedexecutionmodelexists,whichfacilitatestheautomaticpropagationofthechangeinvolvedwithdataflow.在计算机领域,响应式编程是一个专注于数据流和变化传递的异常编程范式。这意味着静态(例如数组)或动态(例如事件发射器)数据流可以很容易地用编程语言表示,并且在关联的执行模型存在可推导的依赖关系,以促进自动传播与数据流相关的更改。在计算中,反应式编程是一种异步编程范例,它专注于数据流和变更交付。这意味着静态(如数组)或动态(如事件发射器)数据流可以很容易地用编程语言表示,并且在关联的执行模型中存在可推导的依赖关系,以方便自动传播与数据流相关的更改.可能这一段还是比较难理解,但是大家可以关注一下数据的变化。响应式编程是一种新的基于数据变化的编程模型,实现了异步非阻塞,即当有请求到来时,订阅数据变化,后续业务处理发布变化,然后监听变化并响应。传统的springmvc是创建新线程等待阻塞的过程,直到请求完成,再释放线程。2、使用spring-boot-starter-webflux:比较经典的图:从图中我们可以看到基于spring-webmvc和spring-webflux的路由和区别。其中webflux默认使用netty的通信框架作为web容器。netty相比tomcat的优点这里不再赘述,高并发、传输快、封装好、netty零拷贝。我们在使用webflux的时候,关注两个经常使用的对象Mono和Flux:MonoFlux实现发布者并返回0或1个元素,即单个对象实现发布者,返回N个元素,即List列表对象3。如何区分Jetty、tomcat、undertow、netty:tomcat:市场占有率还是很高的,虽然与其他web服务器相比在性能上有所欠缺,但是由于其成熟度高,实践性强。undertow和Jetty都是基于NIO实现高并发的轻量级服务器。它们支持servlet3.1和websocket。springboot2之后增加了webflux的web容器,webflux是基于netty的,netty是基于nio的,加上它的零拷贝实现,保证了它在性能上的优越性。3.1springboot中使用jetty:org.springframework.bootspring-boot-starter-parent1.5.10.发布org.springframework.bootspring-boot-starter-webspring-boot-starter-tomcatorg.springframework.bootorg.springframework.bootspring-boot-starter-jetty3.2springboot中使用Webflux/Netty:org.springframework.启动spring-boot-starter-weborg.springframework.bootspring-boot-starter-loggingorg.springframework.bootspring-boot-starter-tomcatorg.springframework.bootspring-boot-starter-undertow其实webflux框架Spring提供的总结了它简化了我们Netty操作的复杂度,提供了一个ReactorNetty库。因为网关的性能需求,所有的spring-cloud-gateway都直接集成了webflux,而Netty的nio特性极大的满足了网关的高并发和高性能。对于需要的场景,个人认为响应式编程以后不会到处发展,但是网关这种特殊的场景确实更适合响应式编程的应用