Netty中的这些知识点,你需要知道!
一、Channel
Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口。
Channel是一个门面,封装了包括网络I/O及相关的所有操作。
Channel聚合了包括网络读写、链路管理、网络连接信息、获取EventLoop、Pipeline等相关功能类;统一分配,调度实现相应场景的功能。

一个Channel 对应一个物理连接,是基于物理连接上的操作包装。
二、EventLoop
EventLoop,Event意为事件、Loop意为环,EventLoo即为事件环。
EventLoop是一种程序设计结构,等待以及分发事件。

NioEventLoop,是一个Netty工作线程,又不仅仅是一个Netty工作线程。
标准的netty线程模型 中我们讲过Netty的标准线程池模型,池子里的每个线程对象就是一个NioEventLoop对象。或负责接受连接,或负责网络I/O。
说它不仅仅是一个Netty线程,因为它实现了很多功能,我们可以看下它的继承图:

它的上方有两个枝丫,一个线程属性,一个EventLoop,它是Netty的Reactor线程。
既然是Reactor线程,那么首先我们需要一个多路复用器。在Netty NioEventLoop中,包就含一个 Selector,它的操作对象是Channel。

NioEventLoop的主要逻辑在它的run()方法,方法体内是一个无限循环 for (;;),循环体内实现Loop功能。这也是通用的NIO线程实现方式。

Loop 从任务队列里获取任务,然后检查多路复用器中就绪的Channel进行处理。
三、Unsafe
Netty中的Unsafe,一个Channel内部聚合接口,用以处理实际的网络I/O读写。当然,取Unsafe命名,源码中释义:提供的网络相关的操作方法,永远不应该被开发人员操作使用。
它是Channel的一个辅助接口,主要方法:
1、register:注册Channel
2、deregister:取消注册
3、bind:绑定地址,服务端绑定监听特定端口;客户端指定本地绑定Socket地址。
4、connect:建立连接
5、disconnect:断开连接
6、close:关闭连接
7、write:调度写,将数据写入buffer,并未真正进入Channel
8、flush:将缓冲区中的数据写入Channel
四、AdaptiveRecvByteBufAllocator
动态缓冲区分配器,源码说明:根据实时的反馈动态的增加或者减少预需的缓冲区大小。
如果上一次分配的缓冲区被填满了,则调高下一次分配的缓冲区大小。
如果连续两次实际使用的容量低于分配的缓冲区大小特定比例,则减小下一次分配的缓冲区大小。
其它情景,保持分配大小不变。
Netty的这种“智能化”处理,可以说是相当有用的:
1、首先,实际的应用场景千差万别,同一场景下不同时刻的缓冲区需求也是实时变化(一句话可以是一个字,也可能是1000个字),这就需要Netty动态调整缓冲分配大小以适应不同的业务场景,时刻场景。

2、其次,过大的不必要的内存分配,会导致Buffer处理性能下降;过小的内存分配,则会导致频繁的分配释放。这都是一个优良的网络框架不应该有的。
3、最后,动态的调整最直接的好处就是内存的的高效使用,一定程度上做到了按需分配。
五、ChannelPipeline
Pipeline 管道,Channel的数据流通管道,在这个管道中,可以做很多事情。
ChannelPipeline 是一种职责链,可以对其中流动的数据进行过滤、拦截处理,是一种插拔式的链路装配器。

1、ChannelPipline是一个容器
支持查询、添加、删除、替换等容器操作。
2、ChannelPipline支持动态的添加和删除 Handler
ChannelPipline的这种特性给了我们相当的想象空间,例如动态的添加系统拥塞保护Handler,敏感数据过滤Handler、日志记录Handler、性能统计Handler等。
3、ChannelPipline 是线程安全的
ChannelPipline使用 synchronized 实现线程安全,业务线程可以并发的操作ChannelPipline。但需要注意的是,Handler是非线程安全的。
六、HandlerAdapter
Adapter是一种适配器,对于用户自定义的Handler,可以通过继承HandlerAdapter,来规避不必要的接口实现。

Netty中的这些知识点,你需要知道!的更多相关文章
- Netty(五)序列化protobuf在netty中的使用
protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的.它主要优点如下: 1.性能好,效率高: 2.跨语言(java自带的序列化,不能跨语言) protobuf参考文档 ...
- PHP面向对象中的重要知识点(三)
1. namespace: 和C++中的名字空间很像,作用也一样,都是为了避免在引用较多第三方库时而带来的名字冲突问题.通过名字空间,即便两个class的名称相同,但是因为位于不同的名字空间内,他们仍 ...
- PHP面向对象中的重要知识点(二)
1. __toString: 当对象被打印时,如果该类定义了该方法,则打印该方法的返回值,否则将按照PHP的缺省行为输出打印结果.该方法类似于Java中的toString(). <?php cl ...
- PHP面向对象中的重要知识点(一)
1. __construct: 内置构造函数,在对象被创建时自动调用.见如下代码: <?php class ConstructTest { private $arg1; private $arg ...
- 【转】Netty那点事(二)Netty中的buffer
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...
- Netty那点事: 概述, Netty中的buffer, Channel与Pipeline
Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...
- Netty中的EventLoop和线程模型
一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...
- Netty中的连接管理
连接管理是我们首先需要关注的,检测空闲连接以及超时对于及时释放资源来说是至关重要的.由于这是一项常见的任务,Netty特地为它提供了几个ChannelHandler实现. 用于空闲连接以及超时的Cha ...
- Netty中ByteBuf的引用计数线程安全的实现原理
原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...
随机推荐
- .NET Core HttpClient源码探究
前言 在之前的文章我们介绍过HttpClient相关的服务发现,确实HttpClient是目前.NET Core进行Http网络编程的的主要手段.在之前的介绍中也看到了,我们使用了一个很重要的 ...
- ngnix随笔四
1.alias path 例1. =>http://www.a.com/bbs/ root /data/vhosts/; location /bbs/{ alias /data/a.com/; ...
- [wordpress使用]004_导入多媒体
在写文章的时候难免要需要用到图片.音频或者视频文件,wordpress不仅提供本地上传多媒体文件功能,更提供在线导入多媒体.能更方便,范围更大的获取我们所需要的资源. 本地上传文件 在写文章的界面,选 ...
- GTA5侠盗猎车5中文版破解版绿色版汉化版迅雷下载地址种子实测可用
GTA5(侠盗猎车5)中文版下载地址(实测可用) 迅雷下载地址:https://www.90pan.com/b1548988 一定要关闭安全软件并且加入白名单 实测通过,关闭杀毒软件可以完美运行,最好 ...
- Spring AOP学习笔记01:AOP概述
1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...
- Java实现 LeetCode 673 最长递增子序列的个数(递推)
673. 最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, ...
- Java实现 LeetCode 622 设计循环队列(暴力大法)
622. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器" ...
- Java实现 LeetCode 374 猜数字大小
374. 猜数字大小 我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的 ...
- java实现BellmanFord算法
1 问题描述 何为BellmanFord算法? BellmanFord算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求取含负权图的单源最短 ...
- sql server 连接种类
一.连接种类 内连接 inner join 如果分步骤理解的话,内连接可以看做先对两个表进行了交叉连接后,再通过加上限制条件(SQL中通过关键字on)剔除不符合条件的行的子集,得到的结果就是内连接了. ...