【spring 】支持spring WebFlux 的容器

news2024/11/25 13:37:31

spring WebFlux 是 Spring 5 引入的响应式 Web 框架,它支持非阻塞、事件驱动的编程模型,特别适合处理高并发的场景。

Spring WebFlux 可以运行在多种容器上

包括下面:

  1. Netty:

    • Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Spring WebFlux 默认使用 Netty 作为其服务器容器。

  2. Undertow:

    • Undertow 是一个用 Java 编写的灵活的高性能 Web 服务器,它提供了基于 NIO 的非阻塞 HTTP 和 WebSocket 支持。Spring Boot 支持将 Undertow 作为其嵌入式服务器之一。

  3. Tomcat:

    • Tomcat 是一个广泛使用的 Servlet 容器,支持传统的 Servlet 和 JSP 技术。从 Spring Boot 2.0 开始,Tomcat 也支持非阻塞 I/O,因此可以与 Spring WebFlux 一起使用。

  4. Jetty:

    • Jetty 是一个灵活的、轻量级的 Web 服务器和 Servlet 引擎,它也支持非阻塞 I/O。Spring Boot 同样支持将 Jetty 作为其嵌入式服务器之一。

在选择容器时,需要考虑应用程序的需求和容器的特性。例如,如果你的应用程序需要处理大量的并发连接,那么 Netty 或 Undertow 可能是更好的选择,因为它们在设计上就是非阻塞的,可以更有效地利用系统资源。而 Tomcat 和 Jetty 虽然也支持非阻塞 I/O,但它们最初是为阻塞 I/O 设计的,因此在某些场景下可能不如 Netty 和 Undertow 高效。

使用Netty 容器

要在 Spring WebFlux 中使用 Netty 容器,你不需要显式地配置任何依赖,因为 Spring Boot 的 spring-boot-starter-webflux 启动器已经包含了所需的 Netty 依赖。当你创建一个新的 Spring WebFlux 项目时,只需添加 spring-boot-starter-webflux 依赖,Spring Boot 会自动配置并使用 Netty 作为服务器容器。

添加依赖:

Maven 示例 (pom.xml):

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>
编写配置类
mport org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class NettyConfig {

    @Bean
    public WebServerFactoryCustomizer<NettyReactiveWebServerFactory> customizer() {
        return factory -> {
            // 自定义Netty参数
            factory.addServerCustomizers(builder ->
                builder
                       // 设置工作线程池大小
                      .workerEventLoopGroup(NettyThreadFactory.create("netty-worker", 4)) 
                       // 设置监听线程池大小
                      .bossEventLoopGroup(NettyThreadFactory.create("netty-boss", 1)) 
            );
        };
    }
}
编写响应式控制器:


创建一个响应式控制器来处理 HTTP 请求。Spring WebFlux 使用 @RestController 和 @RequestMapping 等注解,但也可以使用函数式端点。

示例控制器 (@RestController):
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class DemoController {

    @GetMapping("/demo")
    public Mono<String> demo() {
        return Mono.just(" I am a  Demo!");
    }
}
 
函数式端点 (RouterFunction):
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;

import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

@Configuration
public class DemoRouter {
    @Bean
    public RouterFunction<ServerResponse> routeHello(DemoHandler demoHandler) {
        return route(GET("/demo"), demoHandler::demo);
    }
}
处理程序类
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class DemoHandler {
    public Mono<ServerResponse> demo(ServerRequest request) {
        return ServerResponse.ok().body(Mono.just("I am a Demo!"), String.class);
    }
}

运行这个应用程序时,Spring Boot 将自动使用 Netty 作为服务器容器,并在默认端口(通常是 8080)上启动服务。你可以通过访问 http://localhost:8080/demo来测试你的响应式控制器。

使用Undertow容器

Undertown 的优势如下:

  1. 支持 HTTP/2:Undertow 开箱即支持 HTTP/2,无需重写启动类路径。
  2. 支持 HTTP Upgrade:允许通过 HTTP 端口复用多种协议。
  3. 支持 Web Socket:Undertow 提供对 Web Sockets 的全面支持,包括 JSR-356 支持。
  4. Servlet 4.0:Undertow 支持 Servlet 4.0,包括对嵌入式 Servlet 的支持。还可以在同一部署中混合使用 Servlet 和原生 undertow 非阻塞 handler。
  5. 可嵌入式:只需几行代码,即可将 Undertow 嵌入应用程序或独立运行。
  6. 灵活性:Undertow 通过链式 handler 进行配置,可以根据需求灵活地添加功能。

要在 Spring Boot 应用程序中使用 Undertow 作为服务器容器,你需要在项目的依赖中指定 spring-boot-starter-web 而不是 spring-boot-starter-webflux,因为 Undertow 支持传统的 Servlet 3.1 非阻塞 I/O,同时也支持 Spring MVC。

添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
配置Undertow

你可以在application.propertiesapplication.yml中配置Undertow的相关参数,例如端口、线程池大小等。

application.yml示例:
server:
  port: 8080
  undertow:
    buffer-size: 1024
    worker-threads: 8
    direct-buffers: true
application.properties示例:
server.port=8080
server.undertow.buffer-size=1024
server.undertow.direct-buffers=true
server.undertow.worker-threads: 8
编写反应式控制器
mport org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class DemoController {

    @GetMapping("/demo")
    public Flux<String> demo() {
        return Flux.just("demo", "from", "Spring", "WebFlux", "with", "Undertow");
    }
}

运行这个应用程序时,Spring Boot 将自动使用 Undertow 作为服务器容器,并在配置的端口(默认是 8080)上启动服务。你可以通过访问 http://localhost:8080/demo来测试控制器。

【注意】如果你想要使用 Undertow 的非阻塞特性,你需要确保你的应用程序代码也支持非阻塞 I/O,例如使用 Spring WebFlux 或 Servlet 3.1 的异步支持。如果你使用的是传统的 Spring MVC,那么 Undertow 的非阻塞特性可能不会被充分利用。

UndertowServletWebServerFactory 配置类的细节:官方文档

Undertow配置属性

配置项说明示例
server.undertow.accesslog.dirUndertow 访问日志目录。
server.undertow.accesslog.enabled是否启用访问日志。FALSE
server.undertow.accesslog.pattern访问日志的格式。common
server.undertow.accesslog.prefix日志文件前缀。access_log.
server.undertow.accesslog.rotate是否开启日志滚动。TRUE
server.undertow.accesslog.suffix日志文件后缀。log
server.undertow.always-set-keep-alive是否应在所有响应中添加 Connection: keep-alive Header,即使 HTTP 规范没有要求。TRUE
server.undertow.buffer-size每个 buffer 的大小。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.decode-slash是否应解码已编码的斜线字符(%2F)。如果前端代理不执行相同的解码,解码可能会导致安全问题。只有在传统应用程序需要时才启用。设置后,server.undertow.allow-encoded-slash 无效。
server.undertow.decode-url是否对 URL 进行解码。禁用时,URL 中的百分比编码字符将保持原样。TRUE
server.undertow.direct-buffers是否在 Java 堆外分配 buffer。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.eager-filter-init是否应在启动时初始化 servlet FilterTRUE
server.undertow.max-cookies允许的最大 cookie 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。200
server.undertow.max-headers允许的最大 header 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.max-http-post-sizeHTTP post content 的最大大小。当值为-1(默认值)时,大小为无限。-1B
server.undertow.max-parameters允许查询或路径参数的最大数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.no-request-timeout在服务器关闭连接之前,连接在不处理请求的情况下闲置的时间。
server.undertow.options.server.*在 io.undertow.UndertowOptions 中定义的服务器选项。
server.undertow.options.socket.*在 org.xnio.Options 中定义的 socket 选项。
server.undertow.preserve-path-on-forward转发请求时是否保留请求路径。FALSE
server.undertow.threads.ioI/O 线程数。默认值为可用的处理器数量。
server.undertow.threads.workerWorker 线程数。默认为 I/O 线程数的 8 倍。
server.undertow.url-charset用于解码 URL 的字符集。UTF-8




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV 的模板匹配

OpenCV中的模板匹配 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中的一种技术&#xff0c;用于在大图像中找到与小图像&#xff08;模板&#xff09;相匹配的部分。OpenCV提供了多种模板匹配的方法&#xff0c;主要包括基于相关性和基于平方差的匹配方法。…

【RPC项目-1】0612

写在前面&#xff0c;主要是作学习回顾笔记&#xff0c;以备后续面试 LogEvent 组成&#xff1a; 日志级别&#xff08;level&#xff09;日期时间(精确到ms)进程号pid&#xff0c;线程号threadid文件名file_name、行号line自定义msg 输出格式如&#xff1a;[level]\t[%y-%…

dvadmin 调试问题

链接&#xff1a;django-vue3-admin: django-vue3-admin 是一套全部开源的快速开发平台&#xff0c;毫无保留给个人免费使用、团体授权使用。 django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台&#xff0c;权限粒度达到列级别&#xff0c;前后端分离&#xff0c;…

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1&#xff1a;使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …

HBase数据存储

1、数据模型 Namespace&#xff08;表命名空间&#xff09;&#xff1a;表命名空间不是强制的&#xff0c;当想把多个表分到一个组去统一管理的时候才会用到表命名空间。Table&#xff08;表&#xff09;&#xff1a;一个表由一个或者多个列族组成。数据属性&#xff0c;都在列…

javaWeb项目-ssm+vue个人博客网站管理系统功能介绍

本项目源码&#xff1a;java-基于ssmvue的个人博客网站的设计与实现源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a…

第 5 章:面向生产的 Spring Boot

在 4.1.2 节中&#xff0c;我们介绍了 Spring Boot 的四大核心组成部分&#xff0c;第 4 章主要介绍了其中的起步依赖与自动配置&#xff0c;本章将重点介绍 Spring Boot Actuator&#xff0c;包括如何通过 Actuator 提供的各种端点&#xff08;endpoint&#xff09;了解系统的…

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 &#xff08;一&#xff09;拥抱互联网黑话&#xff08;抓痛点、谈愿景、搞方法论&#xff09; &#xff08;二&#xff09;DDD真的重要吗&#xff1f; 二、领域驱动设计DDD在B端营销系统的实践 &#xff08;一&#xff09;设计落地步骤 &#xff0…

小程序无法调用服务端问题排查

1、问题描述 突然有一天线上的小程序不能登录&#xff0c;经查小程序无法调用。经查无法小程序页面无法调用后台服务。 2、排查过程 由于无法登录小程序发布服务器&#xff0c;无法测试小程序前端服务器到服务端网络&#xff0c;并且小程序无法看到日志。所以就得从服务端和网…

使用CSS、JavaScript、jQuery三种方式实现手风琴效果

手风琴效果有不少&#xff0c;王者荣耀官网&#xff08;源网址 https://pvp.qq.com/raiders/ &#xff09;有一处周免英雄&#xff0c;使用的就是手风琴效果&#xff0c;如图所示。 我试着用css、js、jQuery三种方式实现了这种效果&#xff0c;最终效果差不多&#xff0c;美中不…

IDEA创建简单web(servlet)项目(server为tomcat)

引言 鉴于网上很少有关于IDEA开发servlet项目的教程&#xff08;24版idea&#xff0c;并且servlet技术十分复古&#xff0c;很少有人用到&#xff0c;能够理解&#xff0c;该文章旨在为在校的学生提供一个参考&#xff0c;项目技术简单&#xff09;本人在此总结从头开始到项目…

MATLAB算法实战应用案例精讲-【数模应用】有序Logit(Logistic)分析

目录 算法原理 logit回归分析步骤 二元logit分析 多分类logit分析 有序logit分析 总结 SPSS 1、问题与数据 2、对数据结构的分析 3、SPSS分析方法 SPSSAU 有序Logit回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 提示…

Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接

一、背景 当我们使用Joplin时&#xff0c;上传图片时会自动上传到Joplin服务器并替换链接 但是Joplin的编辑器不好用&#xff0c;我更习惯用Typora来编辑&#xff0c; 然而Typora中上传的图片只能在本地&#xff0c;无法上传到Joplin服务器&#xff0c;在其他客户端也看不到图片…

迈向『闭环』| PlanAgent:基于MLLM的自动驾驶闭环规划新SOTA!

中科院自动化所深度强化学习团队联合理想汽车等提出了一种新的基于多模态大语言模型MLLM的自动驾驶闭环规划框架—PlanAgent。该方法以场景的鸟瞰图和基于图的文本提示为输入&#xff0c;利用多模态大语言模型的多模态理解和常识推理能力&#xff0c;进行从场景理解到横向和纵向…

若依RuoYi-Vue分离版—免登录直接访问

若依RuoYi-Vue分离版—免登录直接访问 如何不登录直接访问前端&#xff1a;后端:方法1&#xff1a;在SecurityConfig.java中设置httpSecurity配置匿名访问方法2&#xff1a;在对应的方法或类上面使用Anonymous注解。 如何不登录直接访问 官网有说明&#xff1a;如何不登录直接…

pyechart 创建柱形图

Pyecharts 是一个基于 Python 的开源数据可视化库&#xff0c;用于创建各种交互式的图表和可视化效果。它是在 Echarts 的基础上进行封装和优化&#xff0c;Echarts 是一个流行的 JavaScript 数据可视化库pyecharts 中文网站 : https://pyecharts.org/# pyecharts 模块 还支持…

day35| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

文章目录 前言860.柠檬水找零思路方法一 406.根据身高重建队列思路方法一 452. 用最少数量的箭引爆气球思路方法一 总结 前言 860.柠檬水找零 思路 很简单&#xff0c;贪心只有一个&#xff0c;如果20优先用105找零&#xff0c;因为5更加万能一些 方法一 class Solution(ob…

RabbitMQ实践——配置Prometheus和Grafana报表

大纲 启用rabbitmq_prometheus插件安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动配置数据源 在《RabbitMQ实践——在Ubuntu上安装并启用管理后台》中我们已经安装成功RabbitMQ及其管理后台。在此基础上&#xff0c;我们将打通它和Prometheus、Gra…

26.0 Http协议

1. http协议简介 HTTP(Hypertext Transfer Protocol, 超文本传输协议): 是万维网(WWW: World Wide Web)中用于在服务器与客户端(通常是本地浏览器)之间传输超文本的协议.作为一个应用层的协议, HTTP以其简洁, 高效的特点, 在分布式超媒体信息系统中扮演着核心角色. 自1990年提…

Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

1. 数据集介绍 MNIST手写数字数据集&#xff1a; http://yann.lecun.com/exdb/mnist/ MNIST 数据集一共有 7 万张图片&#xff0c;其中 6 万张是训练集&#xff0c; 1 万张是测试集。每张图片是 28 28 的 0−9 的手写数字图片组成。每个图片是黑底白字的形式&#xff0c;黑底…