【Spring】Spring的请求处理

news2025/5/18 13:35:54

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

目录

  • 引言
  • HTTP/HTTPS协议
    • Spring Web与Spring Web MVC
    • Spring WebFlux
  • 自定义的TPC/IP协议
  • FTP、SMTP协议

引言

总所周知,服务间通信模式可分为同步、异步和流式通信。
同步通信以HTTP和RPC为主,这两者都是应用层的,属于TCP/IP协议族。
TCP/IP 是一组网络通信协议(Protocol Suite)。 它定义了数据如何在网络中被打包、寻址、传输、路由和接收的规则。
TCP/IP核心分层如下:

层次协议示例
应用层HTTP, HTTPS, FTP, SMTP, DNS, SSH, Telnet, gRPC, MQTT, Kafka
传输层TCP, UDP, SCTP
网际层(网络层)IP (IPv4/IPv6), ICMP, IGMP, ARP, RARP, RIP, OSPF, BGP
链路层以太网 (Ethernet), Wi-Fi (802.11), PPP (Point-to-Point Protocol)

而我的Spring框架专注于应用层的开发,下面,让我们一起看看Spring是如何处理应用层不同类型的协议请求的。

HTTP/HTTPS协议

Spring Web与Spring Web MVC

Spring框架提供Spring Web与SpringMVC模块处理应用层的HTTP/HTTPS协议。

Spring Web是Spring框架中处理Web功能的基础模块,提供HTTP请求处理、响应管理、远程服务集成等底层功能。
SpringWeb处理请求是基于Servlet API的。
Java Servlet规范定义了HttpServlet类,里面包含一系列的doXXX()方法,对应Http的各类型请求方法:Get\Post\Put\Delete\Head\Patch等。
![[Spring Web.png]]

另外还有会话管理、RESTful支持等。

Spring MVC模块全程Spring Web MVC,是基于Spring Web的处理HTTP/HTTPS协议的上层模块。
Spring MVC提供有常用的@RestController注解,这个注解就依赖于Spring Web的@RequestMapping和@ResponseBody。

Spring MVC执行流程如下:
![[【Spring】请求处理.png]]

其中核心组件为前端控制器DispatcherServlet,将 URL 映射到具体的控制器方法的HandlerMapping,将逻辑视图名称解析为实际视图(如 JSP 页面)的ViewResolver,适配不同类型的控制器(如注解式控制器)的HandlerAdapter

PS:在Spring Boot项目中,添加 spring-boot-starter-web 会同时引入 Spring Web 和 Spring MVC 的能力。

Spring WebFlux

Spring框架提供Spring WebFlux模块来支持响应式编程。Spring WebFlux是Spring 5.0引入的,是Spring框架中与Spring MVC并行的一个方案,专门用于构建完全非阻塞、事件驱动的应用程序,能够更好地利用服务器资源,尤其是在高并发、I/O密集型场景下。

要理解 WebFlux,首先要理解响应式编程。它的核心思想是:

  1. 数据流 (Data Streams): 数据被看作是异步发出的事件流。
  2. 非阻塞 (Non-blocking): 操作不会阻塞当前线程。当一个操作(如数据库查询、网络调用)需要等待时,线程会被释放去处理其他任务,而不是空等。当操作完成时,会通过回调或事件通知来继续处理。
  3. 背压 (Backpressure): 消费者可以控制生产者发送数据的速率,防止消费者被过快的数据流淹没。

WebFlux 的关键组件和特性:

  1. Project Reactor: WebFlux 底层依赖于 Project Reactor,这是一个实现了 Reactive Streams 规范的响应式库。Reactor 提供了两种核心的发布者(Publisher)类型:

    • Mono<T>: 代表 0 或 1 个元素的异步序列(例如,获取单个用户信息)。
    • Flux<T>: 代表 0 到 N 个元素的异步序列(例如,获取用户列表,或者一个无限的事件流)。
  2. 两种编程模型:

  • 注解驱动 (Annotation-based)
    非常类似于 Spring MVC。可以使用 @Controller、@RestController 以及 @GetMapping、@PostMapping 等注解。不同的是,控制器方法的参数和返回值通常是 Mono 或 Flux。
@RestController
public class UserController {
    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        // 异步获取用户
        return userService.findById(id);
    }

    @GetMapping("/users")
    public Flux<User> getAllUsers() {
        // 异步获取所有用户流
        return userService.findAll();
    }
}
  • 函数式路由 (Functional Endpoints / RouterFunctions)
    这是一种更轻量级、更函数式的编程模型,请求被路由到处理器函数(HandlerFunction)。
@Configuration
public class UserRoutes {
    @Bean
    public RouterFunction<ServerResponse> userRoutes(UserHandler handler) {
        return RouterFunctions
                .route(GET("/functional/users/{id}"), handler::getUserById)
                .andRoute(GET("/functional/users"), handler::getAllUsers);
    }
}

// UserHandler.java
@Component
public class UserHandler {
    public Mono<ServerResponse> getUserById(ServerRequest request) {
        String id = request.pathVariable("id");
        Mono<User> userMono = userService.findById(id);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(userMono, User.class);
    }
    // ... getAllUsers ...
}
  1. 非阻塞服务器: WebFlux 默认运行在像 Netty 这样的非阻塞 I/O 服务器上。它也可以运行在支持 Servlet 3.1+ 非阻塞 I/O 的传统 Servlet 容器(如 Tomcat, Jetty, Undertow)上,但 Netty 是更自然的选择,因为它本身就是完全异步事件驱动的。

  2. 客户端: Spring WebFlux 还包含一个响应式的 HTTP 客户端 WebClient,用于非阻塞地调用外部服务。

什么时候考虑使用 WebFlux?

  • 需要处理高并发连接的应用,如微服务网关、聊天应用、实时数据仪表盘。
  • I/O 密集型应用,其中大部分时间花在等待网络或磁盘操作。
  • 需要流式处理数据的场景(例如,视频流、Server-Sent Events)。
  • 希望构建一个完全响应式的系统。

需要注意的点:

  • 学习曲线: 响应式编程范式与传统的命令式编程有较大差异,需要一定的学习成本。调试响应式代码也可能更复杂。
  • “传染性”: 为了充分发挥响应式编程的优势,最好整个调用链都是响应式的。如果在一个响应式流中调用了一个阻塞的库,那么整个流的非阻塞优势就会被破坏。
  • 并非银弹: 对于CPU密集型任务或者并发量不高的应用,WebFlux 可能不会带来显著的性能提升,甚至可能因为额外的复杂性而得不偿失。

自定义的TPC/IP协议

一些RPC框架会有自定义的TCP/IP协议,这时请求就不是通过Servlet处理的。
例如传统的gRPC、Apache Dubbo默认使用自定义的Dubbo协议、Thrift等。

它们通常直接在TCP套接字上监听特定端口。它们有自己的网络通信层,负责接收原始的TCP数据包,根据RPC框架定义的协议格式进行解码、反序列化、找到对应的服务和方法、执行调用、序列化结果、编码并通过TCP连接返回给客户端。
这种情况下,通常不需要Servlet容器(如Tomcat),RPC服务可以作为独立的Java应用运行(可能内嵌一个Netty等NIO服务器)。
在这里插入图片描述

这种RPC自定义协议的情况下,RPC框架自己实现了完整的网络通信、协议解析、请求分发、序列化等功能,不依赖于Servlet容器和HTTP协议。
也不需要Spring做处理。

FTP、SMTP协议

Spring框架提供Spring Integration配合Apache Commons VFS可以处理FTP与SMTP,从而传输文件与发送邮件。
当然,使用Spring MVC的MultipartFile也可以处理HTTP请求中的文件上传。但是MultipartFile不支持复杂的文件传输流程(如定时任务、错误重试)。

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

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

相关文章

粒子群算法(PSO算法)

粒子群算法概述 1.粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的&#xff0c;它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作

LLM智能体&#xff08;LLM agents&#xff09;是能够自主行动以实现特定目标的AI系统。在实际应用中&#xff0c;智能体能够将用户请求拆解为多个步骤&#xff0c;利用知识库或API获取数据&#xff0c;最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…

SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)

1&#xff0c;现象 安装完VSCode以及各种需要的插件&#xff08;比如SAP CDS Language Support&#xff09;&#xff0c;就可以做CAP开发。 用这个命令创建Project&#xff1a;cds init CAP-Test03 --add java 然后出来一个乱码错误 adding java The derived package name c…

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步…

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…

25、DeepSeek-R1论文笔记

DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链&#xff08;Chain of Thought&#xff09;6、强化学习算法&#xff08;GRPO&#xff09;7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…

LeetCode --- 156双周赛

题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值&#xff0c;然后相加即可&#xff0c;代码如下 // C class Solution {…

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案

一、背景 npm 安装依赖报如下错&#xff1a; gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题&#xff0c;其实并不是你python环境问题&#xf…

初识Linux · IP协议· 下

目录 前言&#xff1a; 内网IP和公网IP 内网IP 公网IP 路由 前言&#xff1a; 前文我们介绍了IP协议的协议头&#xff0c;通过源码等方式我们理解了IP协议中的字段&#xff0c;比如8位协议&#xff0c;比如通过环回问题引出的8位最大生存时间&#xff0c;比如8位协议&…

JAVA的常见API文档(上)

游戏打包 注意API文档中的方法不需要记忆&#xff01;&#xff01; 了解之后如果需要可以查询API文档 对Math的方法总结&#xff1a; 运用刚学的Math方法加快代码的运行效率 可以减少循环次数 找规律&#xff1a; 发现因子有规律&#xff1a; 必定一个大于平方根&#xff0c;…

Spark,连接MySQL数据库,添加数据,读取数据

连接数据库 可以看到shell中我们读取出的数据 在IDEA中打代码如果能输出跟shell中一样的结果即证明连接成功 【出错反思】 像我前面出错的原因就是在打代码时将密码输入错误 添加数据 读取数据就是在上面代码中一起展示了&#xff0c;这里我就不单独说了

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的&#xff0c;例如Vivado自带仿真工具&#xff0c;且无需联合外部仿真工具&#xff0c;例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim&#xff0c;才能实现仿真功能。 方法一&#xff1a;FUXI联合ModelSim 1 添加testbench文件 新建to…

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+

本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选&#xff0c;所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理&#xff0c;城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下&#xff1a; electoral…

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的路径&#xff0c;应该使用哪个命令&#xff1f;&#xff08;A&#xff09; A. pwd B. cd C. ls D. echo 解析&#xff1a;Linux 系统中&#xff0c;pwd命令可以显示当前工作目录的路径。pwd&#x…

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例&#xff0c;我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形&#xff1b;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂&#xff01;&#xff01;&#xff01;&#xff08;谢谢&#xff09; 神速熟悉面向对象 表格结构和类结构 我们在现实生活中&#xff0c;思考问题、发现问题、处理问题&#xff0c;往往都会用“表格”作为工具。实际上&#xff0c;“表格思维”就是…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

【DAY21】 常见的降维算法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业&#xff1a; 什么时候用到降维 降维的主要应用场景 知识点回顾&#xff1a; PCA主成分分析t-sne降维LDA线性判别 通常情况下&#xff0c;…

校园社区小程序源码解析

基于ThinkPHP、FastAdmin和UniApp开发的校园社区小程序源码&#xff0c;旨在为校园内的学生和教职员工提供一个便捷的在线交流和服务平台。 该小程序前端采用UniApp进行开发&#xff0c;具有良好的跨平台兼容性&#xff0c;可以轻松发布到iOS和Android平台。同时&#xff0c;后…