欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Netty框架 你真的懂吗?

程序员文章站 2022-05-23 14:03:55
...

Netty简介

Netty是一个高性能,高可扩展的异步事件驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。

Netty重要的四个内容:

  1. Reactor线程模型:一种高性能的多线程程序的设计思路
  2. Netty中自己定义的Channel概念:增强版的通道概念
  3. ChannelPipeline职责链设计模式:事件处理机制
  4. 内存管理:增强的ByteBuf缓冲区

Netty整体结构图

Netty框架 你真的懂吗?

Netty线程模型

为了让NIO更好的处理和利用多线程特性,Netty实现了Reactor线程模型。

Reactor模型中有四个核心概念:

  1. Resource资源(请求/任务)
  2. Synchronous Event Demultiplexer 同步事件复用器
  3. Dispatcher 分配器
  4. Request Handler 请求处理器

Netty框架 你真的懂吗?

EventLoopGroup初始化过程

Netty框架 你真的懂吗?

EventLoop的启动

EventLoop自身实现了Executor接口,当调用executor方法提交任务时,则判断是否启动,未启动则调用内置的executor创建新线程来触发run方法执行。

Netty框架 你真的懂吗?

Bind绑定端口过程

Netty框架 你真的懂吗?

Channel概念

netty中的Channel是一个抽象的概念,可以理解为对JDK NIO Channel的增强和拓展。
增强了很多属性和方法,完整信息可以看代码注释,下面罗列几个常见的属性和方法:

Netty框架 你真的懂吗?

设计模式 - 责任链模式

Netty框架 你真的懂吗?

实现责任链模式4个要素:处理器抽象类,具体的处理器实现类,保存处理器信息,处理执行。

Netty框架 你真的懂吗?

自定义责任链

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框架 你真的懂吗?

入站事件和出站事件

Netty框架 你真的懂吗?

Netty中事件的定义

Netty框架 你真的懂吗?

Pipeline中的handler是什么

Netty框架 你真的懂吗?

维护Pipeline中的handler

Netty框架 你真的懂吗?

handler的执行分析

Netty框架 你真的懂吗?

分析registered入站事件的处理

Netty框架 你真的懂吗?

分析bind出站事件的处理

Netty框架 你真的懂吗?

分析accept入站事件的处理

Netty框架 你真的懂吗?

分析read入站事件的处理

Netty框架 你真的懂吗?

小结

Netty框架 你真的懂吗?

Netty自己的ByteBuf

Netty框架 你真的懂吗?

ByteBuf操作

Netty框架 你真的懂吗?

ByteBuf动态扩容

Netty框架 你真的懂吗?

Unsafe实现

Netty框架 你真的懂吗?

选择合适的ByteBuf实现

[
Netty框架 你真的懂吗?

PooledByteBuf对象,内存复用

Netty框架 你真的懂吗?

零拷贝机制

Netty框架 你真的懂吗?

ByteBuf做了哪些增强

Netty框架 你真的懂吗?

相关标签: netty java