Configuração do Netty do reator de inicialização por mola
1. Visão geral
Neste tutorial, veremos diferentes opções de configuração para um servidor Reactor Netty em um aplicativo Spring Boot. No final, teremos um aplicativo apresentando diferentes abordagens de configuração.
2. O que é o Reactor Netty?
Antes de começar, vamos ver o que é Reactor Netty e como ele se relaciona com Spring Boot.
O reator Netty é umasynchronous event-driven network application framework. Ele fornece clientes e servidores TCP, HTTP e UDP, sem bloqueio e com contrapressão. Como o nome indica, é baseado emNetty framework.
Agora, vamos ver onde Spring e Spring Boot entram em cena.
Spring WebFlux é parte da estrutura Spring e fornece suporte de programação reativa para aplicativos da web. Se estivermos usando WebFlux em um aplicativo Spring Boot,Spring Bootautomatically configuresReactor Netty as the default server. Além disso, podemos adicionar explicitamente o Reactor Netty ao nosso projeto, e o Spring Boot deve configurá-lo automaticamente novamente.
Agora, vamos construir um aplicativo para aprender como podemos personalizar nosso servidor Reactor Netty configurado automaticamente. Depois disso, vamos cobrir alguns cenários de configuração comuns.
3. Dependências
Em primeiro lugar, adicionaremos a dependência necessária do Maven.
Para usar o servidor Reactor Netty, adicionaremosspring-boot-starter-webflux como uma dependência em nosso arquivo pom:
org.springframework.boot
spring-boot-starter-webflux
2.1.3.RELEASE
Isso também incluiráspring-boot-starter-reactor-netty como uma dependência transitiva em nosso projeto.
4. Configuração do servidor
4.1. Usando arquivos de propriedades
Como primeira opção, podemos configurar o servidor Netty através de arquivos de propriedades. Spring Boot expõe algumas das configurações de servidor comuns no arquivo de propriedadesapplication:
Vamos definir a porta do servidor emapplication.properties:
server.port=8088
Ou poderíamos ter feito o mesmo emapplication.yml:
server:
port: 8088
Além da porta do servidor, Spring Boot tem muitos outrosserver configuration options disponíveis. The properties that start with the server prefixlet us override the default server configuration. Podemos facilmente procurar essas propriedades emSpring documentation na seçãoEMBEDDED SERVER CONFIGURATION.
4.2. Usando configuração programática
Agora, vamos ver comowe can configure our embedded Netty server through code. Para este propósito, Spring Boot nos dá as classesWebServerFactoryCustomizereNettyServerCustomizer.
Vamos usar essas classes paraconfigure the Netty port como fizemos anteriormente com nossoproperties file:
@Component
public class NettyWebServerFactoryPortCustomizer
implements WebServerFactoryCustomizer {
@Override
public void customize(NettyReactiveWebServerFactory serverFactory) {
serverFactory.setPort(8088);
}
}
O Spring Boot selecionará nosso componente personalizador de fábrica durante a inicialização e configurará a porta do servidor.
Alternativamente, podemos implementarNettyServerCustomizer:
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 adicione-o à fábrica do servidor:
serverFactory.addServerCustomizers(new ProtocolCustomizer(8088));
Essas duas abordagens nos dão muita flexibilidade ao configurar nosso servidor Reactor Netty incorporado.
Furthermore, we can also access the ServerBootstrap class from the Netty frameworke faça nossas personalizações 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)));
}
}
No entanto, há uma ressalva para este caso. Como o Spring Boot configura automaticamente o servidor Netty,we may need to skip auto-configuration by explicitly defining our NettyReactiveWebServerFactory bean.
Para esse propósito, devemos definir nosso bean em uma classe de configuração e adicionar nosso personalizador lá:
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
return webServerFactory;
}
A seguir, continuaremos com alguns cenários comuns de configuração do Netty.
5. Configuração SSL
Vamos ver como podemos configurar SSL.
Usaremos oSslServerCustomizer class, que é outra implementação deNettyServerCustomizer:
@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);
}
}
Aqui, definimos nossas propriedades relacionadas ao armazenamento de chaves, desabilitamos HTTP / 2 e configuramos a porta para 8443.
6. Configuração do log de acesso
Agora, veremos como podemos configurar o log de acessousing Logback.
O Spring Boot permite configurar o log de acesso no arquivo de propriedades do aplicativo para Tomcat, Jetty e Undertow. No entanto, o Netty ainda não tem esse suporte.
Para habilitar o registro de acesso Netty,we should set-Dreactor.netty.http.server.accessLogEnabled=true ao executar nosso aplicativo:
mvn spring-boot:run -Dreactor.netty.http.server.accessLogEnabled=true
7. Conclusão
Neste artigo, abordamos como configurar o servidor Reactor Netty em um aplicativo Spring Boot.
Primeiramente, usamos os recursos gerais de configuração baseados em propriedades do Spring Boot. E então, exploramos como configurar o Netty de forma programática de maneira refinada.
Por fim, o código-fonte deste artigo está disponívelon Github.