Spring Boot Reactor Netty配置

Posted i永无止境

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot Reactor Netty配置相关的知识,希望对你有一定的参考价值。

什么是Reactor Netty?

在开始之前,让我们看一下Reactor Netty是什么以及它与Spring Boot的关系。

Reactor Netty是一个异步事件驱动的网络应用程序框架。它提供非阻塞和背压就绪的TCP,HTTP和UDP客户端和服务器。顾名思义,它基于Netty框架。

现在,让我们看看Spring和Spring Boot的位置。

Spring WebFlux是Spring框架的一部分,为Web应用程序提供反应式编程支持。如果我们在Spring Boot应用程序中使用WebFlux,Spring Boot会 自动将 Reactor Netty 配置为默认服务器。除此之外,我们可以明确地将Reactor Netty添加到我们的项目中,Spring Boot应该再次自动配置它。

现在,我们将构建一个应用程序来了解如何自定义我们自动配置的Reactor Netty服务器。之后,我们将介绍一些常见的配置方案。

首先,我们将添加所需的Maven依赖项。

要使用Reactor Netty服务器,我们将在我们的pom文件中添加spring-boot-starter-webflux作为依赖项:

<span style="color:#333333"><span style="background-color:#f5f5f5"><dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
</span></span>

我们可以通过属性文件配置Netty服务器。Spring Boot公开了应用程序属性文件中的一些常见服务器配置:让我们在application.properties中定义服务器端口:

server.port=8088

除了服务器端口,Spring Boot还有许多其他可用的服务器配置选项。 以服务器  前缀开头的属性 允许我们覆盖默认服务器配置。我们可以在EMBEDDED SERVER CONFIGURATION部分的Spring文档中轻松查找这些属性。

现在,让我们看一下如何通过代码配置嵌入式Netty服务器。为此,Spring Boot为我们提供了WebServerFactoryCustomizer和NettyServerCustomizer类。

让我们使用这些类来配置Netty端口,就像我们之前使用属性文件一样:

<span style="color:#333333"><span style="background-color:#f5f5f5">@Component
<strong>public</strong> <strong>class</strong> NettyWebServerFactoryPortCustomizer 
  implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> 
 
    @Override
    <strong>public</strong> <strong>void</strong> customize(NettyReactiveWebServerFactory serverFactory) 
        serverFactory.setPort(8088);
    

</span></span>

Spring Boot将在启动期间选择我们的工厂自定义程序组件,并将配置服务器端口。

或者,我们可以实现NettyServerCustomizer:

<span style="color:#333333"><span style="background-color:#f5f5f5"><strong>private</strong> <strong>static</strong> <strong>class</strong> PortCustomizer implements NettyServerCustomizer 
    <strong>private</strong> <strong>final</strong> <strong>int</strong> port;
 
    <strong>private</strong> PortCustomizer(<strong>int</strong> port) 
        <strong>this</strong>.port = port;
    
    @Override
    <strong>public</strong> HttpServer apply(HttpServer httpServer) 
        <strong>return</strong> httpServer.port(port);
    

</span></span>

并将其添加到服务器工厂:

<span style="color:#333333"><span style="background-color:#f5f5f5">serverFactory.addServerCustomizers(<strong>new</strong> ProtocolCustomizer(8088));
</span></span>

在配置嵌入式Reactor Netty服务器时,这两种方法为我们提供了很大的灵活性。

此外,我们还可以从Netty框架访问ServerBootstrap类并在那里进行自定义:

<span style="color:#333333"><span style="background-color:#f5f5f5"><strong>private</strong> <strong>static</strong> <strong>class</strong> EventLoopNettyCustomizer implements NettyServerCustomizer 
 
    @Override
    <strong>public</strong> HttpServer apply(HttpServer httpServer) 
        EventLoopGroup parentGroup = <strong>new</strong> NioEventLoopGroup();
        EventLoopGroup childGroup = <strong>new</strong> NioEventLoopGroup();
        <strong>return</strong> httpServer.tcpConfiguration(tcpServer -> tcpServer
          .bootstrap(serverBootstrap -> serverBootstrap
            .group(parentGroup, childGroup)
            .channel(NioserverSocketChannel.<strong>class</strong>)));
    

</span></span>

但是,对于这种情况有一个警告。由于Spring Boot自动配置Netty服务器,我们可能需要通过显式定义NettyReactiveWebServerFactory bean 来跳过自动配置。

为此,我们应该在配置类中定义我们的bean并在那里添加我们的定制器:

<span style="color:#333333"><span style="background-color:#f5f5f5">@Bean
<strong>public</strong> NettyReactiveWebServerFactory nettyReactiveWebServerFactory() 
    NettyReactiveWebServerFactory webServerFactory = <strong>new</strong> NettyReactiveWebServerFactory();
    webServerFactory.addServerCustomizers(<strong>new</strong> EventLoopNettyCustomizer());
    <strong>return</strong> webServerFactory;

</span></span>

接下来,我们将继续介绍一些常见的Netty配置方案。

SSL配置

我们来看看如何配置SSL。

我们将使用SslServerCustomizer 类,它是NettyServerCustomizer的另一个实现:

<span style="color:#333333"><span style="background-color:#f5f5f5">@Component
<strong>public</strong> <strong>class</strong> NettyWebServerFactorySslCustomizer 
  implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> 
 
    @Override
    <strong>public</strong> <strong>void</strong> customize(NettyReactiveWebServerFactory serverFactory) 
        Ssl ssl = <strong>new</strong> Ssl();
        ssl.setEnabled(<strong>true</strong>);
        ssl.setKeyStore(<span style="color:#00bb00">"classpath:sample.jks"</span><span style="color:black">);
        ssl.setKeyAlias(</span><span style="color:#00bb00">"alias"</span><span style="color:black">);
        ssl.setKeyPassword(</span><span style="color:#00bb00">"password"</span><span style="color:black">);
        ssl.setKeyStorePassword(</span><span style="color:#00bb00">"secret"</span><span style="color:black">);
        Http2 http2 = <strong>new</strong> Http2();
        http2.setEnabled(false);
        serverFactory.addServerCustomizers(<strong>new</strong> SslServerCustomizer(ssl, http2, <strong>null</strong>));
        serverFactory.setPort(8443);
    

</span></span></span>

这里我们定义了与密钥库相关的属性,禁用了HTTP / 2,并将端口设置为8443。

访问日志配置

现在,我们将了解如何使用Logback配置访问日志记录。

Spring Boot允许我们在Tomcat,Jetty和Undertow的应用程序属性文件中配置访问日志记录。但是,Netty目前还没有这种支持。

要启用Netty访问日志记录,我们应该 在运行应用程序时设置-Dreactor.netty.http.server.accessLogEnabled = true:

<span style="color:#333333"><span style="background-color:#f5f5f5">mvn spring-boot:run -Dreactor.netty.http.server.accessLogEnabled=<strong>true</strong>
</span></span>

结论

在本文中,我们已经介绍了如何在Spring Boot应用程序中配置Reactor Netty服务器。

首先,我们使用了一般的Spring Boot属性配置功能。然后,我们探讨了如何以细粒度的方式以编程方式配置Netty。

最后,本文的源代码可以在Github上找到

以上是关于Spring Boot Reactor Netty配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Reactor Netty配置

使用 Reactor Netty 配置 Spring Boot 以监听 2 个端口

如何在 Spring Webflux / Reactor Netty Web 应用程序中执行阻塞调用

Reactor Netty websocket 通道过早关闭

使用 reactor netty 为 spring-webflux WebClient 配置 HostnameVerifier

webclient对reactor-netty的封装