Netty简介

Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。


Netty nio 可以轻松将连接开到6W,每个连接大概损坏5k左右的系统内存


netty是基于事件,当某个事件触发时,交给一个链表的handler来处理。我们在设计的时候就可以利用这个特性来实现编码、解码跟游戏逻辑彻底解耦。在处理游戏逻辑的时候,我们根本不用理会传输协议




在并发量增大时候Netty表现得比Tomcat稳定,通过修改内核加快TIME_WAIT的回收时间,从而提高系统的并发量。
在大文件的情况下Netty没有任何优势,而且线程池相关的没有Tomcat优秀,Tomcat的内存回收更优秀些。
结论:Netty适合搭建轻量级的应用,特别适合传输内容少,但是并发量非常高的应用。


修改TIME_WAIT回收时间


vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30


/sbin/sysctl -p
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; 
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间




protobuf在netty里面的应用举例: http://blog.youkuaiyun.com/goldenfish1919/article/details/6719276

netty源代码解读-架构流程: http://www.iamcoding.com/?p=262


Netty实现原理浅析:  http://www.kafka0102.com/2010/06/167.html

### Netty 简介 Netty 是一个基于 Java NIO 的高性能网络应用框架,用于快速开发可维护的网络服务器和客户端[^1]。它屏蔽了底层复杂的 I/O 操作细节,提供了易于使用的 API 和丰富的功能组件。 --- ### Netty 的核心模块 #### 1. **线程模型** Netty 中的核心线程模型由 `EventLoop` 和 `EventLoopGroup` 组成。 - `EventLoop`: 负责处理事件循环的任务调度,包括读写操作、定时任务等。 - `EventLoopGroup`: 表示一组 `EventLoop` 实例,通常分为两个组:一个是负责接受连接的 Boss Group,另一个是负责处理业务逻辑的 Worker Group[^1]。 #### 2. **启动引导类 Bootstrap** Netty 提供了两种主要的启动引导类: - `ServerBootstrap`: 用于服务端程序的初始化和绑定监听地址。 - `Bootstrap`: 用于客户端程序的初始化和建立远程连接。 以下是简单的 ServerBootstrap 配置代码示例: ```java // 创建 EventLoopGroup EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); // 初始化 ServerBootstrap bootstrap.group(bossGroup, workerGroup) // 设置线程池 .channel(NioServerSocketChannel.class) // 指定 Channel 类型 .childHandler(new MyChannelInitializer()); // 添加自定义处理器 // 绑定端口并同步等待完成 ChannelFuture future = bootstrap.bind(8080).sync(); System.out.println("Server started on port 8080"); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } ``` #### 3. **通道 (Channel)** `Channel` 是 Netty 中的一个重要抽象接口,表示与目标主机之间的连接。通过 `Channel` 可以执行异步的 I/O 操作,例如读取数据或发送消息。 #### 4. **缓冲区 ByteBuf** `ByteBuf` 是 Netty 对字节缓存的一种封装实现,相比传统的 `ByteBuffer` 更加灵活高效。它可以动态扩展容量,并支持多种访问方式[^1]。 --- ### 编码与解码 在实际通信过程中,可能会遇到 TCP 协议中的粘包/拆包问题。其主要原因在于 TCP 是面向流的协议,在传输大数据时无法区分每条独立的消息边界[^1]。 #### 解决方案 可以通过以下几种方式进行解决: - 增加固定长度的消息头来标记消息体大小; - 使用特殊分隔符作为帧结束标志; - 利用 Netty 自带的编解码器(如 `LengthFieldBasedFrameDecoder` 或 `DelimiterBasedFrameDecoder`)自动解析消息边界[^1]。 --- ### 设计模式的应用 Netty 广泛采用了多种设计模式以提升系统的灵活性和可扩展性,其中包括但不限于: - 工厂模式 (`NioServerSocketChannelFactory`) - 责任链模式 (`ChannelPipeline`, `ChannelHandlerContext`) - 观察者模式 (`ChannelInboundHandlerAdapter`) 这些模式共同协作使得开发者能够轻松定制化自己的业务逻辑而无需关心底层复杂机制[^1]。 --- ### 构建万级并发连接注意事项 当面对高并发场景时需要注意以下几个方面: - 合理配置操作系统参数(如文件描述符数量限制 ulimit) - 减少不必要的内存分配动作防止 GC 过于频繁影响性能 - 尽可能重用对象实例减少创建销毁开销 - 关闭无用连接及时释放资源避免浪费 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值