
项目中准备用 netty 做些定制化的功能,自然而然用上了 SpringBoot 这套,招不在老管用就好。思路就是不启动 tomcat ,在主线程启动 netty 。
public static void main(String[] args) { StopWatch stopWatch = new StopWatch(); stopWatchstart("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(); } } 1 awsl2333 2023-04-15 21:56:52 +08:00 via iPhone 不是可以选 reactive 嘛,默认就是 netty 了吧 |
3 chendy 2023-04-15 22:06:08 +08:00 不启动 tomcat 可以直接不要 tomcat ,留个啥东西不让 main 退出就行… |
4 wellR OP @chendy 是这样的,一直以来用 SpringBoot 搞 web 开发都形成思维定势了,这次是打开思路了,SpringBoot 还可以来做 webMvc 开发之外的东西 |
5 wellR OP SpringBoot 用了这么久了,才知道 SpringApplication.run 返回了 ApplicationContext ,哈 |
6 lllllliiii 2023-04-15 23:32:46 +08:00 以前我也写过一个类似的哈哈 https://github.com/fzdwx/sky |
7 lsk569937453 2023-04-15 23:35:57 +08:00 不要加 springboot-web 的 starter,直接用 springboot 的 CommandLineRunner 里运行 netty 即可啊 |
8 silentsky 2023-04-16 00:29:13 +08:00 via Android 这么巧 今天我也在整这个 |
9 zhiyu1998 2023-04-16 01:26:52 +08:00 学到了,感谢分享 |
10 dreamlike 2023-04-16 03:14:20 +08:00 via Android 你这样写其实没有把 server 的生命周期托管给 spring 看起来, |
12 niuroumian 2023-04-16 08:28:14 +08:00 没必要折腾,https://armeria.dev/ |
13 cnzjl 2023-04-16 09:06:45 +08:00 用 Smartlifecycle ,不添加 web 依赖 |
14 dreamlike 2023-04-16 11:58:31 +08:00 via Android 等下 我看了你这个代码 其实就是搞了一个基于 netty 的 http 服务器,我建议直接换 vertx or quarkus 吧 |
15 LeegoYih 2023-04-16 12:04:29 +08:00 这样写不就好了? SpringApplication application = new SpringApplication(NettyServer.class); application.setApplicationContextFactory(ApplicationContextFactory.ofContextClass(AnnotationConfigApplicationContext.class)); application.run(args); |
16 LeegoYih 2023-04-16 12:16:29 +08:00 new SpringApplicationBuilder(ChatServerApplication.class) .web(WebApplicationType.NONE) .run(args); |
17 WispZhan 2023-04-16 16:37:20 +08:00 via Android 不理解,为什么不直接用 vert.x 之类的? |
18 wellR OP @dreamlike 是的,要做一个异步实时响应的服务。webflux 不好上手,请问 vertx 的使用体验如何,与 webflux 比怎么样 |
19 wellR OP 大体流程: 1 、客户端发送请求,参数中有业务数据、超时时间与回调接口; 2 、服务 A 收到请求,初步处理 task 再发 mq 3 、服务 B 消费 mq 进行一系列比较耗时的操作之后将处理结果发到 mq 广播消息 4 、服务 A 消费 mq 响应客户端 5 、若上述处理流程中超时了,则立即返回客户端,后台 task 跑完了会调客户端的回调 |
20 dreamlike 2023-04-16 19:15:44 +08:00 via Android @wellR 我看这个需求很简单 也没有什么复杂的逻辑 直接 vertx 上吧 又轻又快 用好 eventbus ,开发速度应该是爆杀 webflux 的,开 n 个 vertical 跑满核心就行了 |
21 cookii 2023-04-17 00:55:18 +08:00 直接用 webflux 。除非是非 http 协议 |
22 crazyweeds 2023-04-17 09:24:50 +08:00 太复杂,直接: CountDownLatch countdown = new CountDownLatch(1); countdown.await(); 然后 netty 该怎么写就怎么写。 |
23 justRua 2023-04-17 09:44:25 +08:00 有现成的 grpc-spring-boot-starter ,协议是 grpc ,实现是 netty |
24 byte10 2023-04-17 10:57:33 +08:00 我用的是 springboot + vert.x ,我也推荐你使用 vert.x ,当然,最好直接用虚拟线程 + vert.x ,不过我好像测试出现 bug 。你尝试一下 |
26 byte10 2023-04-17 11:11:58 +08:00 @wellR java 19 就有预览版,现在 java20 版本也出来了。预计明年应该可以出生产 版吧。前期我推荐使用 线程池 来解决代码同步编程的问题(异步转同步 ),后续直接使用虚拟线程代替线程池,完美接管。可以先了解下 虚拟线程的目前存在的问题吧 |
28 wellR OP @byte10 我的解决思路是,缓存 ChannelHandlerContext ,等待回调或者 mq 消息,再取出对应的 ChannelHandlerContext 执行 writeAndFlush 响应客户端 |
29 cslive 2023-04-18 09:04:17 +08:00 将 tomcat 依赖改成 netty 也可以啊,又不非得用 tomcat 启动 |
30 tramm 2023-05-06 08:48:46 +08:00 啊, 我一直以为不加 web 依赖, 就没有 Tomcat 了... |