1. 概要

このチュートリアルでは、Spring BootアプリケーションのReactorNettyサーバーのさまざまな構成オプションを見ていきます。 最後に、さまざまな構成アプローチを紹介するアプリケーションを用意します。

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リアクターNettyをデフォルトサーバーとして自動的に構成します。 それに加えて、Reactor Nettyをプロジェクトに明示的に追加することができ、SpringBootが再び自動的に構成する必要があります。

次に、自動構成されたReactorNettyサーバーをカスタマイズする方法を学習するアプリケーションを作成します。 その後、いくつかの一般的な構成シナリオについて説明します。

3. 依存関係

まず、必要なMaven依存関係を追加します。

Reactor Nettyサーバーを使用するには、pomファイルの依存関係として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. プロパティファイルの使用

最初のオプションとして、プロパティファイルを使用してNettyサーバーを構成できます。 Spring Bootは、applicationプロパティファイルで一般的なサーバー構成の一部を公開します。

application.propertiesでサーバーポートを定義しましょう。

server.port=8088

または、application.ymlでも同じことができます。

server:
    port: 8088

サーバーポートの他に、SpringBootには他の多くの利用可能なサーバー構成オプションがあります。 サーバープレフィックスで始まるプロパティにより、デフォルトのサーバー構成を上書きできます。 これらのプロパティは、 EMBEDDED SERVERCONFIGURATIONセクションの下のSpringドキュメントで簡単に調べることができます。

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

それでは、コードを使用して組み込みNettyサーバーを構成する方法を見てみましょう。 この目的のために、SpringBootはWebServerFactoryCustomizerおよびNettyServerCustomizerクラスを提供します。

これらのクラスを使用して、プロパティファイルで以前に行ったように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 PortCustomizer(8088));

これらの2つのアプローチにより、組み込みのReactorNettyサーバーを構成する際に多くの柔軟性が得られます。

さらに、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構成シナリオを続行します。

5. SSL構成

SSLを構成する方法を見てみましょう。

NettyServerCustomizerの別の実装であるSslServerCustomizerクラスを使用します。

@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を設定する必要があります。

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

7. 結論

この記事では、Spring BootアプリケーションでReactorNettyサーバーを構成する方法について説明しました。

まず、一般的なSpringBootプロパティベースの構成機能を使用しました。 次に、プログラムでNettyをきめ細かく構成する方法を検討しました。

最後に、この記事のソースコードは、Githubから入手できます。