Spring Boot Reactor Netty配置 | Baeldung

banq發表於2019-03-24

在本教程中,我們將在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作為依賴項:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>


我們可以透過屬性檔案配置Netty伺服器。Spring Boot公開了應用程式屬性檔案中的一些常見伺服器配置:讓我們在application.properties中定義伺服器埠:
server.port=8088

除了伺服器埠,Spring Boot還有許多其他可用的伺服器配置選項。 以伺服器  字首開頭的屬性 允許我們覆蓋預設伺服器配置。我們可以在EMBEDDED SERVER CONFIGURATION部分的Spring文件中輕鬆查詢這些屬性。

現在,讓我們看一下如何透過程式碼配置嵌入式Netty伺服器。為此,Spring Boot為我們提供了WebServerFactoryCustomizer和NettyServerCustomizer類。
讓我們使用這些類來配置Netty埠,就像我們之前使用屬性檔案一樣:

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


Spring Boot將在啟動期間選擇我們的工廠自定義程式元件,並將配置伺服器埠。
或者,我們可以實現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);
    }
}

並將其新增到伺服器工廠:

serverFactory.addServerCustomizers(new ProtocolCustomizer(8088));


在配置嵌入式Reactor Netty伺服器時,這兩種方法為我們提供了很大的靈活性。
此外,我們還可以從Netty框架訪問ServerBootstrap類並在那裡進行自定義:

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


但是,對於這種情況有一個警告。由於Spring Boot自動配置Netty伺服器,我們可能需要透過顯式定義NettyReactiveWebServerFactory bean 來跳過自動配置。
為此,我們應該在配置類中定義我們的bean並在那裡新增我們的定製器:

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


接下來,我們將繼續介紹一些常見的Netty配置方案。

SSL配置
我們來看看如何配置SSL。
我們將使用SslServerCustomizer 類,它是NettyServerCustomizer的另一個實現:

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


這裡我們定義了與金鑰庫相關的屬性,禁用了HTTP / 2,並將埠設定為8443。

訪問日誌配置
現在,我們將瞭解如何使用Logback配置訪問日誌記錄。
Spring Boot允許我們在Tomcat,Jetty和Undertow的應用程式屬性檔案中配置訪問日誌記錄。但是,Netty目前還沒有這種支援。
要啟用Netty訪問日誌記錄,我們應該 在執行應用程式時設定-Dreactor.netty.http.server.accessLogEnabled = true:

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


結論
在本文中,我們已經介紹瞭如何在Spring Boot應用程式中配置Reactor Netty伺服器。
首先,我們使用了一般的Spring Boot屬性配置功能。然後,我們探討了如何以細粒度的方式以程式設計方式配置Netty。
最後,本文的原始碼可以在Github上找到

相關文章