1

我想在我的 Spring Boot Webflux 项目中自定义 Netty。在我的 POM 中,我添加了 Spring Boot Webflux 和 Spring Boot Actuator 依赖项。接下来我重写了Spring 文档中描述的 WebServerFactoryCustomizer 的 customize() 方法。

@Component
public class NettyConfiguration implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
        factory.addServerCustomizers(new NettyCustomizer());
    }
}

然后我在我的 NettyCustomizer 中实现了 Netty 引导:

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

因此,如果使用 Webflux,似乎没有办法覆盖 Netty 引导。不幸的是,将 custom() 方法中的 addServerCustomizers() 方法更改为 setServerCustomizers() 会导致相同的异常。有人知道如何将 Netty 与 Spring Boot 一起定制吗?

4

2 回答 2

0

如果你想用自己的服务器替换它,你需要从 pom.xml 中删除一些 netty 的依赖。但是,如果您想配置管道或类似的东西,我想您可以在 Spring Boot 中操作 Web 服务器配置,如下所示;

@Override
public void customize(WebServerFactory factory) {
    NettyReactiveWebServerFactory nettyReactiveWebServerFactory = (NettyReactiveWebServerFactory) factory;
    nettyReactiveWebServerFactory.addServerCustomizers(builder -> builder
            .tcpConfiguration(tcpServer -> tcpServer.bootstrap(i -> i.handler(new ObjectEchoServerHandler("1")))));
}
于 2019-02-18T00:30:10.743 回答
0

Spring Boot 参考文档中所述,您可以通过定义自己的资源来自定义 Netty 服务器和客户端运行的资源ReactorResourceFactory,如下所示:

@Bean
public ReactorResourceFactory resourceFactory() {
    ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
    reactorResourceFactory.setLoopResourcesSupplier(() -> LoopResources.create("custom-prefix"));
    return reactorResourceFactory;
} 

请注意,我们在这里使用LoopResourcesReactor Netty 提供的抽象。这允许在客户端和服务器之间共享资源以提高效率。

如果您无法实现您想要的,请随意在 Reactor Netty 或 Spring Boot 中打开增强请求。

于 2018-12-27T20:39:34.707 回答