2024-01-30更新。

草稿

目的、方法、结论

目的:本文旨在介绍如何在Spring Boot应用程序中配置Reactor Netty服务器。它涉及到通过Spring Boot属性文件配置和编程方式定制Reactor Netty服务器以及常见的配置场景。

方法:

  1. 通过属性文件配置Netty服务器,包括在application.properties或application.yml中定义服务器端口及其他服务器配置选项。

  2. 使用编程方式进行配置,借助 `WebServerFactoryCustomizer`和 `NettyServerCustomizer`类来自定义Netty服务器的端口、`EventLoopGroup`等设置。

  3. 对于SSL配置和访问日志配置,介绍了特定的自定义器类 `NettyWebServerFactorySslCustomizer`和不同于传统Tomcat、Jetty、Undertow服务器的配置方法。

  4. 配置完成后,可以通过指定 `Dreactor.netty.http.server.accessLogEnabled=true`系统属性来启用Netty的访问日志功能。

结论:文中首先探索了基于Spring Boot属性的配置方法,然后探讨了如何以更细粒度的编程方式配置Netty服务器。相关的源代码可以在提供的GitHub链接中找到。

概述

在这个教程中,我们将会查看在Spring Boot应用程序中的Reactor Netty服务器不同配置选项。最后,我们将得到一个展示不同配置方法的应用程序。

2. 什么是Reactor Netty?

在我们开始之前,让我们看看Reactor Netty是什么以及它与Spring Boot的关系。Reactor Netty是一个异步事件驱动的网络应用框架(https://projectreactor.io/docs/netty/snapshot/reference/index.html#getting-started)。它提供了非阻塞且支持背压的TCP、HTTP和UDP客户端与服务器。顾名思义,它基于Netty框架(/netty)。现在,让我们来看看Spring和Spring Boot是如何进入这一领域的。Spring WebFlux (/spring-webflux) 是Spring框架的一部分,并为Web应用提供了响应式编程支持。如果我们在Spring Boot应用程序中使用WebFlux,Spring Boot将自动配置Reactor Netty作为默认服务器。除此之外,我们还可以在项目中明确添加Reactor Netty,Spring Boot应该会再次自动配置它。了解Spring课程:1.概览 2.什么是Reactor Netty?(/) 现在,我们将构建一个应用程序,学习如何自定义我们的自动配置Reactor Netty服务器。之后,我们将覆盖一些常见的配置场景。

3.依赖项

首先,我们将添加所需的Maven依赖项。为了使用Reactor Netty服务器,我们将在我们的pom文件中添加spring-boot-starter-webflux(https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux)作为依赖项:这也将作为传递依赖项把spring-boot-starter-reactor-netty(https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-reactor-netty)拉入我们的项目中。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>

4. 服务器配置

使用属性文件

作为首选方案,我们可以通过属性文件配置Netty服务器。Spring Boot公开了一些常见的服务器配置在application properties文件:让我们在application.properties中定义服务器端口:或者我们可以在application.yml中做同样的事情:除了服务器端口,Spring Boot还有许多其他可用的服务器配置选项(/spring-boot-application-configuration)。以服务器前缀开始的属性让我们可以覆盖默认的服务器配置。我们可以在Spring文档(https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html)的嵌入式服务器配置部分轻易地查找这些属性。

server.port=8088
server:
  port:
    8088

4.2. 使用编程配置

现在,让我们来看看如何通过代码配置我们嵌入式的Netty服务器。为此,Spring Boot给我们提供了WebServerFactoryCustomizer和NettyServerCustomizer类。让我们使用这些类来配置Netty端口(/spring-boot-changeport),就像我们之前通过配置文件(/properties-with-spring)所做的那样。

@Component public class NettyWebServerFactoryPortCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> { @Override public void customize(NettyReactiveWebServerFactory serverFactory) { serverFactory.setPort(8088); } }

在启动时,Spring Boot会识别我们的工厂定制组件,并将配置服务器端口。或者,我们可以实现NettyServerCustomizer。

private static class PortCustomizer implements NettyServerCustomizer { private final int port; private PortCustomizer(int port) { this.port = port; } @Override public HttpServer apply(HttpServer httpServer) { return httpServer.port(port); } }

并将其添加到服务器工厂:

serverFactory.addServerCustomizers(new PortCustomizer(8088));

这两种方法在配置我们的嵌入式Reactor Netty服务器时为我们提供了许多灵活性。此外,我们还可以自定义EventLoopGroup:

private static class EventLoopNettyCustomizer implements NettyServerCustomizer { @Override public HttpServer apply(HttpServer httpServer) { EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); eventLoopGroup.register(new NioServerSocketChannel()); return httpServer.runOn(eventLoopGroup); } }

然而,对于这种情况有一个需要注意的地方。由于Spring Boot会自动配置Netty服务器,我们可能需要通过显式定义我们的NettyReactiveWebServerFactory bean来跳过自动配置。为此,我们应当在配置类中定义我们的bean,并在那里添加我们的自定义内容:

@Bean public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() { NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory(); webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer()); return webServerFactory; }

接下来,我们将继续介绍一些常见的Netty配置场景。

SSL配置

让我们看看如何配置SSL。我们将使用SslServerCustomizer类,这是NettyServerCustomizer的另一种实现:

@Component
public class NettyWebServerFactorySslCustomizer
  implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory serverFactory) {
        Ssl ssl = new Ssl();
        ssl.setEnabled(true);
        ssl.setKeyStore("classpath:sample.jks");
        ssl.setKeyAlias("alias");
        ssl.setKeyPassword("password");
        ssl.setKeyStorePassword("secret");
        Http2 http2 = new Http2();
        http2.setEnabled(false);
        serverFactory.addServerCustomizers(new SslServerCustomizer(ssl, http2, null));
        serverFactory.setPort(8443);
    }
}

我们在这里定义了与密钥库相关的属性,禁用了HTTP/2,并将端口设置为8443。

6. 访问日志配置

现在,我们将看看如何使用Logback配置访问日志记录(/logback)。Spring Boot允许我们在Tomcat、Jetty和Undertow的应用程序属性文件中配置访问日志记录。然而,Netty目前尚未支持这项功能。要启用Netty的访问日志功能,我们在运行应用程序时应该设置Dreactor.netty.http.server.accessLogEnabled=true。

mvn spring-boot:run -Dreactor.netty.http.server.accessLogEnabled=true

7. 结论

在本文中,我们介绍了如何在Spring Boot应用程序中配置Reactor Netty服务器。首先,我们使用了通用的基于Spring Boot属性的配置功能。然后,我们探讨了如何以细粒度的方式以编程方式配置Netty。