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

阿粉这里给出的建议就是,如果当下的项目就是 ​​SpringMVC​​ 的,那么不要想着换成 ​​Spring WebFlux​​ 架构,因为没必要,如果说要新开发一个项目,需要高吞吐量而且底层也不依赖事务性数据库的话,那么可以尝试使用一下 ​​Spring WebFlux​​。

阿粉这里给出的建议就是,如果当下的项目就是 ​​SpringMVC​​ 的,那么不要想着换成 ​​Spring WebFlux​​ 架构,因为没必要,如果说要新开发一个项目,需要高吞吐量而且底层也不依赖事务性数据库的话,那么可以尝试使用一下 ​​Spring WebFlux​​。

前面的文章给大家介绍了SpringBoot的应用web类型推断,并且结合了Reactive web类型给大家分析了一下SpringBoot是如何进行web类型推断和创建内置web服务器的。

有小伙伴在后台留言就问了Servlet web我们天天使用很熟悉,那什么是Reactive web呢?两者的区别是啥?今天阿粉就给大家介绍一下。

Servlet 与 Reactive 技术栈

打开Spring的官方文档我们在Reactive一栏中可以看到下面的架构图,其中可以很明显的看到Reactive的技术栈跟Servlet技术栈是完全并行的。意思是说我们日常开发的Servlet web类型只是一半的内容,还有另外一半世界就是Reactive,两者对应的依赖如下所示。

<!--Servlet web 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Reactive web 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

图片

servlet-reactive

通过架构图我们可以知道常用的Servlet web就是我们经常说的Spring MVC,底层的技术栈支持JDBC等,而Reactive web就是Spring WebFlux底层的持久层支持Mongo等但是不支持JDBC。

什么是 Spring WebFlux

由上图我们看到Spring WebFlux是一个异步非阻塞式的Web框架,它能够充分利用多核CPU的硬件资源去处理大量的并发请求。相对于Spring MVC来说的话,Spring MVC构建于Servlet API之上,使用的是同步阻塞式I/O模型。

由于Spring WebFlux底层是使用响应式编程,基于事件的异步驱动,所以可以在很大程度上提升系统的吞吐量。但是要知道这并不会缩短请求的响应时间,只是提升吞吐量。

而且根据上面的架构图我们可以发现,Spring WebFlux底层的持久层是不支持JDBC的,也就是说不支持MySQL等事务性数据库,

举个栗子

前面说了这么多那Spring WebFlux到底是怎么开发的呢?下来通过一个简单的case来给大家演示一下。在演示之前通过官方文档我们可以发现,Spring WebFlux和Spring MVC是可以共用很多组件的,比如@Controller,Tomcat等,但是也会存在很多差异。

Spring官方Reactive地址为:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html

图片

springmvc-springwebflux

基于我们之前的demo-reactive项目的代码,或者小伙伴也可以在starter.spring.io上面下载一个SpringBoot的项目代码,增加上spring-boot-starter-webflux依赖即可。

定义 DTO

package com.example.reactive.demoreactive.dto;

public class User {
private String name;
private int age;

//省略 getter setter
}

定义 Controller

package com.example.reactive.demoreactive.controller;

import com.example.reactive.demoreactive.dto.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;


@RestController
public class UserController {

@GetMapping("/hello")
public String sayHello(){
return "hello";
}

@GetMapping("/user/get")
public Mono<User> getUser(){
User user = new User();
user.setName("Java极客技术");
user.setAge(18);
return Mono.just(user);
}

@GetMapping("/user/list")
public Flux<List<User>> getAllUser() {
User user = new User();
user.setName("Java极客技术");
user.setAge(18);
List<User> list = new ArrayList<>();
list.add(user);
return Flux.just(list);
}
}

随后启动我们的服务,再通过浏览器访问我们的接口就可以了。

图片

上面三个接口的访问结果如下:

图片

hello

图片

user-get

图片

user-list

可以看到我们在浏览器可以正常获取到数据,上面的代码跟我们平时写SpringMVC的代码很相似,不太一样的地方是有两个类Mono和FLux。

关于 Mono 和 Flux 是反应式编程的概念,Mono 是返回 0 或 1 个元素,Flux 是返回 0 - N 个元素,更详细的内容大家可以通过官方文档 https://projectreactor.io/docs/core/release/api/ 来查看。

总结

虽然从上面的写法来看,Spring WebFlux的写法与SpringMVC的写法没有很大的区别,但是两者的底层机制是完全不一样的,而且技术栈也不完全相同,所以大家在日常技术选型的时候需要根据实际情况去选择。

阿粉这里给出的建议就是,如果当下的项目就是SpringMVC的,那么不要想着换成Spring WebFlux架构,因为没必要,如果说要新开发一个项目,需要高吞吐量而且底层也不依赖事务性数据库的话,那么可以尝试使用一下Spring WebFlux。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月6日 19:20
下一篇 2023年5月6日 19:20

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信