Netty学习一:基本知识
1. Netty基础知识
1.1 Netty出现的原因
- Java NIO 太难用,存在BUG(如Epoll-Bug)
- 基于第一点,大多数高性能服务器被C和C++盘踞
- 同样基于第一点,Java NIO编程门槛高
- 业界其他的NIO框架不成熟
1.2 Netty
Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性.
1.3 特性
1.3.1 设计
- 统一的API,适用于不同的协议(阻塞和非阻塞)
- 基于灵活、可扩展的事件驱动模型
- 高度可定制的线程模型
- 可靠的无连接数据Socket支持(UDP)
1.3.2 性能
- 更好的吞吐量,低延迟
- 更省资源
- 尽量减少不必要的内存拷贝
1.3.3 安全
- 完整的SSL/TLS和STARTTLS的支持
- 能在Applet与Android的限制环境运行良好
1.3.4 健壮
- 不再因过快、过慢或超负载连接导致OutOfMemoryError
- 不再有在高速网络环境下NIO读写频率不一致的问题
1.3.5 易用
- 完善的JavaDoc,用户指南和样例
- 简洁简单
- 仅依赖标准JDK
1.4 与其他框架的比较
1.4.1 Mina
Mina是有apache开发的帮助用户开发高性能和高伸缩网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
Netty与Mina的比较:
- Netty和Mina的主导作者是同一人
- Mina出自于Apache,Netty出身于商业开源大亨Jboss
- Mina和Netty都采用了Reactors in threads模型
- Mina是heapbytebuffer,Netty是directbytebuffer
- 调度任务的不同
- Mina和内核结合更紧密
- Netty开发比Mina开发更灵活,更友好
2. 架构简介
2.1 架构分析
2.1.1 总体结构
2.1.1.1 Core
Netty Core是Netty核心内容,它包括事件模型、通用API和Zero Copy功能。是上层功能的基础,由Core可以构建不同的应用服务。
2.1.1.2 Protocl Support
Protocol Support提供了多种协议的编解码包括HTTP、二进制和Google Protobuf等等,它们通过Codec Framework进行整合。
2.1.1.3 Transport Support
Transport Support提供了基本的NIO和BIO传输实现,是Netty网络通信的基础。
2.1.1.4 Security Support
Security Support不光提供了通信层的安全保障(比如SSL/TLS),还在应用层提供了解决OOM的方案。
2.1.1.5 Container Integration
Container Integration是可以应用于其他主流开发框架的集合,通过它可以和Spring、OSGi进行快速集成,为快速使用Netty提供基础支撑。
2.1.2 逻辑架构
2.1.2.1 Reactor通信调度层
该层的主要职责是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,例如连接创建、连接激活、读事件、写事件等等。将这些事件触发到PipeLine中,由PipeLine管理的职责链来后续进行处理。
2.1.2.2 PipeLine
PipeLine是职责链ChannelPipeLine,它负责事件在职责链中的有序传播,同时负责动态的编排职责链。职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向后/向前传播事件。不同应用的Handler节点的功能也不同,通常情况下,往往会开发编解码Handler用于消息的编解码,它可以将外部的协议消息转换成内部的POJO对象,这样上层业务则只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现层面的分层隔离。
2.1.2.3 业务逻辑编排层
业务逻辑编排层通常有两类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。
2.1.2.4 分层设计
架构的不同层面,需要关心和处理的对象都不同,通常情况下,对于业务开发者,只需要关心职责链的拦截和业务Handler的编排,因为应用层协议栈往往是开发一次,到处运行,实际上对于业务开发者来说,只需要关心服务层的业务逻辑开发即可。各种应用协议以插件的形式提供,只有协议开发人员需要关注协议插件,对于其他业务开发人员来说,只需要关心业务逻辑定制即可。这种分层的架构设计理念实现了NIO框架各层之间的解耦,便于上层业务协议栈的开发和业务逻辑的定制。
正是由于Netty的分层架构设计合理,基于Netty的各种应用服务器和协议栈开发才能够如雨后春笋般得到快速发展。
2.2 架构特点
2.2.1 高性能
性能是设计出来的,而不是测试出来的
- 采用异步非阻塞I/O类库,基于Reactor模型实现,解决了传统同步阻塞I/O模式下一个服务器无法平滑地处理线性增长的客户端问题
- TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复杂,提高读写性能
- 通过内存池循环利用ByteBuf,避免频繁创建和销毁带来的性能损耗
- 可配置的IO线程数、TCP参数
- 采用环形数组缓冲区实现无锁化并发编程
- 关键资源使用单线程串行化方式
- 通过引入计数器及时地申请释放不再被引用的对象,细粒度的内存管理,减少GC
2.2.2 可靠性
- 链路有效性检测
心跳机制进行检测:空闲时检测,事件通知
- 内存保护机制
计数器、重用、上限
- 优雅停机
2.2.3 可定制扩展性
- 责任链模式
- 基于接口开发
- 提供了大量工厂类
- 提供了大量的可配置参数
3. 应用
在互联网中的应用:Dubbo
提供异步、高性能的NIO的通信框架
NIO客户端和服务端
心跳检测能力
断连重连机制
流量控制
Dubbo协议的编解码
大数据领域的应用:Apache Avro
提供异步、高性能的NIO的通信框架
NIO客户端和服务端
心跳检测能力
断连重连机制
流量控制
游戏服务器的应用
为各进程提供高性能的异步网络通信能力
自定义协议的编解码
心跳检测、流量整形、日志统计
SSL、黑白名单
内存池技术保证最大限度重用对象
4. 未来发展
广泛的应用
深入的技术演进
- 支持Android
- 简化处理器层次
- 更简单更精确的缓冲区泄漏追踪
- 更灵活的线程模型
- ...
活跃的社区
最后的提交在两小时前
明确的Road Map
4.x
5.x
Netty学习一:基本知识的更多相关文章
- Netty 学习笔记(1)通信原理
前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始. Netty 的通信原理 Netty 底层 ...
- netty学习指南
这段时间领导让我熟悉Socket开发,我花了三周时间左右去学习相关的知识,包括Java socket开发,重点学习了netty这个异步非阻塞通信框架. 在这里把我学习过程中遇到的有用资料整理了,供大家 ...
- Netty学习篇③--整合springboot
经过前面的netty学习,大概了解了netty各个组件的概念和作用,开始自己瞎鼓捣netty和我们常用的项目的整合(很简单的整合) 项目准备 工具:IDEA2017 jar包导入:maven 项目框架 ...
- 全网首发,腾讯T3-3整理Netty学习方案(体系图+项目+学习文档)
前言: 想要学好一门技术,最起码要对他有一定的了解,起码听说过相应的底层原理的东西吧,最起码你要有一点能和别人交流的内容吧,下面是我精简的一点内容,希望对于大家了解netty能有一点帮助 Netty是 ...
- Netty学习笔记-入门版
目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...
- netty学习资料
netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- Netty学习之客户端创建
一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...
- Ant学习-001-ant 基础知识及windows环境配置
一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
随机推荐
- css中怎么设置透明度的问题
小伙伴们是不是在找怎么样去设置页面的透明度的方法呢...别找了,我这儿就有,而且肯定够用了. 我自己会用到的就有两种,可以和大家分享一下. 1.用opcity的方法去设置透明度.代码如下: .div ...
- 黑马程序员-NSDictionary和NSMutableDictionary
NSDictionary和NSMutableDictionary:通过key和value进行对应,进行存储元素,能够方便提取所需的元素.key是不能够重复出现,但是value能够重复出现.NSDict ...
- EOS -- 一种灵巧的系统运行跟踪模块
EOS到底是什么词的缩写,我猜应该是Error of System.最早接触它,是在UT那会.不过那会它是被设计成一个很大的数组,也没有被包含调用函数和行号,又或是时间,只是些计数.编码时,加减一个E ...
- 关于"Command /usr/bin/codesign failed with exit code 1"的解决办法
今天当码农的时候,xcode爆出"Command /usr/bin/codesign failed with exit code 1"这样一个错 当时以为是授权文件设置不正确的问题 ...
- 日常工作中的点滴:C# 根据字节长度截包含中文的字符串
方法中利用正则表达式判断某个字符是否是中文 public string SubStringB(string text,int length){ int target=0; int b=0; for(i ...
- :尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。
iis有程序池有一个属性 是否启用32位应用程序默认是true的特别注意windows2008 服务器系统iis默认的是true 这样发布一下也是必须要做的
- Add more security in Visual Studio 2012
Compile flags: /GS: Stack protection from buffer overrun. /SDL: Subset of W3&W4 security warning ...
- Android 多个include标签的监听事件处理
include标签的作用是为了xml文件代码的模块化,详细不再多提.主要是说说include标签的监听. 网上也有很多例子,不过大多是只写了一个include标签的监听,如果需要实现多个include ...
- nginx日志格式来分析网站访问速度与瓶颈
参考地址:http://www.ttlsa.com/nginx/nginx-modules-ngx_http_log_request_speed/ 查看nginx 安装模块和配置 /usr/local ...
- cmd输出的日志里有中文乱码的解决办法
在命令行使用adb logcat命令直接输出日志中文内容显示乱码,原因是中文系统中cmd命令行窗口默认的编码是GBK,而LogCat打印的日志是UTF-8编码,所以adb logcat命令输出的中文内 ...