在 SpringBoot 中使用 Netty 的思路,偷梁换柱之计

2023-04-15 21:53:07 +08:00
 wellR

项目中准备用 netty 做些定制化的功能,自然而然用上了 SpringBoot 这套,招不在老管用就好。思路就是不启动 tomcat ,在主线程启动 netty 。

	public static void main(String[] args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("start app...");
        ConfigurableApplicationContext context = SpringApplication.run(NettyServer.class, args);
        //get bean
        SecondHandler handler = context.getBean(SecondHandler.class);
        int port = context.getEnvironment().getProperty("server.port", Integer.class, 9000);
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup(16);
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .localAddress(new InetSocketAddress(port))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) {
                            ch.pipeline()
                                    .addLast("codec", new HttpServerCodec())
                                    .addLast("compressor", new HttpContentCompressor())
                                    .addLast("aggregator", new HttpObjectAggregator(65536))
                                    .addLast("handler", handler);
                        }
                    })
                    .childOption(ChannelOption.SO_KEEPALIVE, true);
            ChannelFuture f = b.bind().sync();
            stopWatch.stop();
            log.info("Netty Server started ,Listening on {}, info={}", port, stopWatch.prettyPrint());
            f.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

项目链接

4027 次点击
所在节点    Java
30 条回复
cookii
2023-04-17 00:55:18 +08:00
直接用 webflux 。除非是非 http 协议
crazyweeds
2023-04-17 09:24:50 +08:00
太复杂,直接:
CountDownLatch countdown = new CountDownLatch(1);
countdown.await();
然后 netty 该怎么写就怎么写。
justRua
2023-04-17 09:44:25 +08:00
有现成的 grpc-spring-boot-starter ,协议是 grpc ,实现是 netty
byte10
2023-04-17 10:57:33 +08:00
我用的是 springboot + vert.x ,我也推荐你使用 vert.x ,当然,最好直接用虚拟线程 + vert.x ,不过我好像测试出现 bug 。你尝试一下
wellR
2023-04-17 11:03:56 +08:00
@byte10 java 中现在能用虚拟线程了吗
byte10
2023-04-17 11:11:58 +08:00
@wellR java 19 就有预览版,现在 java20 版本也出来了。预计明年应该可以出生产 版吧。前期我推荐使用 线程池 来解决代码同步编程的问题(异步转同步 ),后续直接使用虚拟线程代替线程池,完美接管。可以先了解下 虚拟线程的目前存在的问题吧
wellR
2023-04-17 11:45:31 +08:00
@byte10 生产上还是 java8 ,不敢上太高版本的
wellR
2023-04-17 11:48:53 +08:00
@byte10 我的解决思路是,缓存 ChannelHandlerContext ,等待回调或者 mq 消息,再取出对应的 ChannelHandlerContext 执行 writeAndFlush 响应客户端
cslive
2023-04-18 09:04:17 +08:00
将 tomcat 依赖改成 netty 也可以啊,又不非得用 tomcat 启动
tramm
2023-05-06 08:48:46 +08:00
啊, 我一直以为不加 web 依赖, 就没有 Tomcat 了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/932810

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX