NIO

在讲解Netty之前,我们先复习一下基础,什么是NIO?网上很多文章,枯燥的讲解了什么是NIO,大家也看的一头雾水,下面我简单而不简洁的给大家解释一下NIO。

首先我们要明白一点,什么时候用多线程?多线程不是适用于所有场景,一般适用于cpu密集型任务。然后比如redis,netty,nginx这些框架的应用场景明显都是IO密集型任务。所以多线程不是适用。举个例子,看看IO密集型场景的瓶颈在那里?

下面是IO传统编码模型片段:

请求发送端,多线程发送请求,端口8088

new Thread(()->{
Socket socket=new Socket(8088);
socket.getOutputStream.write("hello world").
socket.getOutputStream.flush()
socket.close();


})

请求接收端,多线程接收请求,如果不是多线程接收,多请求显然处理不过来,如果多线程处理接收的数据,那么请求量小还是可以。如果并发成千上万个请求,显然线程资源会枯竭,而且线程切换等因素导致系统不可行。

Socket socket=new Socket(8088);
while(true){
    //阻塞获取连接,然后读取数据,多线程处理
    Socket socket=socket.accept();
    new Thread(() -> {
        try {
              byte[] data = new byte[1024];
              InputStream inputStream = socket.getInputStream();
               while (true) {
                     int len;
                     // (3) 按字节流方式读取数据
                     while ((len = inputStream.read(data)) != -1) {
                          System.out.println(new String(data, 0, len));
                                }
                            }
                     } catch (IOException e) {
                  }
             }).start();

}

netty和java的关系 netty和nio关系_多线程处理


怎么处理呢?我们试想一下,为什么要多线程处理,是因为怕阻塞,无法accept新的连接请求。并发量大的情况下,我们无法每个请求启动一个线程处理,我们是不是可以启动一个线程,无论多少个请求,只有一个线程,轮询获取可用的socket,包括可读的,可写的。

  • 大部分并发连接同时只有少数是活跃的
  • 一个线程轮询出当前活跃的socket,不需要轮询,大大降低时间复杂度
  • 并发数只是受系统FD数目限制
  • Java 的NIO实现中利用的是linux底层的epoll机制

Netty

什么是netty?看看官方定义:

Netty is an asynchronous event-driven network application framework  for rapid development of maintainable high performance protocol servers & clients

Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.

总结一下要点:

  • NIO异步编程模式,事件驱动的高性能客户端/服务端网络开发框架
  • 简化和流化处理网络编程,支持TCP,UDP等多种协议

我们看一个demo,代码来自下面的连接:


总结几个应用点:

  • netty是个NIO框架,适用于高并发场景,支持并发连接数受系统文件句柄数限制
  • 支持多种协议,比如这个例子就是用的telnet协议
  • Netty框架对jdk NIO进行了封装和优化,并发性更好,更容易应用