Netty框架 你真的懂吗?

Netty简介

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

Netty重要的四个内容:

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

Netty整体结构图

在这里插入图片描述

Netty线程模型

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

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

  1. Resource资源(请求/任务)
  2. Synchronous Event Demultiplexer 同步事件复用器
  3. Dispatcher 分配器
  4. 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实现

[
在这里插入图片描述

PooledByteBuf对象,内存复用

在这里插入图片描述

零拷贝机制

在这里插入图片描述

ByteBuf做了哪些增强

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值