netty-transpot 分析

https://juejin.im/post/5bdaa2afe51d45685f443757—Netty NioEventLoop run 过程源码分析

重点:

https://www.cnblogs.com/xiangnan6122/category/1374017.html

https://segmentfault.com/a/1190000006824196——基于 jdk nio 服务器代码 跟netty的架构逻辑 类似

 

自己的一些总结:

1、Executor线程组 怎么用?

每一个Handler都可以在一个单独的线程池中运行(在 加入pipeline.add handler的时候配置)。为了不阻塞WORK线程组的的IO线程 获取 Read Write等事件。建议应用层的hander放到单独的线程组。

2、handler之间怎么传递数据数据?

handler通过 fireChannelRead(Object msg)向handler链表中之后的handler传递数据。每个handler处理后的数据放在 msg 参数中向后传递

3、NioEventLoop线程 什么时候启动?

Boss线程和Work线程都是在 channle注册到线程的 selector的时候启动

4、Executor线程池中线程如何启动、运行?

Executor线程,在第一次执行handler任务的时候启动(SingleThreadEventExecutor.execute(Runable task) 方法中启动,此方法会判断线程是否启动,没启动就启动线程)

在 DefaultEventExecutor.run()中运行,DefaultEventExecutor和NioEventLoop都继承SingleThreadEventExecutor。

DefaultEventExecutor和NioEventLoop 都用 SingleThreadEventExecutor.takeTask() 获取任务;该方法会把scheduleTaskQueue(PriorityQueue)中的Task放入 taskqueue(LinkedBlockingQueue) 中 一起执行。

线程启动之后会一直运行,之后有任务就是往线程的 taskqueue 中 添加任务

4、jstac抓线程栈,看到的线程是什么样子?

所有 NioEventLoop(IO读写)线程 启动后 会一直是Runable状态,Selector.select(long time)方法,会阻塞线程,但是线程状态还是 Runable

所有ExecutorGroup线程,会从taskqueue中获取任务,能取到任务的时候 是Runable状态,不能取到任务的时候是Waiting(park)状态。因为 taskqueue 用的是LinkedBlockingQueue,用ReetrantLock Condition await方法 等待 队列元素

 

### Netty-all 和 Netty-buffer 的差异及其应用场景 #### 1. Netty-all 组件概述 `netty-all` 是一个聚合模块,包含了整个 Netty 框架所需的所有功能组件。该模块旨在提供一种简便的方式引入完整的 Netty 功能集到项目中,使得开发者无需单独管理多个依赖项。<groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>x.x.x.Final</version> </dependency> ``` #### 2. Netty-buffer 特定作用域分析 相比之下,`netty-buffer` 则专注于处理字节缓冲区的操作。它提供了高效的内存管理和数据传输机制,支持堆外内存(Direct Memory),这有助于减少垃圾回收压力并提高性能表现,在高并发场景下尤为重要。此外还实现了多种优化策略来增强读写效率,比如复合缓冲区 CompositeByteBuf 能够有效降低复制成本[^1]。 ```java // 创建一个新的 ByteBuf 实例 ByteBuf buffer = Unpooled.buffer(1024); try { // 向 Buffer 中写入一些数据 String message = "Hello, world!"; byte[] bytes = message.getBytes(CharsetUtil.UTF_8); buffer.writeBytes(bytes); // 将 Buffer 数据转换成字符串形式输出 System.out.println(buffer.toString(CharsetUtil.UTF_8)); } finally { // 使用完毕后释放资源 buffer.release(); } ``` #### 3. 应用场景对比 当应用程序只需要特定部分的功能时,可以选择只导入 `netty-buffer` 或其他单个子模块以减小程序体积;而如果需要全面运用 Netty 提供的各种网络通信能力,则推荐采用 `netty-all` 来简化构建配置过程。另外值得注意的是,虽然两者都可以用于开发基于异步I/O模式的服务端程序,但在实际部署过程中应当依据具体的业务需求和技术栈选型做出合理决策[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值