Spring Boot Reactor Nettyの構成

1. 概要

このチュートリアルでは、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クライアントとサーバーを提供します。 名前が示すように、https://www.baeldung.com/netty [Netty framework]に基づいています。
では、SpringとSpring Bootがどこに登場するかを見てみましょう。
link:/spring-webflux[Spring WebFlux]はSpringフレームワークの一部であり、Webアプリケーションのリアクティブプログラミングサポートを提供します。 Spring BootアプリケーションでWebFluxを使用している場合、* Spring Boot *は* Reactor Nettyをデフォルトのサーバーとして自動的に設定します*。 それに加えて、Reactor Nettyをプロジェクトに明示的に追加することができ、Spring Bootは再び自動的に構成する必要があります。
次に、自動構成されたReactor Nettyサーバーをカスタマイズする方法を学習するためのアプリケーションを作成します。 その後、いくつかの一般的な構成シナリオについて説明します。

3. 依存関係

まず、必要なMaven依存関係を追加します。
Reactor Nettyサーバーを使用するには、https://search.maven.org/search?q = g:org.springframework.boot%20a:spring-boot-starter-webflux [_spring-boot-starter-webflux_ ] pomファイルの依存関係として:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
これは、https://search.maven.org/search?q = g:org.springframework.boot%20a:spring-boot-starter-reactor-netty [_spring-boot-starter-reactor-netty_]としても取得します。プロジェクトへの推移的な依存関係。

4. サーバー構成

4.1. プロパティファイルの使用

最初のオプションとして、プロパティファイルを使用してNettyサーバーを構成できます。 Spring Bootは、_application_プロパティファイルで一般的なサーバー構成の一部を公開します。
_application.properties_でサーバーポートを定義しましょう:
server.port=8088
または、_application.yml_で同じことを行うこともできます。
server:
    port: 8088
サーバーポートの他に、Spring Bootには他にも多くのlink:/spring-boot-application-configuration [サーバー構成オプション]があります。 * _server_ prefix *で始まるプロパティは、*デフォルトのサーバー設定を上書きします*。 これらのプロパティは、https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html [Spring documentation]で_EMBEDDED SERVER CONFIGURATION_ section __.__で簡単に検索できます。

4.2. プログラムによる構成の使用

それでは、*コードを使用して埋め込みNettyサーバーを構成する方法*を見てみましょう。 この目的のために、Spring Bootは_WebServerFactoryCustomizer_および_NettyServerCustomizer_クラスを提供します。
これらのクラスを使用して、以前にlink:/properties-with-spring [で行ったようにlink:/spring-boot-change-port[Nettyポートを構成]します。プロパティファイル]:
@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 ProtocolCustomizer(8088));
これらの2つのアプローチにより、組み込みReactor Nettyサーバーを構成する際の柔軟性が大幅に向上します。
*さらに、Nettyフレームワーク*から_ServerBootstrap_クラスにアクセスして、そこでカスタマイズを行うこともできます。
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を定義し、そこにカスタマイザーを追加する必要があります。
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
    NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
    webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
    return webServerFactory;
}
次に、いくつかの一般的なNetty構成シナリオを続けます。

5. SSL構成

SSLを構成する方法を見てみましょう。
_NettyServerCustomizer_の別の実装である__SslServerCustomizer __classを使用します。
@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. アクセスログ設定

次に、アクセスロギングlink:/logback[using 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をきめ細かく構成する方法を検討しました。
最後に、この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-5-webflux[on Github]から入手できます。