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

重学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>:代表处理完成的信号
   */
  @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 的示例:

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.kler.cn/a/371997.html

相关文章:

  • Python小白学习教程从入门到入坑------第二十课 闭包修饰器(语法基础)
  • 深入理解gPTP时间同步过程
  • C++ —— 常见的初始化
  • 如何实现PHP的安全最大化
  • 字符串、字节流与十六进制字符串的转换:Python、C 和 Go 的实现对比20241029
  • 被上传文件于后端的命名策略
  • Flux-IP-Adapter-V2版本发布,效果实测!是惊喜还是意外?
  • 【PythonWeb开发】Flask-RESTful风格编程
  • itertools模块的combinations很牛
  • 基于Springboot的在线考试与学习交流平台的设计与实现
  • Spring Boot:打造智能植物健康监测平台
  • QT找不到ffmpeg链接库解决方法
  • 用Java查询比特币实时行情 - 附免费查询接口
  • 深入理解Allan方差:用体重数据分析误差的时间尺度与稳定性
  • 《C++音频频谱分析:开启声音世界的神秘之门》
  • tomcat Java项目cpu飙升
  • Mybatis 批量操作存在则更新或者忽略,不存在则插入
  • 【论文阅读】Persistent Homology Based Generative Adversarial Network
  • CSS flex布局- 最后一个元素占满剩余可用高度转载
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 正则表达式笔记
  • Windows目录共享到Linux
  • vue2和vue3在html中引用组件component方式不一样
  • 聊聊AI时代的新岗位
  • 软件测试-覆盖率测试-四关全
  • JavaScript的本地存储知识点详解Cookie、SessionStorage、LocalStorage、IndexedDB