SpringBootReactorNettyの構成
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でから入手できます。