通信框架之Netty第一话 - NIO的超神发展之路

4,413 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.什么是IO

IO是计算机中的信息交换机制,分表对应Input:输出(读)Output:输入(写) IO有两大类,本地IO:

  • 字节流:InputStream/OutputStream
  • 缓冲流:Reader/Writer

网络IO:

  • interAddress ip:port tcp协议,Udp协议
  • ServerSocket/Socket

Java中的File OutputStream/InputStream操作

public static void main(String[] args) throws Exception {
    File file = new File("/test/123.txt");
    //写入流 写入数据
    FileOutputStream outputStream = new FileOutputStream(file);
    outputStream.write("123456".getBytes());
    outputStream.write("\n78901".getBytes());
    outputStream.write("\nasdfdf".getBytes());
    outputStream.flush();
    outputStream.close();

    StringBuilder builder = new StringBuilder();
    int len;
    byte[] bytes = new byte[1024];
    //读取文本中数据
    FileInputStream inputStream = new FileInputStream(file);
    while ((len = inputStream.read(bytes)) != -1) {
        builder.append(new String(bytes, 0, len));
    }
    inputStream.close();
    System.out.println(builder.toString());
}

上述是最原始的流操作案例,其他的封装可以使用BufferedWriter、BufferedReader等等 需要注意的是使用的Stream一定要记得关闭。不然会出现文件死锁问题

IO的演变历史:

  • BIO(block IO,单核处理,串行,阻塞IO) -> NIO(new io/no block,netty框架就是NIO) -> AIO(异步IO)

2.Netty介绍

Netty是一个基于异步、事件驱动的网络应用程序框架,用于快速开发高性能、高可靠性的网络IO程序,是目前最流行的NIO框架。Netty在互联网领域,大数据分布式计算,游戏行业,通信IM行业获得了广泛的应用。

Dubbo、RocketMQ、Tomcat等内部都采用了Netty。

3.Netty的优势

现在知道了Netty是一个高性能的底层通信框架,那来分析一下原生NIO存在的问题

  • NIO的类库和API太过繁杂
  • 需要熟悉多线程编程,因为NIO编程涉及到Reactor模式。必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序
  • 开发难度、工作量比较大,例如:网络重连,丢包、阻塞等处理非常难
  • JDK NIO有个Epoll bug,会导致Selector空轮询,导致CPU100%

接下来在分析一下为什么用Netty

  • Netty对自带的JDK NIO的API进行了封装,解决了上述问题
  • 设计理念很符合各种传输类型的统一(API阻塞和非阻塞Socket),基于灵活且可扩展的事件模型,清晰的分离关注点,高度可定制的线程模型(单线程,线程池)
  • 使用更加方便,没有其他依赖
  • 高性能,吞吐量更高,延迟更低。减少资源消耗,最小化内存复制
  • 对各种协议的全面支持,例如HTTP

Netty的三大组件

  • Buffer数据缓冲区、Channel轮询处理(中心的调度器)、Selecttor数据通道

4.Netty的操作流程

  • NIOEventLoop监听端口
  • Channel建立新的连接
  • 通过ByteBuf接收数据
  • 通过Pipeline处理链路,每个链路都是一个ChannelHandler,每个handler都有自己的处理逻辑
  • 通过ByteBuf返回数据

结构图分析

graph TD;
common-->buffer
buffer-->实现了自己的ByteBuffer,比JDK的强大很多
common-->codec
codec--> 扩展,包含了非常常见的协议编码解码器的实现
common-->handler
handler-->内置连接通道处理器,channelhandle的所有实现
common-->transport
transport-->网络传输通道的定义与实现,包括网络通信和事件模型

5.Netty中的channel简介

主要列举TCP的操作API,其他的大概举例

  • TCP
BIO同步阻塞NIO同步非阻塞Netty异步非阻塞Netty同步阻塞
客户端SocketSocketChannelNioSocketChannelOioSocketChannel
服务端ServerSocketServerSocketChannelNioServerSocketChannelOioServerSocketChannel
  • UDP: NioDatagramChannel
  • SCTP: NioStcpChannel

6.Netty的特性

  • 异步和事件驱动的高性能网络通信框架
  • 快速用于高性能服务端和客户端
  • 自带编解码解决拆包粘包问题,开发者只关心业务逻辑
  • Reactor线程模型设计支持海量高并发连接
  • 自带Http、WebSocket常用协议,处理起来不用再开发解析代码
  • 将业务和网络逻辑解耦。模块化和可复制性大大提高

本文主要先了解Netty的理论知识,下节开始用Netty编写一些常用协议以便更快了解Netty! 以上就是本章的全部内容了。

上一篇:mysql第十话 - mysql+springboot之sharding-JDBC分表分库实战 下一篇:通信框架之Netty第二话 - 终极理解HTTP协议以及手写一个Tomcat

路漫漫其修道远,吾将上下而求索