Spring Boot Reactor Netty-configuratie

1. Overzicht

In deze tutorial gaan we kijken naar verschillende configuratie-opties voor een Reactor Netty-server in een Spring Boot-applicatie. Uiteindelijk zullen we een applicatie hebben met verschillende configuratiebenaderingen.

2. Wat is Reactor Netty?

Laten we, voordat we beginnen, eens kijken naar wat Reactor Netty is en hoe het zich verhoudt tot Spring Boot.

Reactor Netty is een asynchroon, gebeurtenisgestuurd netwerkapplicatieframework. Het biedt niet-blokkerende en voor tegendruk geschikte TCP-, HTTP- en UDP-clients en -servers. Zoals de naam al aangeeft, is het gebaseerd op het Netty-framework.

Laten we nu eens kijken waar Spring en Spring Boot in beeld komen.

Spring WebFlux maakt deel uit van het Spring-framework en biedt reactieve programmeerondersteuning voor webapplicaties. Als we WebFlux gebruiken in een Spring Boot-applicatie, Spring Bootautomatisch geconfigureerdReactor Netty als de standaardserver. Daarnaast kunnen we Reactor Netty expliciet aan ons project toevoegen, en Spring Boot zou het opnieuw automatisch moeten configureren.

Nu gaan we een applicatie bouwen om te leren hoe we onze automatisch geconfigureerde Reactor Netty-server kunnen aanpassen. Daarna behandelen we enkele veelvoorkomende configuratiescenario's.

3. Afhankelijkheden

Ten eerste voegen we de vereiste Maven-afhankelijkheid toe.

Om de Reactor Netty-server te gebruiken, zullen we de spring-boot-starter-webflux als afhankelijkheid in ons pom-bestand:

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

Dit zal ook naar binnen trekken spring-boot-starter-reactor-netty als een transitieve afhankelijkheid in ons project.

4. Serverconfiguratie

4.1. Eigenschappenbestanden gebruiken

Als eerste optie kunnen we de Netty-server configureren via eigenschappenbestanden. Spring Boot toont enkele van de algemene serverconfiguraties in het toepassing eigenschappenbestand:

Laten we de serverpoort definiëren in application.properties:

server.port = 8088

Of we hadden hetzelfde kunnen doen in application.yml:

server: poort: 8088

Naast de serverpoort heeft Spring Boot vele andere beschikbare serverconfiguratie-opties. De eigenschappen die beginnen met de server voorvoegsellaten we de standaard serverconfiguratie overschrijven. We kunnen deze eigenschappen gemakkelijk opzoeken in de Spring-documentatie onder de INGEBOUWDE SERVERCONFIGURATIE sectie.

4.2. Programmatische configuratie gebruiken

Laten we nu eens kijken hoe we kunnen onze embedded Netty-server configureren via code. Voor dit doel geeft Spring Boot ons de WebServerFactoryCustomizer en NettyServerCustomizer klassen.

Laten we deze klassen gebruiken om de Netty-poort te configureren zoals we eerder deden met ons eigenschappenbestand:

@Component openbare klasse NettyWebServerFactoryPortCustomizer implementeert WebServerFactoryCustomizer {@Override openbare leegte aanpassen (NettyReactiveWebServerFactory serverFactory) {serverFactory.setPort (8088); }}

Spring Boot pikt onze fabrieksaanpassingscomponent op tijdens het opstarten en configureert de serverpoort.

Als alternatief kunnen we implementeren NettyServerCustomizer:

private statische klasse PortCustomizer implementeert NettyServerCustomizer {private final int port; private PortCustomizer (int poort) {this.port = poort; } @Override openbare HttpServer toepassen (HttpServer httpServer) {retourneer httpServer.port (poort); }}

En voeg het toe aan de serverfabriek:

serverFactory.addServerCustomizers (nieuwe PortCustomizer (8088));

Deze twee benaderingen geven ons veel flexibiliteit bij het configureren van onze ingebouwde Reactor Netty-server.

Verder hebben we ook toegang tot het ServerBootstrap class uit het Netty-framework en maak daar onze aanpassingen:

privé statische klasse EventLoopNettyCustomizer implementeert NettyServerCustomizer {@Override openbare HttpServer toepassen (HttpServer httpServer) {EventLoopGroup parentGroup = nieuwe NioEventLoopGroup (); EventLoopGroup childGroup = nieuwe NioEventLoopGroup (); retourneer httpServer.tcpConfiguration (tcpServer -> tcpServer .bootstrap (serverBootstrap -> serverBootstrap .group (parentGroup, childGroup) .channel (NioServerSocketChannel.class))); }}

Er is echter een voorbehoud voor dit geval. Omdat Spring Boot de Netty-server automatisch configureert, we moeten de autoconfiguratie mogelijk overslaan door expliciet onze NettyReactiveWebServerFactory Boon.

Hiervoor moeten we onze bean in een configuratieklasse definiëren en daar onze customizer toevoegen:

@Bean openbaar NettyReactiveWebServerFactory nettyReactiveWebServerFactory () {NettyReactiveWebServerFactory webServerFactory = nieuwe NettyReactiveWebServerFactory (); webServerFactory.addServerCustomizers (nieuwe EventLoopNettyCustomizer ()); retourneer webServerFactory; }

Vervolgens gaan we verder met enkele veelvoorkomende Netty-configuratiescenario's.

5. SSL-configuratie

Laten we eens kijken hoe we SSL kunnen configureren.

We gebruiken de SslServerCustomizer class die een andere implementatie is van NettyServerCustomizer:

@Component openbare klasse NettyWebServerFactorySslCustomizer implementeert WebServerFactoryCustomizer {@Override openbare leegte aanpassen (NettyReactiveWebServerFactory serverFactory) {Ssl ssl = nieuwe Ssl (); ssl.setEnabled (true); ssl.setKeyStore ("classpath: sample.jks"); ssl.setKeyAlias ​​("alias"); ssl.setKeyPassword ("wachtwoord"); ssl.setKeyStorePassword ("geheim"); Http2 http2 = nieuwe Http2 (); http2.setEnabled (false); serverFactory.addServerCustomizers (nieuwe SslServerCustomizer (ssl, http2, null)); serverFactory.setPort (8443); }}

Hier hebben we onze keystore-gerelateerde eigenschappen gedefinieerd, HTTP / 2 uitgeschakeld en de poort ingesteld op 8443.

6. Toegang tot logboekconfiguratie

Nu gaan we bekijken hoe we toegangsregistratie kunnen configureren met Logback.

Met Spring Boot kunnen we toegangslogboekregistratie configureren in het bestand met applicatie-eigenschappen voor Tomcat, Jetty en Undertow. Netty heeft deze ondersteuning echter nog niet.

Om Netty-toegangsregistratie in te schakelen, we zouden moeten gaan-Dreactor.netty.http.server.accessLogEnabled = waar bij het uitvoeren van onze applicatie:

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

7. Conclusie

In dit artikel hebben we besproken hoe u de Reactor Netty-server configureert in een Spring Boot-toepassing.

Ten eerste hebben we de algemene configuratiemogelijkheden op basis van Spring Boot-eigenschappen gebruikt. En toen hebben we onderzocht hoe we Netty programmatisch op een fijnmazige manier konden configureren.

Eindelijk is de broncode voor dit artikel beschikbaar op Github.