Netty 简介 - 高性能原理 + 关键组件模型
Netty > java.nio + java.net
Netty 是一个 NIO 框架。
它的设计强调了“分离关注点”(Separation Of Concerns)。
它通过事件机制,将业务逻辑与无关的技术逻辑隔离,通过抽象层填补 基础平台 和 业务开发 之间的鸿沟。
Netty 极大地简化了网络编程(如,TCP/UDP socket 服务器)。可以利用它更快速容易地开发网络应用。
Netty 如何实现高性能
Netty 没有 Java 核心类库那么强烈的通用性、跨平台等负担。
它针对性能等特定目标、及Linux等特定环境,采用了极致的优化手段。
- 通过更优雅的 Reactor 模式实现灵活的线程模型,
利用 EventLoop 等机制,高效地管理大量的 Channel。 -
充分利用 Java 的 Zero-Copy 机制等多种技巧,从多种角度降低内存分配和回收的开销。如:
池化的 Direct Buffer 可提高IO性能、减少对象的创建与销毁。
利用反射直接操纵 SelectionKey - 使用更多本地代码。如,直接利用 JNI 调用 Open SSL,性能比 Java 内建的 SSL引擎更好。
- 通信协议、序列化 等其它方面的优化。
《Writing Highly Performant Network Frameworks on the JVM - A Love-Hate Relationship》
如,Netty 的 ChannelOutboundBuffer 中利用 AtomicLongFieldUpdater 而不是直接使用 AtomicLong。
public final class ChannelOutboundBuffer { private static final AtomicLongFieldUpdater TOTAL_PENDING_SIZE_UPDATER = AtomicLongFieldUpdater.newUpdater(ChannelOutboundBuffer.class, "totalPendingSize"); private volatile long totalPendingSize; ... }
借鉴意义
虽然 Netty 的很多优化技巧对于追求极致性能有一定借鉴意义,但一般业务开发中要谨慎采用。
如,直接调用本地方法会对加大内存管理的难度,不同平台上部署应用时兼容性风险较大。
不同版本的JDK中,某些 Unsafe 方法的命名空间就不同。
使用 Netty 时的关键组件
基于官方代码示例 EchoServer
-
ServerBootstrap:服务端程序入口。Netty通过这种机制简化服务端的生命周期管理。
创建 Channel、注册端口、绑定 Handler 等。
客户端对应的是 Bootstrap -
Channel:Netty 中的各类 Channel 针对应用开发,提供了相对易用的抽象方法。
Channel 和 Selector 等概念依然是 Netty 的基础组件。 - EventLoop:这是 Netty 处理事件的核心机制。它负责 注册感兴趣的事件、调度Handler 等。
-
ChannelFuture:这是 Netty 实现异步IO 的基础。它保证了同一个 Channel 操作的调用顺序。
Netty 扩展了 Java 标准 Future,提供了针对特定场景的 Future。 - ChannelHandler:这是放置业务逻辑的地方。
- ChannelPipeline:这是 ChannelHandler 链条的容器。
上一篇: Oracle 11g RAC的常用管理
下一篇: 网站QQ客服图标点不开的原因分析探讨