重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

在这里插入图片描述

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

  • 1. 什么是响应式编程?
  • 2. Project Reactor 概述
  • 3. HttpHandler概述
    • 3.1 HttpHandler是什么
    • 3.2 HttpHandler 的工作原理
    • 3.3 使用 HttpHandler 的场景
  • 4. HttpServer概述
    • 4.1 HttpServer是什么
    • 4.2 主要方法
  • 5. 使用示例
    • 5.1 导入相关依赖
    • 5.2 创建一个简单的 HttpHandler
    • 5.3 配置 HttpServer
    • 5.4 效果
      • 启动HttpServer服务
      • 发送请求
  • 6. 总结

前几篇文章介绍了Spring Boot 3 响应式编程的核心内容 Reactor, 通过集成 Reactor,使得响应式编程变得更加简便和高效。本篇博客将继续详细介绍 Reactor 中的 HttpHandlerHttpServer,帮助你更好地理解和使用响应式编程。

1. 什么是响应式编程?

响应式编程是一种异步编程范式,旨在提高系统的响应能力、可伸缩性和资源利用率。它允许系统根据事件流进行编程,而不是依赖于传统的请求-响应模型。

2. Project Reactor 概述

Reactor 是一个用于构建非阻塞应用程序的响应式编程库。它提供了 MonoFlux 两种核心数据类型,分别用于处理单个值和多个值。这些类型支持链式调用,便于对数据流进行操作和转换。

3. HttpHandler概述

3.1 HttpHandler是什么

HttpHandler 是 Spring WebFlux 中的核心组件之一,它提供了直接处理 HTTP 请求和响应的机制。与传统的 Servlet 模型不同,HttpHandler
是非阻塞的,支持异步处理 HTTP 请求。它是整个响应式 Web 层次结构的最底层接口,所有的 Web 处理逻辑最终都会通过 HttpHandler
处理。

HttpHandler 接口定义如下:

public interface HttpHandler {Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response);
}
  • ServerHttpRequest:封装了 HTTP 请求的相关信息,如请求方法、请求头、请求参数等。
  • ServerHttpResponse:封装了 HTTP 响应的信息,如响应头、响应状态、响应体等。
  • Mono:表示异步的响应操作。当请求处理完成后,返回一个 Mono,表示响应流结束。

3.2 HttpHandler 的工作原理

HttpHandler 是 Spring WebFlux 的核心之一,负责 HTTP 请求和响应的流式处理。它与传统的阻塞式请求处理方式不同,HttpHandler 通过
Reactor 提供的 Mono 和 Flux 实现了完全异步和非阻塞的处理模式。这意味着,当接收到 HTTP
请求时,它不会在请求处理的每个阶段都阻塞线程,而是以异步的方式进行处理,提高了应用的吞吐量和性能。

  • 接收请求:当客户端发送 HTTP 请求时,Spring WebFlux 使用底层的 HttpHandler 来处理请求。
  • 处理请求:HttpHandler 会解析请求信息,进行相关的业务逻辑处理,并通过 Mono 或 Flux 生成响应。
  • 返回响应:处理完请求后,通过 ServerHttpResponse 返回响应,响应的生成也是异步的。

3.3 使用 HttpHandler 的场景

HttpHandler 通常用于以下几种场景:

  • 底层 HTTP 请求处理:当需要更精细控制请求和响应时,可以使用 HttpHandler 直接处理 HTTP 流程,而不依赖更高层次的路由功能。
  • 自定义请求处理逻辑:如果你的应用需要与默认的请求处理方式有很大差异,例如处理非标准协议或自定义的 HTTP 响应行为,可以通过自定义
    HttpHandler 实现。
  • 自定义 Web Server:在嵌入式 Netty 或其他服务器中,可以通过 HttpHandler 实现对请求的自定义响应。

4. HttpServer概述

4.1 HttpServer是什么

在 Spring Boot 3 的响应式编程中,HttpServer 是一个用于创建和管理 HTTP 服务器的核心组件。它支持异步和非阻塞的 I/O 操作,非常适合处理高并发和高性能的应用场景。
它是 Reactor Netty 的一部分,能够创建和配置基于 Netty 的 HTTP 服务器。

4.2 主要方法

  • bind(): 启动 HTTP 服务器并开始监听请求。
  • host(): 设置服务器的主机名。
  • port(): 设置服务器的端口号。

5. 使用示例

5.1 导入相关依赖

        <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId></dependency><!-- Reactor Netty (通常已包含在 Spring Boot Starter WebFlux 中) --><dependency><groupId>io.projectreactor.netty</groupId><artifactId>reactor-netty</artifactId></dependency>

5.2 创建一个简单的 HttpHandler

package com.coderjia.boot3webflux.config;import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import reactor.core.publisher.Mono;import java.net.URI;/*** @author CoderJia* @create 2024/10/23 16:39* @Description**/
public class MyHttpHandler implements HttpHandler {/*** 创建一个能处理Http请求的处理器** @param request  请求* @param response 响应* @return Mono<Void>:代表处理完成的信号*/@Overridepublic Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {URI uri = request.getURI();System.out.println(Thread.currentThread() + "正在请求:" + uri);response.setStatusCode(HttpStatus.OK); // 设置响应状态码response.getHeaders().add("Content-Type", "text/plain"); // 设置响应头// 响应数据的 DataBufferDataBufferFactory factory = response.bufferFactory();//数据BufferDataBuffer buffer = factory.wrap(new String("Welcome to " + uri).getBytes());// 需要一个 DataBuffer 的发布者return response.writeWith(Mono.just(buffer));}}

在这个 MyHttpHandler 中,我们:

  • 处理传入的 HTTP 请求。
  • 设置响应的状态码和响应头。
  • 通过 Mono 返回响应内容。

5.3 配置 HttpServer

下面是如何配置一个简单的 HttpServer 的示例:

package com.coderjia.boot3webflux.controller;import com.coderjia.boot3webflux.config.MyHttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import reactor.netty.http.server.HttpServer;import java.io.IOException;/*** @author CoderJia* @create 2024/10/24 8:56* @Description**/
public class TestClass {public static void main(String[] args) throws IOException {//快速自己编写一个能处理请求的服务器MyHttpHandler myHttpHandler = new MyHttpHandler();//2、启动一个服务器,监听8080端口,接受数据,拿到数据交给 HttpHandler 进行请求处理ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(myHttpHandler);//3、启动Netty服务器HttpServer.create().host("localhost").port(8080).handle(adapter) //用指定的处理器处理请求.bindNow(); //现在就绑定System.out.println("服务器启动完成,开始接受请求...");System.in.read();System.out.println("服务器停止...");}
}

5.4 效果

启动HttpServer服务

发送请求

6. 总结

通过使用 HttpHandlerHttpServer,Spring Boot 3 提供了强大的响应式编程支持。它们不仅简化了 HTTP
请求处理的过程,还使得应用程序能够以更高的并发性和更低的延迟响应用户请求。在实际开发中,结合 Reactor 的其他功能(如 Mono
Flux)可以构建高性能的响应式应用。

希望这篇博客能够帮助你更好地理解和使用 Spring Boot 3 中的响应式编程。欢迎在评论区分享你的想法和问题!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D Gaussian Splatting代码详解(三):模型构建,实现3D 高斯椭球体的克隆和分裂

3 模型构建 3.4 根据梯度对3D gaussian 进行增加或删减 &#xff08;1&#xff09; 对3D高斯分布进行密集化和修剪的操作 def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size):"""对3D高斯分布进行密集化和修剪的操作:param max_g…

无人机协同控制技术详解!

一、算法概述 无人机协同控制技术算法是指通过综合运用通信、控制、优化等多学科知识&#xff0c;实现对多个无人机的协同控制和任务规划。这些算法通常基于各种数学模型和控制理论&#xff0c;如线性代数、微分方程、最优控制等&#xff0c;旨在确保无人机能够相互协作&#…

【热门主题】000013 C++游戏开发全攻略

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

QT中的item views与Item widgets控件的用法总结

0、前言 在一般进行数据表格展示的时候&#xff0c;大多时候要用到表格、列表或者树形结构。 Qt中常见的控件显示有两大类&#xff1a; Item View (list View、Tree View、Table View、Column View和Undo View&#xff09;Item widget&#xff08;List Widget、Tree Widget和…

ssm+vue645基于web的电影购票系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

Spark RDD

概念 RDD是一种抽象&#xff0c;是Spark对于分布式数据集的抽象&#xff0c;它用于囊括所有内存中和磁盘中的分布式数据实体 RDD 与 数组对比 对比项数组RDD概念类型数据结构实体数据模型抽象数据跨度单机进程内跨进程、跨计算节点数据构成数组元素数据分片(Partitions)数据…

java-数据结构

一.链表 单向链表 /单向链表 public class SinglyLinkedList implements Iterable<Integer> {//头节点private Node head null;//头指针//节点类private static class Node{int value;//值Node next;//下一个节点的指针public Node(int value, Node next) {this.val…

pycharm与anaconda下的pyside6的安装记录

一、打开anaconda虚拟环境的命令行窗口&#xff0c;pip install&#xff0c;加入清华源&#xff1a; pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 二、打开pycharm&#xff0c;在文件--设置--工具--外部工具中配置一下三项&#xff1a; 1、 QtDesigner…

成本累计曲线:项目预算的秘密武器

在项目管理的过程中&#xff0c;成本控制是影响项目成败的关键因素之一&#xff0c;而其中“成本累计曲线”就像是一位财务导航员&#xff0c;为项目的成本控制和进度监控提供了极大的帮助。那么&#xff0c;什么是成本累计曲线&#xff1f;它包含哪些步骤&#xff1f;如何应用…

[0152].第3节:IDEA中工程与模块

我的后端学习大纲 IDEA大纲 1、Project和Module的概念&#xff1a; 2、Module操作&#xff1a; 2.1.创建Module: 2.2.删除Module&#xff1a; 2.3.导入Module&#xff1a; 1.导入外来模块的代码&#xff1a; 查看Project Structure&#xff0c;选择import module&#xff1a…

【Linux网络】UdpSocket

目录 套接字 socket编程 源IP地址和目的IP地址 端口号 网络字节序 socket常用API socket结构 UDP UDP协议&#xff08;用户数据报协议&#xff09; 创建套接字 绑定 通信 udp_echo_server:简单的回显服务器和客户端代码 dict_server:简单的英译汉的网络字典 chat_…

双11猫咪好物盛典开启,线上抢购不停 购物清单新鲜出炉

双十一购物狂欢节终于到了&#xff01;铲屎官们想好要给猫咪添置什么好东西了吗&#xff1f;还不知道怎么选的看过来啦~这里整理了一份双十一购物清单&#xff0c;快看看有没有你需要的吧&#xff01; 双十一养猫必购1&#xff1a;CEWEY自动猫砂盆 CEWEY自动猫砂盆真的是我最爱…

magic-api简单使用二:自定义返回结果

背景 在上一章 中我们学习了搭建项目和导入文件&#xff0c; 这二天稍微有点时间&#xff0c;研究下这个magic-api的写法。 后续如果需要维护或者更改&#xff0c;也能在项目中尽快上手。 今天我们主要学习自定义返回结果&#xff0c;当然也可以使用官方的。不需要任何更改。…

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条&#xff0c;清洗后&#xff0c;90条正确数据在DWD层清洗表&#xff0c;10条错误数据在DWD层清洗数据错误表&#xff0c;所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是&#xff0c;Hive中原本的SQL语句&#xff0c;放在ClickHouse…

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案

【Nas】X-Doc&#xff1a;jellyfin“该客户端与媒体不兼容&#xff0c;服务器未发送兼容的媒体格式”问题解决方案 当使用Jellyfin播放视频时出现“该客户端与媒体不兼容&#xff0c;服务器未发送兼容的媒体格式”&#xff0c;这是与硬件解码和ffmpeg设置有关系&#xff0c;具体…

linux应急响应-1

声明&#xff1a;部分内容来源于网络&#xff0c;只是新手练习 靶场环境来自于知攻善防实验室 概述&#xff1a; 一、整体过程 初始环境设置 将Linux centOS 7配置为图形化界面&#xff0c;通过yum groupinstall “X Window System” -y和yum groupinstall “GNOME Desktop”&a…

视频去水印软件推荐:6款去水印工具值得一试

在视频创作和分享的过程中&#xff0c;水印往往会成为影响美观和平台推流。幸运的是&#xff0c;市面上有许多视频去水印软件能够帮助我们轻松解决这一问题。本文将为大家推荐几款实用的视频去水印软件&#xff0c;并详细介绍它们的功能和去除水印的方法。 1.影忆 功能介绍&…

MaxKB: 一款基于大语言模型的知识库问答系统

嗨, 大家好, 我是徐小夕. 之前一直在社区分享零代码&低代码的技术实践&#xff0c;最近也在研究多模态文档引擎相关的产品, 在社区发现一款非常有意思的知识库问答系统——MaxKB, 它支持通过大语言模型和RAG技术来为知识库赋能,今天就和大家分享一下这款项目. PS: 它提供了…

Java NIO2 异步IO支持

NIO2 从 Java 7 在之前的NIO基础上&#xff0c;它提供了异步 IO 操作、文件系统访问增强等诸多功能 路径&#xff08;Path&#xff09;接口 Path 接口代表了文件系统的路径。它可以用来定位一个文件或目录。 提供了多种方法来解析、转换和查询路径信息。Paths 类提供了一些静…

上市公司数字经济与实体经济融合发展程度测算数据(2008-2022年)-最新出炉_附下载链接

上市公司数字经济与实体经济融合发展程度测算数据&#xff08;2008-2022年&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;上市公司数字经济与实体经济融合发展程度测算数据&#xff08;2008-2022年&#xff09;-最新出炉.zip 一、引言 随着…