【spring 】支持spring WebFlux 的容器

2024-06-13 06:52

本文主要是介绍【spring 】支持spring WebFlux 的容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 {@Beanpublic 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 {@Beanpublic 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: 8080undertow:buffer-size: 1024worker-threads: 8direct-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




这篇关于【spring 】支持spring WebFlux 的容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056579

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll