Spring Boot Reactor Netty-Konfiguration

1. Übersicht

In diesem Tutorial werden verschiedene Konfigurationsoptionen für einen Reactor Netty-Server in einer Spring Boot-Anwendung vorgestellt. Am Ende haben wir eine Anwendung, die verschiedene Konfigurationsansätze zeigt.

2. Was ist Reactor Netty?

Bevor wir beginnen, schauen wir uns an, was Reactor Netty ist und wie es sich auf Spring Boot bezieht.

Reactor Netty ist ein asynchrones ereignisgesteuertes Netzwerkanwendungsframework . Es bietet nicht blockierende und für den Gegendruck geeignete TCP-, HTTP- und UDP-Clients und -Server. Wie der Name schon sagt, basiert es auf dem Netty-Framework.

Nun wollen wir sehen, wo Spring und Spring Boot ins Bild kommen.

Spring WebFlux ist Teil des Spring-Frameworks und bietet reaktive Programmierunterstützung für Webanwendungen. Wenn wir WebFlux in einer Spring Boot-Anwendung verwenden, konfiguriert Spring Boot Reactor Netty automatisch als Standardserver . Darüber hinaus können wir Reactor Netty explizit zu unserem Projekt hinzufügen, und Spring Boot sollte es automatisch neu konfigurieren.

Jetzt erstellen wir eine Anwendung, um zu erfahren, wie wir unseren automatisch konfigurierten Reactor Netty-Server anpassen können. Danach werden einige gängige Konfigurationsszenarien behandelt.

3. Abhängigkeiten

Zunächst fügen wir die erforderliche Maven-Abhängigkeit hinzu.

Um den Reactor Netty-Server zu verwenden, fügen wir den Spring-Boot-Starter-Webflux als Abhängigkeit in unsere POM-Datei ein:

 org.springframework.boot spring-boot-starter-webflux 

Dies wird auch Spring-Boot-Starter-Reactor-Netty als transitive Abhängigkeit in unser Projekt einbeziehen .

4. Serverkonfiguration

4.1. Verwenden von Eigenschaftendateien

Als erste Option können wir den Netty-Server über Eigenschaftendateien konfigurieren. Spring Boot macht einige der gängigen Serverkonfigurationen in der Anwendungseigenschaftendatei verfügbar:

Definieren wir den Server-Port in application.properties :

server.port=8088

Oder wir hätten dasselbe in application.yml tun können :

server: port: 8088

Neben dem Server-Port bietet Spring Boot viele weitere verfügbare Serverkonfigurationsoptionen. Die Eigenschaften , die mit dem Start - Server - Präfix lassen Sie uns die Standard - Server - Konfiguration außer Kraft setzen . Wir können diese Eigenschaften leicht in der Spring-Dokumentation im Abschnitt EMBEDDED SERVER CONFIGURATION nachschlagen .

4.2. Programmatische Konfiguration verwenden

Schauen wir uns nun an, wie wir unseren eingebetteten Netty-Server über Code konfigurieren können . Zu diesem Zweck gibt uns Spring Boot die Klassen WebServerFactoryCustomizer und NettyServerCustomizer .

Verwenden Sie diese Klassen, um den Netty-Port wie zuvor mit unserer Eigenschaftendatei zu konfigurieren:

@Component public class NettyWebServerFactoryPortCustomizer implements WebServerFactoryCustomizer { @Override public void customize(NettyReactiveWebServerFactory serverFactory) { serverFactory.setPort(8088); } }

Spring Boot übernimmt während des Startvorgangs unsere werkseitige Customizer-Komponente und konfiguriert den Server-Port.

Alternativ können wir NettyServerCustomizer implementieren :

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

Und fügen Sie es der Serverfabrik hinzu:

serverFactory.addServerCustomizers(new PortCustomizer(8088));

Diese beiden Ansätze bieten uns viel Flexibilität bei der Konfiguration unseres eingebetteten Reactor Netty-Servers.

Darüber hinaus können wir auch über das Netty-Framework auf die ServerBootstrap- Klasse zugreifen und dort unsere Anpassungen vornehmen:

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

Es gibt jedoch eine Einschränkung für diesen Fall. Da Spring Boot den Netty-Server automatisch konfiguriert, müssen wir möglicherweise die automatische Konfiguration überspringen, indem wir unsere NettyReactiveWebServerFactory- Bean explizit definieren .

Zu diesem Zweck sollten wir unsere Bean in einer Konfigurationsklasse definieren und dort unseren Customizer hinzufügen:

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

Als Nächstes fahren wir mit einigen gängigen Netty-Konfigurationsszenarien fort.

5. SSL-Konfiguration

Mal sehen, wie wir SSL konfigurieren können.

Wir werden die SslServerCustomizer- Klasse verwenden, eine weitere Implementierung von NettyServerCustomizer :

@Component public class NettyWebServerFactorySslCustomizer implements WebServerFactoryCustomizer { @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); } }

Hier haben wir unsere Keystore-bezogenen Eigenschaften definiert, HTTP / 2 deaktiviert und den Port auf 8443 festgelegt.

6. Greifen Sie auf die Protokollkonfiguration zu

Nun schauen wir uns an, wie wir die Zugriffsprotokollierung mit Logback konfigurieren können.

Mit Spring Boot können wir die Zugriffsprotokollierung in der Anwendungseigenschaftendatei für Tomcat, Jetty und Undertow konfigurieren. Netty hat diese Unterstützung jedoch noch nicht.

Um die Netty-Zugriffsprotokollierung zu aktivieren, sollten Sie -Dreactor.netty.http.server.accessLogEnabled = true festlegen, wenn Sie unsere Anwendung ausführen :

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

7. Fazit

In diesem Artikel haben wir beschrieben, wie Sie den Reactor Netty-Server in einer Spring Boot-Anwendung konfigurieren.

Zunächst haben wir die allgemeinen, auf Spring Boot-Eigenschaften basierenden Konfigurationsfunktionen verwendet. Anschließend haben wir untersucht, wie Netty programmgesteuert und feinkörnig konfiguriert werden kann.

Schließlich ist der Quellcode für diesen Artikel auf Github verfügbar.