1. Обзор
В этом руководстве мы рассмотрим различные параметры конфигурации сервера Reactor Netty в приложении Spring Boot. В итоге у нас будет приложение, демонстрирующее различные подходы к настройке.
2. Что такое Reactor Netty?
Прежде чем мы начнем, давайте посмотрим, что такое Reactor Netty и как он связан со Spring Boot.
Reactor Netty — это асинхронная среда сетевых приложений, управляемая событиями . Он предоставляет неблокирующие и готовые к обратному давлению клиенты и серверы TCP, HTTP и UDP. Как следует из названия, он основан на платформе Netty .
Теперь давайте посмотрим, где в дело вступают Spring и Spring Boot.
Spring WebFlux является частью среды Spring и обеспечивает поддержку реактивного программирования для веб-приложений. Если мы используем WebFlux в приложении Spring Boot, Spring Boot автоматически настраивает Reactor Netty в качестве сервера по умолчанию . В дополнение к этому мы можем явно добавить Reactor Netty в наш проект, и Spring Boot должен снова автоматически настроить его.
Теперь мы создадим приложение, чтобы узнать, как мы можем настроить наш автоматически настроенный сервер Reactor Netty. После этого мы рассмотрим некоторые распространенные сценарии настройки.
3. Зависимости
Во-первых, мы добавим необходимую зависимость Maven.
Чтобы использовать сервер Reactor Netty, мы добавим spring-boot-starter-webflux
в качестве зависимости в наш файл pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Это также привлечет spring-boot-starter-reactor-netty
в качестве транзитивной зависимости в наш проект.
4. Конфигурация сервера
4.1. Использование файлов свойств
В качестве первого варианта мы можем настроить сервер Netty через файлы свойств. Spring Boot предоставляет некоторые общие конфигурации сервера в файле свойств приложения :
Давайте определим порт сервера в application.properties
:
server.port=8088
Или мы могли бы сделать то же самое в application.yml
:
server:
port: 8088
Помимо порта сервера, Spring Boot имеет множество других доступных параметров конфигурации сервера . Свойства, начинающиеся с префикса сервера
, позволяют переопределить конфигурацию сервера по умолчанию . Мы можем легко найти эти свойства в документации Spring в разделе EMBEDDED SERVER
CONFIGURATION .
4.2. Использование программной конфигурации
Теперь давайте посмотрим, как мы можем настроить наш встроенный сервер 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 PortCustomizer(8088));
Эти два подхода дают нам большую гибкость при настройке нашего встроенного сервера Reactor Netty.
Кроме того, мы также можем настроить EventLoopGroup
:
private static class EventLoopNettyCustomizer implements NettyServerCustomizer {
@Override
public HttpServer apply(HttpServer httpServer) {
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
eventLoopGroup.register(new NioServerSocketChannel());
return httpServer.runOn(eventLoopGroup);
}
}
Однако на этот случай есть оговорка. Поскольку Spring Boot автоматически настраивает сервер Netty, нам может потребоваться пропустить автоматическую настройку, явно определив наш bean-компонент NettyReactiveWebServerFactory
.
Для этого мы должны определить наш бин в классе конфигурации и добавить туда наш кастомайзер:
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
return webServerFactory;
}
Далее мы продолжим с некоторыми распространенными сценариями настройки Netty.
5. Настройка 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.
6. Доступ к конфигурации журнала
Теперь мы рассмотрим, как мы можем настроить ведение журнала доступа с помощью Logback .
Spring Boot позволяет нам настроить ведение журнала доступа в файле свойств приложения для Tomcat, Jetty и Undertow. Однако у Netty пока нет такой поддержки.
Чтобы включить ведение журнала доступа Netty, мы должны установить -Dreactor.netty.http.server.accessLogEnabled=true
при запуске нашего приложения:
mvn spring-boot:run -Dreactor.netty.http.server.accessLogEnabled=true
7. Заключение
В этой статье мы рассмотрели, как настроить сервер Reactor Netty в приложении Spring Boot.
Во-первых, мы использовали общие возможности конфигурации Spring Boot на основе свойств. А затем мы изучили, как программно настроить Netty на мельчайших деталях.
Наконец, исходный код этой статьи доступен на Github .