从高层次的角度来讲,Netty解决了两个相应的关注领域: 技术的和体系结构的。 首先,它基于NIO的异步的和事件驱动的实现,保证了高负载下应用程性能的最大化和可伸缩性。其次,Netty也包含了一组设计模式,将应用程序逻辑从网络层解耦,简单了开发过程,同时也最大限度地提高了可以测试性、模块化以及代码的可重用性。
3.1 Channel EventLoop 和 ChannelFuture
3.1.1 Channel
Channel --Socket---连接----四元组
Channel 类型: 从服务器端和客户端来分 NioServerSocketChannel NioSocketChannel
从协议类型来说: OioServerSocketChannel NioSocketChannel NioDatagramChannel EmbeddedChannel
Channel 的主要方法: bind() connect() read() write() flush()
3.1.2 EventLoop
- NioEventLoopGroup 实际上就是个线程池,一个 EventLoopGroup 包含一个或者多个 EventLoop;
- 一个 EventLoop在它的生命周期内只和一个 Thread绑定;
- 所有有 EnventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
- 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
- 每一个 EventLoop 负责处理一个或多个 Channel;
从类结构可知,NioEventLoopGroup是一个Schedule类型的线程池,线程池中的线程用数组存放,EventLoopGroup(其实是MultithreadEventExecutorGroup) 内部维护一个类型为 EventExecutor children 数组, 其大小是 nThreads, 这样就构成了一个线程池,线程池大小通过在实例化 NioEventLoopGroup 时, 如果指定线程池大小, 则 nThreads 就是指定的值, 反之是处理器核心数 * 2;
3.1.3 ChannelFuture
Netty 中所有I/O操作都是异步的,因为一个操作可能不会立即返回,所以我们需要一种用于在之后的某个时间点确定其结果的方法,所以Netty提供了ChannelFuture接口
ChannelFuture 主要的方法 get() sync() cancel() addListener()
3.2 ChanelHandler 和 ChannelPipeline
3.1 ChannelHandler
从应用程序开发人员的角度来讲,Netty的主要组件是ChannelHandler,它充当了所有处理入站和出站数据的应用程序逻辑的容器。
3.2 ChannelPipeline
ChannelPipeline 是可以为 ChannelHandler 编排顺序