学习笔记--关于netty
笔记于---书籍《netty in action 》第五版
书籍中会使用到的知识点:
----1,关于nio 的知识;
----2,关于多线程的知识及ExecutorService 方面的知识;
----3,关于网络编程的知识。
----4,关于网络协议方面的知识。
----5,关于加密TLS、SSL方面的知识。
目前使用的4中IO模型,同步阻塞IO、同步非阻塞IO、多路复用IO模型、异步IO(信号驱动IO)
需要理解kernel 和用户态空间。这个是操作系统方面的知识。我们的Application 在进行IO操作的时候,会首先向操作系统请求该IO操作。如果被允许,用户态和kernel中的数据将会切换。这就是为什么多线程会消耗更多的系统资源的原因。
在这几种模型中设计的理念是不一样的。
@同步阻塞IO:对于同步阻塞IO 。用户态这边会发出一个请求比如socket连接,向连接的socket发出read请求的数据,这时,kernel会 调用网络物理设备的接口,当有连接请求建立好后,会接受完数据,此时用户态这边依然阻塞,等kernel将数据切换给用户态后,用户态这边阻塞才结束,开始处理数据。
@同步非阻塞IO 与上面不同的是,当请求发给kernel时候,会立即返回,然后不停轮询kernel是否数据准备好,如果准备好,此时将会阻塞,不会立即返回。
@多路复用IO模型:主要使用系统的select 或epoll 调用。用户态这边会将他所需要的option注册给系统的select或epoll,此过程进程会阻塞,当有连接建立后。等kernel准备好数据。切换给用户态这边,依然会阻塞。
@异步IO: 用户态这边将建立一个信号处理程序,用户态这边没阻塞,内核这边数据准备好会给用户态一个信号来read处理数据。此时从kernel 将数据切换给用户态,用户态都会阻塞。
在netty in action 书中第一章将NIO1和NIO2 列出来,其实就是对多路复用IO和异步IO的比较。
在java APi 中关于package nio 的知识,可以详细看document。其中主要涉及到几个重要的概念concept
Channel
ByteBuffer
Selector
理解多路复用IO模型对于他的编程使用无疑是有巨大帮助的。
比如书中的代码。
ServerSocketChannle server = ServerSocketChannel.open(); server.bind(new InetAddress(port)); server.configureBlocking(false); Selector selector = Selector.open(); server.register(selector,SelectorKey.OP_ACCEPT); whlie(ture){ try{ selector.select(); }catch(IOException ex){ ex.printStackTrace(); break; } Set key =(SelectionKey) selector.selectKeys(); Iterator iterator = key.iterator(); while(iterator.hasNext()){ SelectionKey selectionKey = (SelectionKey)iterator.next(); iterator.remove(); try{ //对option进行操作的,详细查看书中代码 }catch(IOException ex){ } } }
为什么要贴出这段代码呢,首先这个是对于io模型的理解,其次这也是对IO模型的实践。另外这个也是对于netty 中的一个小小的入门。当然其中并没有涉及到netty API中的内容。那么netty 本身又是哪样的呢?它是如何实现这样的呢?
netty 中几个重要的concept
Bootstrap ServerBootstrap
ChannelHandler PipeChannelHandler ChannelInitializer
EventLoop EventLoopGroup
ChannelFuture
---to be continue