原生NIO存在的问题

  1. NIO的类库和API复杂, 使用麻烦: 需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。
  2. 需要具备其他的额外技能: 比如: Java多线程编程, 由于NIO编程设计到Reactor模式, 程序员必须对多线程和网络编程非常熟悉, 才能编写出高质量的NIO程序。
  3. 开发工作量和难度都非常大: 例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
  4. JDK NIO 的 Bug: 例如臭名昭著的 Epoll Bug, 它会导致Selector空轮询, 最终导致CPU 100%。直到JDK1.7 版本该问题仍然存在, 未被根本解决。

Netty官网说明

  • 官网: https://netty.io

  • Netty is an asynchronous event-driven network application framework
    for rapid development of maintainable high performance protocol servers & clients.

    • 翻译一下就是: Netty是一个异步的基于事件驱动的网络应用框架, 用于快速开发可控的高性能协议的服务端与客户端
  • 架构图

    • Core(核心):

      • Extensible Event Model: 可扩展的事件模型
      • Universal Communication API: 通用的通信API
      • Zero-Copy-Capable Rich Byte Buffer: 可以实现零拷贝的丰富的字节缓冲区
    • Transport Services(传输服务):
      • Socket & Datagram: Socket套接字 以及 Datagram(Spark 及 python中常见的数据格式)
      • HTTP Tunnel: HTTP 隧道
      • In-VM Pipe: 虚拟机管道
    • Protocol Support(协议支持):
      • HTTP & WebSocket
      • SSL(Secure Sockets Layer) StartTLS(能够让明文的通信连线直接成为加密连线, 而不需要使用另一个特别的端口来进行加密通信)
      • Google Protobuf (是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等, 在大数据领域也是常用的)
      • zlib/gzip Compression(zlib/gzip 压缩)
      • Large File Transfer(大文件传输)
      • RTSP(Real Time Streaming Protocol 实时流传输协议)
      • Legacy Text Binary Protocols with Unit Testability(具有单元可测试性的文本二进制协议)

Netty的优点

  • Netty对JDK自带的NIO的API进行了封装, 解决了原生NIO存在的问题。
  • 设计优雅: 适用于各种传输类型的统一API阻塞和非阻塞Socket; 基于灵活且可扩展的事件模型, 可以清晰地分离关注点;高度可订制的线程模型 - 单线程, 一个或多个线程池。
  • 使用方便: 详细记录的JavaDoc, 用户指南和是示例; 没有其他依赖项, JDK5(Netty 3.x) 或 6 (Netty 4.x) 就足够了。
  • 高性能、吞吐量更高: 延迟更低; 减少资源消耗; 最小化不必要的内存复制。
  • 安全: 完整的 SSL/TLS 和 StartTLS 支持。
  • 社区活跃、不断更新; 社区活跃, 版本迭代周期短, 发现的 Bug 可以被及时修复, 同时, 更多的新功能会被加入。

Netty的出现的更多相关文章

  1. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  2. 基于netty http协议栈的轻量级流程控制组件的实现

    今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...

  3. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  4. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  5. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  6. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  7. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

  8. 基于Netty打造RPC服务器设计经验谈

    自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...

  9. Netty构建分布式消息队列实现原理浅析

    在本人的上一篇博客文章:Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇 中,重点向大家介绍了AvatarMQ主要构成模块以及目前存在的优缺点.最后以一个生产者.消费者传递消息的例子, ...

  10. JAVA通信系列三:Netty入门总结

    一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhtt ...

随机推荐

  1. 4 JavaScript异常&debugger&保留关键字

    try:语句测试代码块错误 catch:语句处理错误,一般提供一个对象如catch(err)用来存储错误信息 throw: 语句创建自定义错误,抛出的信息可以被catch捕获 JavaScript错误 ...

  2. 【转】spring IOC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  3. 都客仿站高手已注册旗舰版V3.1

    链接:https://pan.baidu.com/s/1R5ldFDjekuXmEp42-8SQSQ 提取码:gkm9

  4. C语言入门---第九章 C语言指针

    没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...

  5. HTML标签,CSS简介

    一  http://www.w3school.com.cn/tags/tag_span.asp

  6. Nodejs 开发 随手记

    console.log(Object.prototype.toString.call(Now.toString())); //类型判断

  7. S7-300 符号IO域的组态 HMI变量指针化的方法以及应用,在一个IO域显示多个温度值的办法

    应用工业场景 例如需要测试很多个节点的温度值的时候,需要监控的位置很多,如果HMI的画面很小, 可以使用符号IO域和变量的间接寻址 符号IO域接近于VB中的combo 控件 实现上图的界面 : 上图界 ...

  8. JS数据统计表 highcharts.js的运用

    参考地址 http://www.runoob.com/highcharts/highcharts-column-basic.html 1.下载JS文件引入,或者用CDN function getCou ...

  9. Day2-C-迷宫问题 -POJ3984

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  10. 阿里RocketMq试用记录+简单的Spring集成

    CSDN学院招募微信小程序讲师啦 程序猿全指南,让[移动开发]更简单! [观点]移动原生App开发 PK HTML 5开发 云端应用征文大赛,秀绝招,赢无人机! 阿里RocketMq试用记录+简单的S ...