Configurazione Spring Boot Reactor Netty

1. Panoramica

In questo tutorial, esamineremo diverse opzioni di configurazione per un server Reactor Netty in un'applicazione Spring Boot. Alla fine, avremo un'applicazione che mostra diversi approcci di configurazione.

2. Che cos'è Reactor Netty?

Prima di iniziare, diamo un'occhiata a cos'è Reactor Netty e come si collega a Spring Boot.

Reactor Netty è un framework di applicazioni di rete asincrono basato su eventi . Fornisce client e server TCP, HTTP e UDP non bloccanti e pronti per la contropressione. Come suggerisce il nome, si basa sul framework Netty.

Ora, vediamo dove entrano in scena Spring e Spring Boot.

Spring WebFlux fa parte del framework Spring e fornisce supporto per la programmazione reattiva per le applicazioni web. Se stiamo usando WebFlux in un'applicazione Spring Boot, Spring Boot configura automaticamente Reactor Netty come server predefinito . In aggiunta a ciò, possiamo aggiungere esplicitamente Reactor Netty al nostro progetto e Spring Boot dovrebbe nuovamente configurarlo automaticamente.

Ora creeremo un'applicazione per imparare come personalizzare il nostro server Reactor Netty configurato automaticamente. Successivamente, tratteremo alcuni scenari di configurazione comuni.

3. Dipendenze

Innanzitutto, aggiungeremo la dipendenza Maven richiesta.

Per utilizzare il server Reactor Netty, aggiungeremo spring-boot-starter-webflux come dipendenza nel nostro file pom:

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

Questo introdurrà anche spring-boot-starter-reattore-netty come dipendenza transitiva nel nostro progetto.

4. Configurazione del server

4.1. Utilizzo dei file delle proprietà

Come prima opzione, possiamo configurare il server Netty tramite i file delle proprietà. Primavera Boot espone alcune delle configurazioni di server comuni nel applicazione file delle proprietà:

Definiamo la porta del server in application.properties :

server.port=8088

Oppure avremmo potuto fare lo stesso in application.yml :

server: port: 8088

Oltre alla porta del server, Spring Boot ha molte altre opzioni di configurazione del server disponibili. Le proprietà che iniziano con il prefisso del server ci consentono di sovrascrivere la configurazione del server predefinita . Possiamo facilmente cercare queste proprietà nella documentazione di Spring nella sezione CONFIGURAZIONE SERVER INTEGRATA .

4.2. Utilizzo della configurazione programmatica

Ora, diamo un'occhiata a come possiamo configurare il nostro server Netty incorporato tramite codice . A tale scopo, Spring Boot ci fornisce le classi WebServerFactoryCustomizer e NettyServerCustomizer .

Usiamo queste classi per configurare la porta Netty come abbiamo fatto in precedenza con il nostro file delle proprietà:

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

Spring Boot raccoglierà il nostro componente di personalizzazione di fabbrica durante l'avvio e configurerà la porta del server.

In alternativa, possiamo implementare 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); } }

E aggiungilo alla fabbrica del server:

serverFactory.addServerCustomizers(new PortCustomizer(8088));

Questi due approcci ci danno molta flessibilità durante la configurazione del nostro server Reactor Netty incorporato.

Inoltre, possiamo anche accedere alla classe ServerBootstrap dal framework Netty e apportare le nostre personalizzazioni lì:

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

Tuttavia, c'è un avvertimento per questo caso. Poiché Spring Boot configura automaticamente il server Netty, potrebbe essere necessario saltare la configurazione automatica definendo esplicitamente il nostro bean NettyReactiveWebServerFactory .

A tal fine, dovremmo definire il nostro bean in una classe di configurazione e aggiungere lì il nostro personalizzatore:

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

Successivamente, continueremo con alcuni scenari di configurazione Netty comuni.

5. Configurazione SSL

Vediamo come possiamo configurare SSL.

Useremo la classe SslServerCustomizer che è un'altra implementazione di 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); } }

Qui abbiamo definito le nostre proprietà relative al keystore, disabilitato HTTP / 2 e impostato la porta su 8443.

6. Configurazione registro di accesso

Ora vedremo come configurare la registrazione degli accessi utilizzando Logback.

Spring Boot ci consente di configurare la registrazione degli accessi nel file delle proprietà dell'applicazione per Tomcat, Jetty e Undertow. Tuttavia, Netty non ha ancora questo supporto.

Per abilitare la registrazione degli accessi Netty, dobbiamo impostare -Dreactor.netty.http.server.accessLogEnabled = true durante l'esecuzione della nostra applicazione:

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

7. Conclusione

In questo articolo, abbiamo spiegato come configurare il server Reactor Netty in un'applicazione Spring Boot.

In primo luogo, abbiamo utilizzato le funzionalità di configurazione basate sulle proprietà generali di Spring Boot. Quindi, abbiamo esplorato come configurare Netty a livello di programmazione in modo dettagliato.

Infine, il codice sorgente di questo articolo è disponibile su Github.