欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

2024/10/31 13:09:10 来源:https://blog.csdn.net/u014390502/article/details/143203617  浏览:    关键词:重学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 中的响应式编程。欢迎在评论区分享你的想法和问题!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com