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)
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数据通道
- NIOEventLoop监听端口
- Channel建立新的连接
- 通过ByteBuf接收数据
- 通过Pipeline处理链路,每个链路都是一个ChannelHandler,每个handler都有自己的处理逻辑
- 通过ByteBuf返回数据
结构图分析
5.Netty中的channel简介主要列举TCP的 *** 作API,其他的大概举例
- TCP
BIO同步阻塞 | NIO同步非阻塞 | Netty异步非阻塞 | Netty同步阻塞 | |
---|---|---|---|---|
客户端 | Socket | SocketChannel | NioSocketChannel | OioSocketChannel |
服务端 | ServerSocket | ServerSocketChannel | NioServerSocketChannel | OioServerSocketChannel |
- UDP: NioDatagramChannel
- SCTP: NioStcpChannel
- 异步和事件驱动的高性能网络通信框架
- 快速用于高性能服务端和客户端
- 自带编解码解决拆包粘包问题,开发者只关心业务逻辑
- Reactor线程模型设计支持海量高并发连接
- 自带Http、WebSocket常用协议,处理起来不用再开发解析代码
- 将业务和网络逻辑解耦。模块化和可复制性大大提高
本文主要先了解Netty的理论知识,下节开始用Netty编写一些常用协议以便更快了解Netty!
以上就是本章的全部内容了。
上一篇:mysql第十话 - mysql+springboot之sharding-JDBC分表分库实战
下一篇:通信框架之Netty第二话 - 终极理解HTTP协议以及手写一个Tomcat
路漫漫其修道远,吾将上下而求索
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)