zoukankan      html  css  js  c++  java
  • Netty学习记录

    一、简介

      Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
      也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
      “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

    以上内容摘录自百度百科Netty

    二、概念

    Bootstrap:启动

    ServerBootstarp:服务端启动

    Channel:链接

    ChannelHandler:链接处理器(链接过滤器)

    ChannelPipeline:链接管道

    ChannelPool:链接池

    ChannelPoolHandler:链接池处理器

    EventLoopGroup:线程组

    NioEventLoopGroup:线程组,一组NIO线程,本质上就是Reactor线程组,专门用来处理网络事件。

    三 、ChannelOption:链接选项

    ChannelOption.SO_BACKLOG (一般用于option–>boss)
    BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程都处于工作是(用完了),用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。

    ChannelOption.SO_REUSEADDR (一般用于option–>boss)
    SO_REUSEADDR 对应的是socket选项中SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口,例如,某个服务占用了TCP的8080端口,其他服务再对这个端口进行监听就会报错,SO_REUSEADDR这个参数就是用来解决这个问题的,该参数允许服务公用一个端口,这个在服务器程序中比较常用,例如某个进程非正常退出,对一个端口的占用可能不会立即释放,这时候如果不设置这个参数,其他进程就不能立即使用这个端口。

    ChannelOption.ALLOCATOR
    Netty参数,ByteBuf的分配器(重用缓冲区),默认值为ByteBufAllocator.DEFAULT,4.0版本为UnpooledByteBufAllocator,4.1版本为PooledByteBufAllocator。该值也可以使用系统参数io.netty.allocator.type配置,使用字符串值:“unpooled”,“pooled”。
    额外解释, Netty4.1使用对象池,重用缓冲区(可以直接只用这个配置)
    bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
    bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);

    ChannelOption.RCVBUF_ALLOCATOR (一般用于option->boss)
    Netty参数,用于Channel分配接受Buffer的分配器,默认值为AdaptiveRecvByteBufAllocator.DEFAULT,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。可选值为FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器。

    ChannelOption.TCP_NODELAY (一般用于childOption)
    TCP_NODELAY 对应于socket选项中的TCP_NODELAY,该参数的使用和Nagle算法有关,Nagle算法是将小的数据包组装为更大的帧进行发送,而不会来一个数据包发送一次,目的是为了提高每次发送的效率,因此在数据包没有组成足够大的帧时,就会延迟该数据包的发送,虽然提高了网络负载却造成了延时,TCP_NODELAY参数设置为true,就可以禁用Nagle算法,即使用小数据包即时传输。
    或者
    TCP_NODELAY就是用于启用或关闭Nagle算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。

    ChannelOption.SO_SNDBUF 和ChannelOption.SO_RCVBUF (一般用于childOption)
    SO_SNDBUF 和 SO_RCVBUF对应socket中的SO_SNDBUF和SO_RCVBUF参数,即设置发送缓冲区和接收缓冲区的大小,发送缓冲区用于保存发送数据,直到发送成功,接收缓冲区用于保存网络协议站内收到的数据,直到程序读取成功。
    或者
    SO_RCVBUF参数,TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_rmem查询其大小。一般情况下,该值可由用户在任意时刻设置,但当设置值超过64KB时,需要在连接到远端之前设置。
    SO_SNDBUF参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem查询其大小。

    ChannelOption.CONNECT_TIMEOUT_MILLIS: (一般用于Bootstrap或者childOption)
    Netty参数,连接超时毫秒数,默认值30000毫秒即30秒。

    ChannelOption.SO_LINGER (一般用于childOption)
    Socket参数,关闭Socket的延迟时间,默认值为-1,表示禁用该功能。-1表示socket.close()方法立即返回,但OS底层会将发送缓冲区全部发送到对端。0表示socket.close()方法立即返回,OS放弃发送缓冲区的数据直接向对端发送RST包,对端收到复位错误。非0整数值表示调用socket.close()方法的线程被阻塞直到延迟时间到或发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。

    ChannelOption.SO_KEEPALIVE
      Socket参数,连接保活,默认值为False。启用该功能时,TCP会主动探测空闲连接的有效性。可以将此功能视为TCP的心跳机制,需要注意的是:默认的心跳间隔是7200s即2小时。Netty默认关闭该功能。

    ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK (一般用于childOption)
      Netty参数,写高水位标记,默认值64KB。如果Netty的写缓冲区中的字节超过该值,Channel的isWritable()返回False。

    ChannelOption.WRITE_BUFFER_LOW_WATER_MARK (一般用于childOption)
      Netty参数,写低水位标记,默认值32KB。当Netty的写缓冲区中的字节超过高水位之后若下降到低水位,则Channel的isWritable()返回True。写高低水位标记使用户可以控制写入数据速度,从而实现流量控制。推荐做法是:每次调用channl.write(msg)方法首先调用channel.isWritable()判断是否可写。

    ChannelOption.AUTO_READ (一般用于childOption)
      Netty参数,自动读取,默认值为True。Netty只在必要的时候才设置关心相应的I/O事件。对于读操作,需要调用channel.read()设置关心的I/O事件为OP_READ,这样若有数据到达才能读取以供用户处理。该值为True时,每次读操作完毕后会自动调用channel.read(),从而有数据到达便能读取;否则,需要用户手动调用channel.read()。需要注意的是:当调用config.setAutoRead(boolean)方法时,如果状态由false变为true,将会调用channel.read()方法读取数据;由true变为false,将调用config.autoReadCleared()方法终止数据读取。

    ChannelOption.MAX_MESSAGES_PER_READ
      Netty参数,一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChannel需要接受足够多的连接,保证大吞吐量,NioByteChannel可以减少不必要的系统调用select。

    ChannelOption.WRITE_SPIN_COUNT
      Netty参数,一个Loop写操作执行的最大次数,默认值为16。也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。

    ChannelOption.MESSAGE_SIZE_ESTIMATOR
      Netty参数,消息大小估算器,默认为DefaultMessageSizeEstimator.DEFAULT。估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位

    ChannelOption.SINGLE_EVENTEXECUTOR_PER_GROUP
      Netty参数,单线程执行ChannelPipeline中的事件,默认值为True。该值控制执行ChannelPipeline中执行ChannelHandler的线程。如果为True,整个pipeline由一个线程执行,这样不需要进行线程切换以及线程同步,是Netty4的推荐做法;如果为False,ChannelHandler中的处理过程会由Group中的不同线程执行。

    三、IO模型

    Reactor 单线程模型

    所有的 IO 操作都在同一个 NIO 线程上面完成

    Rector 多线程模型

    Rector 多线程模型与单线程模型最大的区别就是有一组 NIO 线程处理 IO 操作

    主从 Reactor 多线程模型

    特点:服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,而是一个独立的 NIO 线程池

     

    参考资料:

    李林锋 InfoQ

    Netty系列之Netty高性能之道

    Java NIO框架Netty教程(一) – Hello Netty

    Netty4.x中文教程系列(二) Hello World !

    Essential Netty in Action 《Netty 实战(精髓)》

    一起学Netty

    GitHub项目地址

    User guide

    从netty-example分析Netty组件

     Netty In Action中文版 - 第三章:Netty核心概念

    Netty之ChannelOption

    ChannelOption用到的socket的标准参数

    自顶向下深入分析Netty(三)--Bootstrap

    Netty连接池ChannelPool,FixedChannelPool应用

    教你正确地利用Netty建立连接池

    Netty 连接池的使用姿势

    源码之下无秘密 ── 做最好的 Netty 源码分析教程

    Netty中的Idle事件

    基于netty的心跳检测

    带连接池的netty客户端核心功能实现剖解

    教你正确地利用Netty建立连接池

    Netty(十二) Netty自定义protobuf编解码器

    Netty(十三)使用jprotobuf实现Netty编解码器

    netty系列之ChannelOption

    netty笔记-ChannelOption

    Netty 心跳服务之 IdleStateHandler 源码分析

  • 相关阅读:
    Ubuntu 8.04安设nVidia新版表现驱动
    特性化设置你的linux环境
    Ubuntu 8.04 去失踪文泉驿的点阵字形的方法
    Fedora Nightlife项目 扶助较劲争论机的空闲
    Ubuntu显卡驱动不精确,进入黑屏的处置装备
    Linux中翻开带flash网页主动封锁的处理办法
    Firefox 3 Alpha 5
    Ubuntu 8.04无法正常关机成就处置惩罚
    Redhat Enterprise Linux 5.2 公布了
    KOffice 1.6.3
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/6484399.html
Copyright © 2011-2022 走看看