当前位置: 首页 > news >正文

重学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.mrgr.cn/news/57560.html

相关文章:

  • vue3项目页面实现echarts图表渐变色的动态配置
  • 6-4.Android 对话框之进度对话框问题清单(UI 线程问题、外部取消、dismiss 方法与 hide 方法)
  • 在Ubuntu上部署MQTT服务器的详细指南
  • 服务器数据恢复—EXT3文件系统下邮件数据被误删的数据恢复案例
  • Kubernetes固定Pod IP和Mac地址
  • The Open Group 2024年度大会大咖来袭
  • 代码随想录算法训练营第二十五天 | 491.递增子序列 46.全排列 47.全排列Ⅱ
  • LeetCode练习-删除链表的第n个结节
  • Hot100速刷计划day04(10-12)
  • 【网页布局技术】项目六 制作表格并使用CSS美化
  • 【Linux】进程信号(下)
  • CCRC-CDO首席数据官的主要工作内容
  • 全新原生鸿蒙HarmonyOS NEXT发布,书写国产操作系统新篇章!同时,触觉智能发布OpenHarmony5.0固件
  • (一)ArkTS语言——申明与类型
  • day7:软件包管理
  • 力扣247题详解:中心对称数 II 的多种解法与模拟面试
  • 自动粘贴神器,数据复制粘贴快速处理记事本
  • RK平台操作GPIO的两种方法
  • 爬虫中代理ip的选择和使用实战
  • HCIP--1
  • Java 网络下载文件输出字节流
  • 鸿蒙开发融云Demo消息列表
  • 顶层模块中定义一个数组,如何 通过端口将这个数组传递给所有需要它的子模块
  • Find My折叠车|苹果Find My技术与折叠车结合,智能防丢,全球定位
  • 2024年6月份北京深信服——蓝中护网面试经验分享
  • 博客搭建之路:hexo搜索引擎收录