第三章 Netty 组件和设计
从高层视角,Netty address 两个等价的关注域:技术和架构
* 首先,它是构建于 Java NIO 上的异步、事件驱动的实现,保证了在高负载下最大的应用性能和伸缩性;
* Netty 体现了一组设计模式,从网络层解耦应用逻辑,简化开发,最大化可测试性、模块化、代码重用。
当我们更细微地学习 Netty 的独立组件时,我们将聚焦于它们是如何协作来支持这些架构最佳实践。通过遵循同样的原则,我们将获得 Netty 能提供的所有好处。
3.1 Channel, EventLoop, ChannelFuture
Channel, EventLoop, ChannelFuture 放到一起,可以代表了 Netty 的网络层抽象:
- Channel: Sockets
- EventLoop: 控制流,多线程,并发
- ChannelFuture: 异步通知
3.1.1 Channel 接口
基本的 I/O 操作(bind(), connect(), read(), write()) 依赖于底层网络传输的提供的原子操作。在基于 Java 的网络里,基础结构是 Socket
类。Netty 的 Channel 接口提供的 API 极大简化了直接操作 Sockets 的复杂工作。
3.1.2 EventLoop 接口
EventLoop 定义了 Netty 处理一个连接生命周期里发生的事件的核心抽象。Channel、EventLoop、EventLoopGroup 之间的关系如下:
- 一个 EventLoopGroup 包含一个或多个 EventLoop;
- 一个 EventLoop 在它的生命周期里是绑定到单一线程的;
- 一个 EventLoop 处理的所有 I/O 事件都是在它的专用线程上进行的;
- 一个 Channel 在它的生命周期里是注册到到单一的 EventLoop;
- 单一的 EventLoop 可能被赋给一个或多个 Channel。
注意,在这种设计里,给定 Channel 的 I/O 事件都由同一个线程来执行,事实上消除了对同步的需要。