基于Java NIO 的异步的和事件驱动的实现,保证了高负载下应用程序性能的最大化和可伸缩性。其次,Netty 也包含了一组设计模式,将应用程序逻辑从网络层解耦,简化了开发过程,同时也最大限度地提高了可测试性、模块化以及代码的可重用性。
1. Channel、EventLoop 和ChannelFuture
- Channel—Socket;
Channel 也是拥有许多预定义的、专门化实现的广泛类层次结构的根,下面是一个简短的部分清单:
1.EmbeddedChannel;
2.LocalServerChannel;
3.NioDatagramChannel;
4.NioSctpChannel;
5.NioSocketChannel。
- EventLoop—控制流、多线程处理、并发;
Channel、EventLoop 和EventLoopGroup
- 一个EventLoopGroup 包含一个或者多个EventLoop;
- 一个EventLoop 在它的生命周期内只和一个Thread 绑定;
- 所有由EventLoop 处理的I/O 事件都将在它专有的Thread 上被处理;
- 一个Channel 在它的生命周期内只注册于一个EventLoop;
- 一个EventLoop 可能会被分配给一个或多个Channel。
注意,在这种设计中,一个给定Channel 的I/O 操作都是由相同的Thread 执行的,实际上消除了对于同步的需要。
- ChannelFuture—异步通知。
2. ChannelHandler 和ChannelPipeline
ChannelHandler 充当了所有处理入站和出站数据的应用程序逻辑的容器。
ChannelPipeline 提供了ChannelHandler 链的容器,并定义了用于在该链上传播入站和出站事件流的API。当Channel 被创建时,它会被自动地分配到它专属的ChannelPipeline。
ChannelHandler 安装到ChannelPipeline 中的过程如下所示:
1.一个ChannelInitializer的实现被注册到了ServerBootstrap中;
2.当ChannelInitializer.initChannel()方法被调用时,ChannelInitializer将在ChannelPipeline 中安装一组自定义的ChannelHandler;
3.ChannelInitializer 将它自己从ChannelPipeline 中移除。
包含入站和出站ChannelHandler 的ChannelPipeline
3. 引导
Netty 的引导类为应用程序的网络层配置提供了容器,这涉及将一个进程绑定到某个指定的端口,或者将一个进程连接到另一个运行在某个指定主机的指定端口上的进程。
- 客户端:Bootstrap 连接到远程主机和端口 EventLoopGroup 的数目为1
服务器:ServerBootstrap 绑定到一个本地端口 EventLoopGroup 的数目为2
具有两个EventLoopGroup 的服务器
网友评论