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

这会是下一代Java程序员的技术栈吗?

时间:2023-03-18 21:38:37 科技观察

上一篇文章介绍了SpringBoot的应用web类型推断,并结合Reactiveweb类型分析了SpringBoot是如何进行web类型推断并创建内置web服务器的。有朋友在后台留言问我们天天熟悉的Servletweb,那么什么是Reactiveweb?两者有什么区别?今天阿粉就来给大家介绍一下。Servlet与Reactive技术栈打开Spring的官方文档。我们在Reactive专栏可以看到如下架构图,很明显Reactive技术栈和Servlet技术栈是完全并行的。意味着我们日常开发的Servletweb类型只是一半的内容,另一半是Reactive。两者对应的依赖关系如下。org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-webfluxservlet-reactive通过架构图我们可以知道常见的使用的Servletweb是我们常说的SpringMVC,底层技术栈支持JDBC等,而Reactiveweb是指SpringWebFlux底层持久层支持Mongo等但不支持JDBC。什么是SpringWebFlux从上图我们可以看出SpringWebFlux是一个异步非阻塞的web框架,可以充分利用多核CPU的硬件资源来处理大量的并发请求。与SpringMVC相比,SpringMVC建立在ServletAPI之上,采用同步阻塞I/O模型。由于SpringWebFlux底层采用了响应式编程和基于事件的异步驱动,可以大大提高系统的吞吐量。但是要注意,这并不会提高请求的响应时间,只是增加了吞吐量。而根据上面的架构图我们可以发现,SpringWebFlux底层的持久层是不支持JDBC的,也就是说不支持MySQL等事务型数据库。比如SpringWebFlux在前面说了这么多栗子之后是怎么发展起来的??让我给你看一个简单的案例。通过演示前的官方文档,我们可以发现SpringWebFlux和SpringMVC可以共享很多组件,比如@Controller、Tomcat等,但也有很多不同之处。Spring官方的Reactive地址是:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.htmlspringmvc-springwebflux是基于我们之前demo-reactive项目的代码,或者小伙伴也可以在starter.spring.io上下载一个SpringBoot项目代码,添加spring-boot-starter-webflux依赖。定义DTOpackagecom.example.reactive.demoreactive.dto;publicclassUser{privateStringname;私人年龄;//省略gettersetter}定义.bind.annotation.ResponseBody;导入org.springframework.web.bind.annotation.RestController;导入reactor.core.publisher.Flux;导入reactor.core.publisher.Mono;导入java.util.ArrayList;导入java.util。List;@RestControllerpublicclassUserController{@GetMapping("/hello")publicStringsayHello(){return"hello";}@GetMapping("/user/get")publicMonogetUser(){Useruser=newUser();user.setName("Java极客技术");user.setAge(18);返回Mono.just(用户);}@GetMapping("/user/list")publicFlux>getAllUser(){Useruser=newUser();user.setName("Java极客technology");user.setAge(18);Listlist=newArrayList<>();list.add(user);returnFlux.just(list);}}然后启动我们的服务,然后浏览以上三个接口的访问结果如下:hellouser-getuser-list可以看到我们在浏览器中可以正常获取数据,上面的代码和我们平时写SpringMVC的代码很像,不太一样的是有两个类Mono和FLux,关于Mono和Flux是响应式编程的概念,Mono返回0或1个元素,Flux返回0-N个元素,更详细的内容可以参考官方文档https://projectreactor.io/docs/core/release/api/去查看.总结虽然从上面的写法来看,SpringWebFlux的写法和SpringMVC的写法差别不大,但是两者的底层机制是完全不同的,并且技术栈并不完全相同,所以选择时需要根据实际情况来选择他每天的技术。这里阿芬给出的建议是,如果当前项目是SpringMVC,那就别想着换了。进入SpringWebFlux架构,因为没有必要。如果你想开发一个需要高吞吐量的新项目,并且底层不依赖于事务型数据库,那么你可以尝试使用SpringWebFlux。