Spring Boot Reactor Netty配置

Spring Boot Reactor Netty Configuration

1.概述

在本教程中,我们将研究Spring Boot应用程序中Reactor Netty服务器的不同配置选项。 最后,我们将提供一个展示不同配置方法的应用程序。

2.什么是Reactor Netty?

在开始之前,让我们看一下什么是Reactor Netty以及它与Spring Boot的关系。

Reactor Netty是一个异步事件驱动的网络应用程序框架。 它提供了非阻塞且支持背压的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文件中添加spring-boot-starter-webflux作为依赖项:

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

这还将把spring-boot-starter-reactor-netty作为传递依赖项引入到我们的项目中。

4.服务器配置

4.1。 使用属性文件

作为第一个选项,我们可以通过属性文件配置Netty服务器。 Spring Boot在应用程序属性文件中公开了一些常见的服务器配置:

让我们在application.properties中定义服务器端口:

1
server.port=8088

或者我们可以在application.yml中做同样的事情:

1
2
server:
    port: 8088

除了服务器端口,Spring Boot还有许多其他可用的服务器配置选项。以serverprefix开头的属性使我们可以覆盖默认服务器配置。 我们可以在Spring文档的EMBEDDED SERVER CONFIGURATION部分中轻松查找这些属性。

4.2。 使用程序配置

现在,让我们看看如何通过代码配置嵌入式Netty服务器。 为此,Spring Boot为我们提供了WebServerFactoryCustomizer和NettyServerCustomizer类。

让我们使用这些类来配置Netty端口,就像之前对属性文件所做的那样:

1
2
3
4
5
6
7
8
9
@Component
public class NettyWebServerFactoryPortCustomizer
  implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

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

Spring Boot将在启动期间拾取我们的工厂定制程序组件,并将配置服务器端口。

或者,我们可以实现NettyServerCustomizer:

1
2
3
4
5
6
7
8
9
10
11
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);
    }
}

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

1
serverFactory.addServerCustomizers(new PortCustomizer(8088));

这两种方法在配置嵌入式Reactor Netty服务器时为我们提供了很大的灵活性。

此外,我们还可以从Netty框架访问ServerBootstrap类,并在那里进行自定义:

1
2
3
4
5
6
7
8
9
10
11
12
private static class EventLoopNettyCustomizer implements NettyServerCustomizer {

    @Override
    public HttpServer apply(HttpServer httpServer) {
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();
        return httpServer.tcpConfiguration(tcpServer -> tcpServer
          .bootstrap(serverBootstrap -> serverBootstrap
            .group(parentGroup, childGroup)
            .channel(NioServerSocketChannel.class)));
    }
}

但是,这种情况有一个警告。 由于Spring Boot自动配置Netty服务器,因此我们可能需要通过显式定义NettyReactiveWebServerFactory bean来跳过自动配置。

为此,我们应该在配置类中定义bean并在其中添加我们的定制程序:

1
2
3
4
5
6
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
    NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
    webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
    return webServerFactory;
}

接下来,我们将继续一些常见的Netty配置方案。

5. SSL配置

让我们看看如何配置SSL。

我们将使用SslServerCustomizer类,它是NettyServerCustomizer的另一个实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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配置访问日志。

通过Spring Boot,我们可以在应用程序属性文件中为Tomcat,Jetty和Undertow配置访问日志。 但是,Netty尚无此支持。

要启用Netty访问日志记录,我们应该在运行应用程序时设置-Dreactor.netty.http.server.accessLogEnabled = true:

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

7.结论

在本文中,我们介绍了如何在Spring Boot应用程序中配置Reactor Netty服务器。

首先,我们使用了常规的基于Spring Boot属性的配置功能。 然后,我们探索了如何以细粒度的方式以编程方式配置Netty。

最后,Github上提供了本文的源代码。

1