一起学习下Netty,从Netty的相关简介,Demo的着陆,从线程模型的话,里面用到了NIO的相关知识,可以看之前的文章回顾下。
Netty简介
介绍
Netty是一个高性能,高可扩展性的异步事件驱动的网络应用框架,它极大地简化了TCP和UDP客户端和服务端开发等网络编程。
四个内容
1.Reactor 线程模型:一种高性能的多线程设计思路。
2.Netty中自定义的channel概念,增强版的通道概念。
3.ChannelPipline职责链设计模式:事件处理机制。
4.内存管理:增强的ByteBuf缓冲区。
API
netty.io
如何学习
网上的很多都是直接说理论,感觉很多时候直接给你对蒙圈了,其实还是从实践来出发去学习更有效果,
netty的源码中,有个专门的目录里面有各种的实例,直接通过netty的源码中加入中文的注释的方式。
github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example
Netty线程模型
为了让NIO处理更好的利用多线程特性,Netty实现了Reactor线程模型。
Reator模型中有四个核心概念
Resources 资源(请求/任务)
Synchronous Event Demultiplexer 同步事件复用器
Dispatcher 分配器
Request Handler 请求处理器
EventLoopGroup初始化过程
EventLoop的启动
EventLoop 组神实现了Executor接口,当调用executor方法提交任务时,则判断是否启动,未启动则调用内置的executor创建新线程执行run方法执行。
Bind绑定端口过程
channel
netty中的Channel是一个抽象的概念,可以理解为对JDK NIO Channel的增强和拓展,增加了很多属性和方法。
Channel:和Java Nio中的Channel同名,是Netty对网络底层读写和连接的抽象。
AbstractChannel:是Channel的抽象实现类,抽象出了parent,id,unsafe,pipeline等概念。
AbstractNioChannel:封装Java NIO,通过Selector选择器进行IO事件的监听,拥有
SelectionKey,readInterestOp等NIO的属性,这是在这个类的构造函数中设置了非阻塞模式。
AbstractNioByteChannel此抽象类开始的分支中的类都是关于客户端的Channel,AbstractNioMessageChannel此抽象类开始的分支中的类都是关于服务端的Channel,前者和后者都继承自AbstractNioChannel,区别在于客户端Channel注册的感兴趣的事件时READ事件,服务端Channel注册的感兴趣的事件时ACCEPT事件。
NioByteUnsafe类是客户端实现读写的类,NioMessageUnsafe类是服务端实现读写的类,二者的区别在于读写的具体实现不同。客户端与NioSocketChannel关联的配置类为NioSocketChannelConfig类,服务端与NioServerSocketChannel关联的配置类为NioServerSocketChannelConfig类。
PS:毕竟抽象的设计模式,在学习过程中会有难懂的地方,需要根据代码去理解。主要是领会Reactor的理念。
领取专属 10元无门槛券
私享最新 技术干货