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

news2024/11/24 10:41:26

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 是可以共用很多组件的,比如 @ControllerTomcat 等,但是也会存在很多差异。

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

来源: Java极客技术

作者:鸭血粉丝Tang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F多核处理器设计的高性能评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;高性能低功耗&#xff0c;稳…

3.2C++抽象类

C 抽象类 C的抽象类是指至少包含一个纯虚函数的类&#xff0c;不能被实例化。 抽象类的作用是为了实现接口的统一规范&#xff0c;使得不同的子类可以通过实现相同的纯虚函数来实现不同的行为。 定义抽象类时&#xff0c;需要在类中至少包含一个纯虚函数。 抽象类不能被实例…

idea如何连接数据库

输入数据库的用户名和密码就行 Database这里些数据库的名字 快速打开数据库设计 这句话是说时区有问题&#xff1a;因为Mysql用的是美国时区&#xff0c;要搞成中国时区&#xff1a; set global time_zone8:00; 打开cmd窗口&#xff1a; 输入 mysql -u root -p 密码&…

MySql高级篇-006 MySQL架构篇-02MySQL的数据目录:数据库下的主要目录结构、文件系统如何存储数据

第02章_MySQL的数据目录 1.MySQL8的主要目录结构 # 查询名称叫做mysql的文件目录都有哪些[rootatguigu07 ~]# find / -name mysql安装好MySQL 8之后&#xff0c;我们查看如下的目录结构&#xff1a; 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/…

华为手环8 六月免费表盘上线,让你的腕上表盘更丰富多彩

在如今这个科技与艺术相互融合的时代&#xff01;工程师们给华为手环8花粉朋友准备的6月这一期好看又免费表盘已经上线。你可以根据自己的审美&#xff0c;选择一款最适合自己的表盘&#xff0c;展现出自己的个性和品味。快来选择你的专属表盘&#xff0c;让华为手环8成为你独特…

移动WEB开发之rem适配布局

css基础&#xff08;一&#xff09;css基础&#xff08;一&#xff09;_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客Emmet语法Emmet语法_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客css基础&#xff08;二&#xff09;c…

途乐证券|股市里的游资是什么?有什么特点?

股市是一个充满风险和机会的地方&#xff0c;吸引了各类投资者的目光&#xff0c;游资就是其中一种。那么股市里的游资是什么&#xff1f;有什么特点&#xff1f;途乐证券也为大家准备了相关内容&#xff0c;以供参考。 股市里的游资是什么&#xff1f; 一般来说&#xff0c;股…

【JavaScript】使用qrcode生成二维码

QRCode简介&#xff1a; QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 使用步骤&#xff1a; 点击下载&#xff1a;https://github.com/davidshimjs/qrcodejs 或者mirrors / davidshimjs / qrco…

selenium 自动化测试 1-如何搭建自动化测试环境,搭建环境过程应该注意的问题

目录 前言&#xff1a; 1、selenium的介绍 2、selenium的版本介绍 3. selenium工作原理 4. selenium安装 4.1 安装selenium 4.2 安装浏览器驱动 4.3 安装浏览器 4.4 验证安装结果 5. 浏览器基本操作 前言&#xff1a; 搭建Selenium自动化测试环境是进行Web应用程序自…

京东到家小程序-在性能及多端能力的探索实践 | 京东云技术团队

一、前言 京东到家小程序最初只有微信小程序&#xff0c;随着业务的发展&#xff0c;同样的功能需要支持容器越来越多&#xff0c;包括支付宝小程序、京东小程序、到家APP、京东APP等&#xff0c;然而每个端分开实现要面临研发成本高、不一致等问题。 为了提高研发效率&#…

关于栈和队列的几个题

思维导图&#xff1a; 1.匹配括号 题目如下&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以…

【灾报警主机联网问题】

火灾报警主机联网问题一直是各消防项目中的难点&#xff0c;特别是管廊等长距离通讯中&#xff0c;如何保证通讯信号长期稳定可靠的运行是需要工程重点解决的问题&#xff0c;而LCAN-FOBR系列环网冗余式CAN光纤转换器提供二路光通道和一路CAN通道&#xff0c;实现CAN与光纤之间…

基于ENVI的遥感影像的非监督分类

ENVI包括了ISODATA和K-Mean两种非监督分类方法。 ISODATA&#xff08;Iterative Self-Orgnizing Data Analysize Technique&#xff09;是一种重复自组织数据分析技术&#xff0c;计算数据空间中均匀分布的类均值&#xff0c;然后用最小距离技术将剩余像元进行迭代聚合&#x…

常见分子直径

He 0.26 H2 0.289 NO 0.317 CO2 0.33 Ar 0.34 O2 0.346 N2 0.364 CO 0.376 CH4 0.38 C2H4 0.39 Xe 0.396 C3H8 0.43 SO2 0.28 气体分子 分子直径/nm 水0.27&#xff5e;0.32 氨0.365&#xff5e;0.38 苯0.65&#xff5e;0.68 乙烷0.40&#xff5e;0.47 乙烯…

华为OD机试真题 Python 实现【快速开租建站】【2023Q1 200分】,附详细解题思路

一、题目描述 当前IT部门支撑了子公司颗粒化业务&#xff0c;该部门需要实现为子公司快速开租建站的能力&#xff0c;建站是指在一个全新的环境部署一套IT服务。 每个站点开站会由一系列部署任务项构成&#xff0c;每个任务项部署完成时间都是固定和相等的&#xff0c;设为1。…

项目——学生信息管理系统5

目录 教师模块功能的实现 创建一个 Teacher 实体类 创建 添加老师界面 AddTeacherFrm 注意创建成 JInternalFrame 类型 页面的制作 给添加按钮绑定事件 提供一个重置表单功能 回到 MainFrm 添加教师管理的按钮 给添加教师按钮绑定事件 测试添加教师功能 创建教师信息管…

Day8——操作系统基础windows

文章目录 操作系统基础操作系统的定义 什么是windows 操作系统基础 操作系统的定义 什么是windows

gin RouterGroup 方法概览

路由组 RouterGroup是gin 里面的路由组&#xff0c;主要作用是实现gin的路由。 RouterGroup是嵌套在了Engine内部&#xff0c;实际上调用Engine的get&#xff0c;post等方式就是RouterGroup的实现。 另外RouterGroup还实现了如下两个接口&#xff1a; Engine相当于RouterGrou…

【Shell】自定义传入参数

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …