重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》

期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

  • [1. 什么是响应式编程?](#1. 什么是响应式编程?)
  • [2. Project Reactor 概述](#2. Project Reactor 概述)
  • [3. HttpHandler概述](#3. HttpHandler概述)
    • [3.1 HttpHandler是什么](#3.1 HttpHandler是什么)
    • [3.2 HttpHandler 的工作原理](#3.2 HttpHandler 的工作原理)
    • [3.3 使用 HttpHandler 的场景](#3.3 使用 HttpHandler 的场景)
  • [4. HttpServer概述](#4. HttpServer概述)
    • [4.1 HttpServer是什么](#4.1 HttpServer是什么)
    • [4.2 主要方法](#4.2 主要方法)
  • [5. 使用示例](#5. 使用示例)
    • [5.1 导入相关依赖](#5.1 导入相关依赖)
    • [5.2 创建一个简单的 HttpHandler](#5.2 创建一个简单的 HttpHandler)
    • [5.3 配置 HttpServer](#5.3 配置 HttpServer)
    • [5.4 效果](#5.4 效果)
  • [6. 总结](#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 接口定义如下:

java 复制代码
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 导入相关依赖

xml 复制代码
        <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

java 复制代码
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>:代表处理完成的信号
   */
  @Override
  public 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"); // 设置响应头

    // 响应数据的 DataBuffer
    DataBufferFactory factory = response.bufferFactory();
    //数据Buffer
    DataBuffer buffer = factory.wrap(new String("Welcome to " + uri).getBytes());
    // 需要一个 DataBuffer 的发布者
    return response.writeWith(Mono.just(buffer));
  }

}

在这个 MyHttpHandler 中,我们:

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

5.3 配置 HttpServer

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

java 复制代码
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 中的响应式编程。欢迎在评论区分享你的想法和问题!

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285756 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式