Netty事件监听和处理(上)
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app。
今天给大家送了福利:小爱音箱F码,据说卖的比较好,不太好抢到,借着这次公司福利,分享给大家,以表大家的支持和鼓励。
掘金的运营真的很贴心,主动找到我说:我的福利文章不是技术型文章,不能推送到信息流,只能在个人主页看到,为了让更多的人参与这次抽取,建议写一篇技术文章,末尾加上送福利的内容。再次感谢掘金运营小哥「刺客」的贴心和建议。
RabbitMQ实战的后续章节还没来得及看,这篇就总结下之前在项目组分享过的技术点:Netty事件监听和处理。
通过介绍,你会了解到:
- 事件监听、NIO、线程模型等相关概念;
- Netty总体结构;
- 事件监听和处理;
- 项目实践总结;
本篇先介绍下前两节,下一篇介绍后两节。
本篇最后会说明下福利的抽取规则,大家积极参与 >_<
相关概念
Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理。
所以,先介绍下事件监听、责任链模型、socket接口和IO模型、线程模型等基本概念,对后面理解Netty的事件监听和处理有很大帮助。
事件监听
JDK监听器模式主要包含以下元素:
- EventObject 事件对象
- EventListener 事件监听接口
- 自定义事件源
- 事件触发
模式很简单,用户可以自定义事件源,保存触发对象的相关数据,事件被触发后,传递给注册事件的处理者。事件监听接口是为了统一处理者方法。
举个比较好理解的按钮单击事件,其中ActionListener是事件监听器,ActionEvent是事件对象,包含了事件源:
实现一套事件监听的具体过程:
- 确定事件源;
- 明确可能产生的事件,定义成不同的事件对象或事件方法;
- 提供一个存储结构,用于保存监听事件的对象,当事件发生时,会通知监听者;
- 执行回调方法,进行业务处理;
责任链模式
主要是说事件处理者的组织方式,通过责任链模式,可以在任何处理节点,添加自定义处理器,很方便。
关于责任链概念,这里再简单说下:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
socket
一般说NIO,主要是针对网络IO,从网卡中读取数据,向网卡中写入数据,这就是监听器模式的数据源。
网络编程主要通过操作系统提供的socket接口进行,通过了解socket接口可以总结出有哪些事件。
socket是用户进程和内核网络协议之间的统一接口。
socket也是一种特殊的文件,网络通信可以看作是对文件的读取,使得对网络的控制和对文件的控制一样方便。
NIO和IO模型
NIO是指非阻塞IO,我们一般说的IO都是阻塞IO,想全面了解这些概念,又会说的很多,这里就简单概括下。
一个进程所占的内存包括用户态和内核态,为了安全,用户代码是不能直接操作内核态内存的,通过系统调用进行交互,比如读取网络数据,交互过程如下:
用户线程发起read请求后,需要等待数据到达才能返回,在这期间,用户线程不能做任何事情,如果是网络编程,可能有很多Socket对象进行监听,会创建大量线程被阻塞,造成资源浪费,性能下降。
针对这种情况,出现了IO模型的概念,有几种方式:
- 同步非阻塞IO;
- IO多路复用;
- 异步IO;
具体介绍,网上有很多资料,就不详细说了,这里只提下IO多路复用,说说我的理解,我们项目中就是使用这种方式。
所谓多路复用,主要是操作系统提供给我们这种开发模式:可以把感兴趣的IO事件(建立、可读、可写等)提前注册,而且多个socket对象可以注册到一个selector选择器上,这样就可以多个socket对象使用一个用户线程进行监听,当事件发生时,会查找对应的socket进行读、写等操作。
之前做过NIO开发的朋友,可以看下面的示例回顾下整个过程:
线程模型
上面说了我对多路复用的理解,提到了一个线程监听多个socket,但如果socket很多,一个线程是处理不过来的。另外,事件的接收和判断 与 数据的读取、处理、写入,可以在不同线程进行。
这就引出了线程模型的概念,比如Reactor和Proactor模型,具体细节就不介绍了,网上有很多资料,最终目的都是为了提高IO事件处理的性能。
Netty总体结构
这部分主要是了解下Netty,对其实现原理先不做深究。
概述
Netty 是一个异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端;
它驾驭了 Java 高级 API 的能力,并将其隐藏在一个易于使用的 API 之后;
- Core(核心部分),是底层的网络通讯的一些通用抽象,这部分内容是关键。
- Transport Services(传输服务),具体的网络传输能力的定义以及一些实现。
- Protocol Support(协议支持),netty 对于一些通用协议的编码解码实现。
零拷贝
广义的零拷贝是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。Linux中的sendfile()以及 Java NIO 中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在 Netty 中也通过在FileRegion中包装了 NIO 的FileChannel.transferTo()方法实现了零拷贝。
Netty中所指零拷贝,完全在用户态,更偏向于优化数据操作。Netty允许我们将多段数据合并为一整段虚拟数据供用户使用,而不需要对数据进行拷贝操作。
统一的通讯模型
传统的JAVA IO API 在应对不同的传输协议时,需要使用不同的类型和方法,例如:java.net.Socket和java.net.DatagramSocket,它们并不具有相同的超类型;Java新的IO API与原有的阻塞式IO API也不兼容;
Netty提供了统一的API编程接口,抽象了所有点对点通信操作,仅调整几行代码,便可切换不同的传输实现:
- 基于NIO的TCP/IP传输
- 基于OIO的TCP/IP传输
- 基于OIO的UDP/IP传输
- 本地传输
事件模型
也就是要说的事件监听和处理,提供了很好的方式去处理各种事件。
大致处理过程如上图,具体将在下一篇介绍。
福利说明
最后,说下福利:小爱音箱F码。
准备了2份,主要为了感谢「微信公众号」和「掘金社区」的朋友,每一份包括1个小爱音箱F码和1个小爱音箱 mini F码。
小米手机F码源自于英文单词”Friend”,是小米公司提供给小米核心用户及为小米做出贡献的网友的优先购买权,如果您有小米F码的话无需等待即可直接利用小米F码购买相关产品!
简单来说,F码就是不用抢了,可以直接购买 ~
抽奖截止时间
4月9号中午12点
抽奖规则
掘金社区
需要关注我的掘金账号才有效,个人主页;
使用微信抽奖助手随机抽取for掘金社区;
微信公众号
需要关注我的微信公众号才有效;
使用微信抽奖助手随机抽取for微信公众号;
Netty事件监听和处理(上)的更多相关文章
- Netty事件监听和处理(下)
上一篇 介绍了事件监听.责任链模型.socket接口和IO模型.线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和处理. 前面提到,Netty是一个NIO ...
- cocos2d-x 事件分发机制 ——加速计事件监听
加速计事件监听机制 在上一篇中介绍了cocos2d-x中的触摸事件机制,这篇来介绍下游戏中也常常常使用到的加速计事件,这些都是游戏中的常常要用到的. 移动设备上一个非常重要的输入源是设备的方向.大多数 ...
- js事件监听
/* 事件监听器 addEventListener() removeEventListener() 传统事件绑定: 1.重复添加会,后添加的后覆盖前面的. */ 示例代码中的html结构: <b ...
- unity实现3D物体上的事件监听处理
想要在3D物体上实现全套事件监听处理: OnMouse系列 OnTrigger系列 OnPointer系列 OnDrag系列 1.在相机中添加Physics Raycaster组件 2.3D物体上 ...
- SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)
SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...
- Zookeeper Curator 事件监听 - 秒懂
目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- .NET事件监听机制的局限与扩展
.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...
- 让 select 的 option 标签支持事件监听(如复制操作)
这标题,让option支持事件监听,应该不难的呀,有什么好讲的? 其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置 查了一些资料,姑且认为 ...
随机推荐
- Java安装和环境变量配置
一.Java的安装 1.下载合适的版本,安装jdk和jre到同一路径下的同一文件夹下,例如:都安装在 E:\Java: 备注: JDK:Java Development Kit : JRE: Ja ...
- 【Ansible】 基于SSH的远程管理工具
[Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...
- 【Python】 关于import和package结构
关于import语句 python程序需要使用某个第三方模块的话要用import语句,其实就是把目标模块的内容加载到内存里.当然,在加载之前,python会按照一定的顺序寻找sys.path中的目录. ...
- Algorithm --> 筛法求素数
一般的线性筛法 genPrime和genPrime2是筛法求素数的两种实现,一个思路,表示方法不同而已. #include<iostream> #include<math.h> ...
- [poj3984]迷宫问题_bfs
迷宫问题 题目大意:给你一个5*5的矩阵,求左上角到左下角的最短路径. 注释:0或1的矩阵,1表示不能走,0表示能走,保证有唯一最短路径. 想法:bfs爆搜练习题.通过其实点,定义方向数组,然后进行b ...
- 谷歌、腾讯、百度相应API批量获取地理位置坐标信息及其优缺点
目录: 申请ak 批量获取地理位置 目的:通过给定的地理位置名称(如:北京市海淀区上地十街十号),获取经纬度信息. 1.申请ak 以百度Geocoding API为例:http://lbsyun.ba ...
- zip详解
http://www.360doc.com/content/06/0915/14/10610_208147.shtml
- 语句in
Python :in在for中: for name in names: names='1','2','3','4','5' for name in names: print(names) in no ...
- 关于VR开发中的穿墙问题随想
在VR开发中,用户将以第一人称的视角进入虚拟世界,即用户同时身处两个坐标系:1. 现实世界坐标系(如房间的坐标系),用户的身体处于这个坐标系 2. VR世界坐标系,用户的感官处于这个坐标系,即用户觉得 ...
- springboot elasticsearch 集成注意事项
文章来源: http://www.cnblogs.com/guozp/p/8686904.html 一 elasticsearch基础 这里假设各位已经简单了解过elasticsearch,并不对es ...