Netty 简介 - 高性能原理 + 关键组件模型

Netty > java.nio + java.net

Netty 是一个 NIO 框架。

它的设计强调了“分离关注点”(Separation Of Concerns)。

它通过事件机制,将业务逻辑与无关的技术逻辑隔离,通过抽象层填补 基础平台 和 业务开发 之间的鸿沟。

Netty 极大地简化了网络编程(如,TCP/UDP socket 服务器)。可以利用它更快速容易地开发网络应用。

Netty 如何实现高性能

Netty 没有 Java 核心类库那么强烈的通用性、跨平台等负担。

它针对性能等特定目标、及Linux等特定环境,采用了极致的优化手段。

  • 通过更优雅的 Reactor 模式实现灵活的线程模型,

    利用 EventLoop 等机制,高效地管理大量的 Channel。

    扫描二维码关注公众号,回复: 8587236 查看本文章
  • 充分利用 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。

Java代码

 

  1. public final class ChannelOutboundBuffer {  

  2.   private static final AtomicLongFieldUpdater TOTAL_PENDING_SIZE_UPDATER =  

  3.       AtomicLongFieldUpdater.newUpdater(ChannelOutboundBuffer.class, "totalPendingSize");  

  4.   

  5.   private volatile long totalPendingSize;  

  6.   ...  

  7. }  

借鉴意义

虽然 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 链条的容器。

发布了219 篇原创文章 · 获赞 3 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/hchaoh/article/details/103906824