zoukankan      html  css  js  c++  java
  • Netty初步探索

    简介

    1. Netty 是一个 基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。

    2. 它极大地简化并优化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。

    3. 支持多种协议 如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议

    三层结构

    1. 最低层为支持零拷贝功能的自定义Byte buffer;

    2. 中间层为通用通信API;

    3. 上层为可扩展的事件模型。

    核心组件

    1. EventLoopGroup:Netty内部都是通过线程在处理各种数据,EventLoopGroup就是用来管理调度他们的,注册Channel。

    2. EventLoop:EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。

    3.  ChannelPipleline:代表了处理业务逻辑的管线,netty中事务的处理是按照责任链中的机制来进行的,服务器端收到客户端的请求,然后决定是否发消息回给客户端,首先服务器或者客户端收到消息走继承channeinboundhandler接口的实现类,发出信息的时候走channeloutboundhandler实现类。

    4. Channel:代表了一个客户端和服务器端的一条连接,服务器端可以维护多个连接,Channel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()connect()read()write() 等。

    5. ChannelInitializer:初始化ChannelHandler的地方,确定channellhandler的执行顺序

    6. ChannelFuture :任务执行的结果。

    7. Bootstrap 和ServerBootstrap:都是客户端的启动引导类/辅助类,Netty中客户端和服务器端连接所使用的类,客户端连接的是远程服务器的ip,服务器端代表了绑定本地的ip,客户端使用的是单个的EventLoopGroup,服务器端使用的是两个EventLoopGroup,是因为server端需要绑定本地的ip端口,这个连接使用ServerChannel来代表,另外的Channel集合代表了客户端和服务器端的连接。

    组件关联

    1.Channel 和 EventLoop

    Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的Channel 处理 I/O 操作,两者配合参与 I/O 操作。

    2.ChannelHandler 和 ChannelPipeline

    • ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
    • ChannelPipeline 为 ChannelHandler 的链,提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API 。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline

    3.EventloopGroup 和EventLoop

    EventLoopGroup 包含多个 EventLoop(每一个 EventLoop 通常内部包含一个线程),EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理,即 Thread 和 EventLoop 属于 1 : 1 的关系,从而保证线程安全。

    处理器

    1.源码分析

    SimpleChannelInboundHandler

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    boolean release = true;
    try {
    if (acceptInboundMessage(msg)) {
    @SuppressWarnings("unchecked")
    I imsg = (I) msg;
    channelRead0(ctx, imsg);
    } else {
    release = false;
    ctx.fireChannelRead(msg);
    }
    } finally {
    if (autoRelease && release) {
    ReferenceCountUtil.release(msg);
    }
    }
    }

    ChannelInboundHandlerAdapter

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    ctx.fireChannelRead(msg);
    }

    从源码上上面,我们可以看出,当方法返回时,SimpleChannelInboundHandler会负责释放指向保存该消息的ByteBuf的内存引用。而ChannelInboundHandlerAdapter在其时间节点上不会释放消息,而是将消息传递给下一个ChannelHandler处理。

    2.从类定义看

    SimpleChannelInboundHandler

    public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter

    ChannelInboundHandlerAdapter

    public class ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler
    从类的定义中,我们可以看出
    • SimpleChannelInboundHandler<T>是抽象类,而ChannelInboundHandlerAdapter是普通类,
    • SimpleChannelInboundHandler支持泛型的消息处理,而ChannelInboundHandlerAdapter不支持泛型
  • 相关阅读:
    RabbitMQ集群
    RabbitMQ (十六) 消息队列的应用场景 (转)
    RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡
    RabbitMQ (十四) 普通集群
    RabbitMQ (十三) 集群+单机搭建(window)
    秋招_微盟_一面/二面/HR面
    秋招-腾讯云西子公司-一二面-11/16
    秋招-京东(补录)-面经-一面/二面/HR面
    秋招-腾讯补录-面经-12/10
    投递过程
  • 原文地址:https://www.cnblogs.com/nxjblog/p/13225400.html
Copyright © 2011-2022 走看看