netty是一个非阻塞,事件驱动的网络框架。netty实际上是使用多线程处理io事件,对于熟悉多线程编程的人来说,可能会想到netty需要进行代码同步。但是这样的方式不好,因为同步会影响程序的性能,netty的设计者保证了程序处理事件不会有同步。
netty的EventLoopGroup包含一个或者多个EventLoop,而EventLoop就是一个Channel执行实际工作的线程。EventLoop总是绑定一个单一的线程,在其生命周期内不会改变。
当注册一个channel后,netty将这个channel绑定到一个EventLoop,在channel的生命周期内总是绑定到一个EventLoop。在netty IO操作中,程序不需要同步,因为一个指定通道的所有IO始终由同一个线程来执行。
但并不是说明一个EventLoop只能绑定一个channel.一个EventLoop可以执行多个channel.
Bootstrap用来在netty中配置程序,这个辅助类太重要了,把程序员从繁重的NIO操作中解放出来,提供了一个统一的模板式的操作。
当你需要连接服务端或服务端绑定指定端口时需要使用Bootstrap.客户端需要Bootstrap,服务端需要ServerBootstrap.
Bootstrap用来连接远程主机,有1个EventLoopGroup
ServerBootstrap用来绑定本地端口,有2个EventLoopGroup
一个ServerBootstrap可以认为有2个channels组,第一组包含一个单例ServerChannel,代表持有一个绑定了本地端口的socket(作用是接受客户端连接请求,然后注册到第二组EventLoopGroup上),第二组包含所有的channel,代表服务器已接受了的连接。我们知道,对于NIO来说,是要轮询的,轮询之前要先注册到多路复用器上,这个活就是由第一个EventLoopGroup干的。请看下图
==========================================
Handlers自身依赖于ChannelPipeline来决定它们执行的顺序。在很多地方,netty的ChannelHandler是你的应用程序中处理最多的。你的应用程序中至少有一个ChannelHandler的参与,换句话说,ChannelHandler对很多事情是关键的。我们可以理解为ChannelHandler是一段执行业务逻辑处理的代码,它们来来往往的通过ChannelPipeline。