Spring Boot Reactor Netty配置 | Baeldung
在本教程中,我們將在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 <b>public</b> <b>class</b> NettyWebServerFactoryPortCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> { @Override <b>public</b> <b>void</b> customize(NettyReactiveWebServerFactory serverFactory) { serverFactory.setPort(8088); } }
Spring Boot將在啟動期間選擇我們的工廠自定義程式元件,並將配置伺服器埠。
或者,我們可以實現NettyServerCustomizer:
<b>private</b> <b>static</b> <b>class</b> PortCustomizer implements NettyServerCustomizer { <b>private</b> <b>final</b> <b>int</b> port; <b>private</b> PortCustomizer(<b>int</b> port) { <b>this</b>.port = port; } @Override <b>public</b> HttpServer apply(HttpServer httpServer) { <b>return</b> httpServer.port(port); } }
並將其新增到伺服器工廠:
serverFactory.addServerCustomizers(<b>new</b> ProtocolCustomizer(8088));
在配置嵌入式Reactor Netty伺服器時,這兩種方法為我們提供了很大的靈活性。
此外,我們還可以從Netty框架訪問ServerBootstrap類並在那裡進行自定義:
<b>private</b> <b>static</b> <b>class</b> EventLoopNettyCustomizer implements NettyServerCustomizer { @Override <b>public</b> HttpServer apply(HttpServer httpServer) { EventLoopGroup parentGroup = <b>new</b> NioEventLoopGroup(); EventLoopGroup childGroup = <b>new</b> NioEventLoopGroup(); <b>return</b> httpServer.tcpConfiguration(tcpServer -> tcpServer .bootstrap(serverBootstrap -> serverBootstrap .group(parentGroup, childGroup) .channel(NioServerSocketChannel.<b>class</b>))); } }
但是,對於這種情況有一個警告。由於Spring Boot自動配置Netty伺服器,我們可能需要通過顯式定義NettyReactiveWebServerFactory bean 來跳過自動配置。
為此,我們應該在配置類中定義我們的bean並在那裡新增我們的定製器:
@Bean <b>public</b> NettyReactiveWebServerFactory nettyReactiveWebServerFactory() { NettyReactiveWebServerFactory webServerFactory = <b>new</b> NettyReactiveWebServerFactory(); webServerFactory.addServerCustomizers(<b>new</b> EventLoopNettyCustomizer()); <b>return</b> webServerFactory; }
接下來,我們將繼續介紹一些常見的Netty配置方案。
SSL配置
我們來看看如何配置SSL。
我們將使用SslServerCustomizer 類,它是NettyServerCustomizer的另一個實現:
@Component <b>public</b> <b>class</b> NettyWebServerFactorySslCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> { @Override <b>public</b> <b>void</b> customize(NettyReactiveWebServerFactory serverFactory) { Ssl ssl = <b>new</b> Ssl(); ssl.setEnabled(<b>true</b>); ssl.setKeyStore(<font>"classpath:sample.jks"</font><font>); ssl.setKeyAlias(</font><font>"alias"</font><font>); ssl.setKeyPassword(</font><font>"password"</font><font>); ssl.setKeyStorePassword(</font><font>"secret"</font><font>); Http2 http2 = <b>new</b> Http2(); http2.setEnabled(false); serverFactory.addServerCustomizers(<b>new</b> SslServerCustomizer(ssl, http2, <b>null</b>)); serverFactory.setPort(8443); } } </font>
這裡我們定義了與金鑰庫相關的屬性,禁用了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=<b>true</b>
結論
在本文中,我們已經介紹瞭如何在Spring Boot應用程式中配置Reactor Netty伺服器。
首先,我們使用了一般的Spring Boot屬性配置功能。然後,我們探討了如何以細粒度的方式以程式設計方式配置Netty。
最後,本文的原始碼可以在Github上找到 。