Я хотел бы настроить Netty в моем проекте Spring Boot Webflux. В моем POM я добавил зависимости Spring Boot Webflux и Spring Boot Actuator. Затем я перезаписал метод customize () WebServerFactoryCustomizer, как описано в Документация Spring.
@Component
public class NettyConfiguration implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {
@Override
public void customize(NettyReactiveWebServerFactory factory) {
factory.addServerCustomizers(new NettyCustomizer());
}
}
Затем я реализовал загрузку Netty в моем NettyCustomizer:
public class NettyCustomizer implements NettyServerCustomizer {
private final EventLoopGroup bossGroup = new NioEventLoopGroup(22);
private final EventLoopGroup workerGroup = new NioEventLoopGroup();
@Override
public HttpServer apply(HttpServer httpServer) {
return httpServer.tcpConfiguration(tcpServer ->
tcpServer.bootstrap(serverBootstrap ->
serverBootstrap
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.DEBUG))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(final SocketChannel socketChannel) {
socketChannel.pipeline().addLast(new BufferingInboundHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true))
.port(8899)
);
}
}
Теперь, если я запускаю приложение Spring Boot, я получаю сообщение об ошибке «Не удается запустить Netty».
org.springframework.boot.web.server.WebServerException: Unable to start Netty
Caused by: java.lang.IllegalStateException: group set already
Таким образом, кажется, что нет способа переопределить загрузку Netty при использовании Webflux. К сожалению, изменение метода addServerCustomizers () на setServerCustomizers () в методе customize () приводит к тем же исключениям. Кто-нибудь знает, как настроить Netty вместе с Spring Boot?




Как упоминалось в справочная документация по Spring Boot, вы можете настроить ресурсы, на которых работают сервер и клиент Netty, указав свой собственный ReactorResourceFactory, например:
@Bean
public ReactorResourceFactory resourceFactory() {
ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
reactorResourceFactory.setLoopResourcesSupplier(() -> LoopResources.create("custom-prefix"));
return reactorResourceFactory;
}
Обратите внимание, что для этого мы используем Абстракция LoopResources, предоставленная Reactor Netty. Это позволяет распределять ресурсы между клиентом и сервером для повышения эффективности.
Не стесняйтесь открывать запросы на улучшения в Reactor Netty или Spring Boot, если вы не можете достичь того, чего хотите.
привет просто интересно, имеет ли значение имя метода "resourceFactory ()"? Могу ли я использовать другое имя, чтобы добиться того же?
Да, вы можете использовать другое имя
Если вы хотите заменить его своим собственным сервером, вам необходимо удалить некоторые зависимости netty из pom.xml. Однако, если вы хотите настроить конвейер или что-то подобное, я думаю, вы можете управлять конфигурацией веб-сервера при весенней загрузке следующим образом:
@Override
public void customize(WebServerFactory factory) {
NettyReactiveWebServerFactory nettyReactiveWebServerFactory = (NettyReactiveWebServerFactory) factory;
nettyReactiveWebServerFactory.addServerCustomizers(builder -> builder
.tcpConfiguration(tcpServer -> tcpServer.bootstrap(i -> i.handler(new ObjectEchoServerHandler("1")))));
}
Хм ... это не то, что я хочу делать. Итак, нет возможности настроить свойства начальной загрузки Netty с помощью Spring Boot Webflux?