Как настроить Netty с помощью Spring Boot 2.1 Webflux? - PullRequest
0 голосов
/ 27 декабря 2018

Я бы хотел настроить 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?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Если вы хотите заменить его собственным сервером, вам нужно удалить некоторые зависимости 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")))));
}
0 голосов
/ 27 декабря 2018

Как упоминалось в справочной документации 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, если вы не можете достичь того, чего хотите.

...