1. 概述

在本教程中,我们将探讨如何在 Spring Boot 应用中对 Reactor Netty 服务器进行各种配置。最终我们会构建一个示例应用,展示不同的配置方式。

2. Reactor Netty 是什么?

开始之前,先明确一下 Reactor Netty 到底是什么,以及它与 Spring Boot 的关系。

Reactor Netty 是一个 异步事件驱动的网络应用框架。它提供了支持背压(backpressure)的非阻塞 TCP、HTTP 和 UDP 客户端及服务器实现。顾名思义,它是基于 Netty 框架 构建的。

那么 Spring 和 Spring Boot 在其中扮演什么角色呢?

Spring WebFlux 是 Spring 框架的一部分,为 Web 应用提供响应式编程支持。如果我们在 Spring Boot 项目中使用 WebFlux,Spring Boot 会自动配置 Reactor Netty 作为默认服务器。当然,我们也可以显式地引入 Reactor Netty,Spring Boot 同样会自动完成配置。

接下来,我们将通过实际代码来演示如何自定义这个自动配置好的 Reactor Netty 服务器,并介绍一些常见的配置场景。

3. 依赖配置

首先,我们需要添加必要的 Maven 依赖。

要使用 Reactor Netty 服务器,只需在 pom.xml 文件中添加 spring-boot-starter-webflux 依赖:

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

这将自动引入 spring-boot-starter-reactor-netty 作为传递依赖。

4. 服务器配置

4.1. 使用配置文件方式

最简单的方式是通过配置文件来进行设置。Spring Boot 提供了大量以 server 为前缀的属性,用于覆盖默认的嵌入式服务器配置。

比如,在 application.properties 中指定端口:

server.port=8088

或者在 application.yml 中:

server:
  port: 8088

除了端口之外,还有很多其他可用的 服务器配置选项,可以查阅 Spring 官方文档 中的 EMBEDDED SERVER CONFIGURATION 部分获取完整列表。

小贴士:这种方式适合快速上手和基础配置,简单粗暴,但灵活性有限。

4.2. 编程式配置

如果需要更精细的控制,可以通过 Java 代码进行配置。Spring Boot 提供了 WebServerFactoryCustomizerNettyServerCustomizer 来帮助我们实现这一点。

自定义端口

例如,我们可以像下面这样设置端口:

@Component
public class NettyWebServerFactoryPortCustomizer 
  implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory serverFactory) {
        serverFactory.setPort(8088);
    }
}

Spring Boot 启动时会自动加载这个组件并应用配置。

使用 NettyServerCustomizer

还可以使用 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));

自定义 EventLoopGroup

此外,我们还能自定义 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 的自动配置,手动声明 NettyReactiveWebServerFactory Bean。

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

总结:编程式配置更加灵活,适用于需要深度定制的场景。

5. 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);
    }
}

在这个例子中,我们设置了 keystore 相关参数,禁用了 HTTP/2 并将端口设为 8443。

6. 访问日志配置

现在我们来看看如何开启访问日志(access log),这里使用 Logback 进行输出。

目前 Spring Boot 对 Tomcat、Jetty 和 Undertow 支持通过配置文件开启访问日志,但对于 Netty 还没有直接支持。

解决方案:启动应用时加上系统属性 -Dreactor.netty.http.server.accessLogEnabled=true 即可启用:

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

7. 总结

本文详细介绍了在 Spring Boot 应用中对 Reactor Netty 服务器的各种配置方式:

  • ✅ 通过 application.propertiesapplication.yml 快速配置;
  • ✅ 利用 WebServerFactoryCustomizerNettyServerCustomizer 精确控制;
  • ✅ 开启 SSL 和访问日志的方法;

这些方法可以帮助你在不同场景下灵活调整 Netty 服务器的行为,满足生产环境中的各种需求。


原始标题:Spring Boot Reactor Netty Configuration | Baeldung