Netty简介
Netty是一个高性能,高可扩展的异步事件驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。
Netty重要的四个内容:
- Reactor线程模型:一种高性能的多线程程序的设计思路
- Netty中自己定义的Channel概念:增强版的通道概念
- ChannelPipeline职责链设计模式:事件处理机制
- 内存管理:增强的ByteBuf缓冲区
Netty整体结构图
Netty线程模型
为了让NIO更好的处理和利用多线程特性,Netty实现了Reactor线程模型。
Reactor模型中有四个核心概念:
- Resource资源(请求/任务)
- Synchronous Event Demultiplexer 同步事件复用器
- Dispatcher 分配器
- Request Handler 请求处理器
EventLoopGroup初始化过程
EventLoop的启动
EventLoop自身实现了Executor接口,当调用executor方法提交任务时,则判断是否启动,未启动则调用内置的executor创建新线程来触发run方法执行。
Bind绑定端口过程
Channel概念
netty中的Channel是一个抽象的概念,可以理解为对JDK NIO Channel的增强和拓展。
增强了很多属性和方法,完整信息可以看代码注释,下面罗列几个常见的属性和方法:
设计模式 - 责任链模式
实现责任链模式4个要素:处理器抽象类,具体的处理器实现类,保存处理器信息,处理执行。
自定义责任链
package cn.tk.myproject.nio;
/**
* 自定义netty中的 piple
*/
public class PipleDemo {
public static void main(String[] args) {
PipleDemo PipleDemo=new PipleDemo();
PipleDemo.addLast(new Handler01());
PipleDemo.addLast(new Handler012extends());
PipleDemo.requestProcess("hhhhhoooo");
}
private HandlerContext head=new HandlerContext(new AbstractHandler() {
@Override
void doHandler(HandlerContext handlerContext, Object args) {
handlerContext.runNext(args);
}
});
public void addLast(AbstractHandler handler){
HandlerContext temp=head;
while (temp.next!=null){
temp=temp.next;
}
temp.next=new HandlerContext(handler);
}
public void requestProcess(Object arg0) {
this.head.handler(arg0);
}
/**
* 定义handler抽象类
*/
}
abstract class AbstractHandler{
abstract void doHandler(HandlerContext handlerContext,Object args);
}
class Handler01 extends AbstractHandler{
@Override
void doHandler(HandlerContext handlerContext, Object arg0) {
arg0 = arg0.toString() + "..handler1的小尾巴.....";
System.out.println("我是Handler1的实例,我在处理:" + arg0);
//执行下一个handler
handlerContext.runNext(arg0);
}
}
class Handler012extends extends AbstractHandler{
@Override
void doHandler(HandlerContext handlerContext, Object arg0) {
arg0 = arg0.toString() + "..handler2的猴嘴.....";
System.out.println("我是Handler2的实例,我在处理:" + arg0);
//执行下一个handler
handlerContext.runNext(arg0);
}
}
/**
* 定义handler上下文
*/
class HandlerContext{
HandlerContext next;
AbstractHandler abstractHandler;
public HandlerContext(AbstractHandler abstractHandler) {
this.abstractHandler = abstractHandler;
}
public void handler(Object args){
abstractHandler.doHandler(this,args);
}
public void runNext(Object arg){
if (this.next!=null){
this.next.handler(arg);
}
}
}
Netty中的ChannelPipeline责任链
入站事件和出站事件
Netty中事件的定义
Pipeline中的handler是什么
维护Pipeline中的handler
handler的执行分析
分析registered入站事件的处理
分析bind出站事件的处理
分析accept入站事件的处理
分析read入站事件的处理
小结
Netty自己的ByteBuf
ByteBuf操作
ByteBuf动态扩容
Unsafe实现
选择合适的ByteBuf实现
[