一、为什么会出现Netty

  之前我们使用通用的应用程序或库来相互通信。例如,我们经常使用HTTP客户机库从web服务器检索信息,并通过web服务调用远程过程调用。然而,通用协议或其实现有时伸缩性不是很好。这就像我们不使用通用HTTP服务器来交换大型文件、电子邮件消息和近乎实时的消息(如财务信息和多人游戏数据)一样。所需要的是专门用于特定目的的高度优化的协议实现。例如,您可能希望实现一个针对基于ajax的聊天应用程序、媒体流或大型文件传输进行优化的HTTP服务器。您甚至可能想要设计和实现一个完全适合您需要的新协议。另一个不可避免的情况是,您必须处理遗留的专有协议,以确保与旧系统的互操作性。在这种情况下,重要的是在不牺牲结果应用程序的稳定性和性能的情况下,我们能够多快地实现该协议。

  那么,Netty的出现,就能很好的解决上面的问题;

  

二、Netty是什么

  Netty项目致力于提供异步事件驱动的网络应用程序框架和工具,以便快速开发可维护的高性能和高可伸缩性协议服务器和客户端。

  换句话说,Netty是一个NIO客户机服务器框架,它支持快速而简单地开发协议服务器和客户机等网络应用程序。它大大简化和流线网络编程,如TCP和UDP套接字服务器的开发。

  “快速而简单”并不意味着最终的应用程序会出现可维护性或性能问题。Netty经过精心设计,从实现许多协议(如FTP、SMTP、HTTP)和各种二进制和基于文本的遗留协议中吸取了经验。因此,Netty成功地找到了一种方法,在不妥协的情况下实现开发、性能、稳定性和灵活性。

  一些用户可能已经找到了其他声称具有相同优势的网络应用程序框架,您可能想知道是什么使Netty与它们如此不同。答案是它所基于的哲学。Netty旨在从第一天起就为您提供最舒适的API和实现体验。它并不是什么有形的东西,但是当你阅读Netty官方指南并与Netty玩耍时,你会意识到这种哲学会让你的生活变得更容易。

三、Netty相关的其他概念

/**
* @author zhangboqing
* @date 2018/8/29
*
* 关于netty ,首先要搞清楚,这是建立在客户端和服务端之间的。
* 服务端建立相应的规则,然后运行起来,等待客户端访问或者发送”消息“
*
* 服务端的建立
* 第一步:先建立相应的规则 ==> DiscardServerHandler
* 第二步:我们需要应用相应的规则。就是说,我们建立了接收消息的规则,但是光建立规则有什么用,仅仅只是一个规则,我们需要把这个规则”应用“起来,通常就是我们通常的”运行“;==>DiscardServer
* 第三步:我们现在相应的规则已经建立,并且”运行“规则的代码也OK,所以运行DiscardServer中 public static void main(String[] args) 启动服务端。
*
* 客户端访问
* 打开命令行窗口,键入 telnet 127.0.0.1 8080 回车,进入telnet 终端
* 然后随便输入回车,服务端就会打印你输入的数据
*/
package com.zbq.simpledemo; /**
*
*
* netty 官方API: http://netty.io/4.1/api/index.html
* netty 中文指南:https://waylau.com/netty-4-user-guide/
*
*
* 关于NIO基础的知识:https://my.oschina.net/andylucc/blog/614295
*
*    http://www.cnblogs.com/dolphin0520/p/3919162.html 
*
*    http://blog.csdn.net/wuxianglong/article/details/6604817
*
*/ /**
* netty 特点:
* 1.并发高
* Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高
* 2.传输快
* Netty使用了NIO中的一大特性——零拷贝,利用直接内存对数据进行操作,从而加快了传输速度
* 3.封装好
*
*
* Channel
* 数据传输流,与channel相关的概念有四个:
*
* Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
* 一个客户端与服务器通信的通道
* ChannelHandler,核心处理业务就在这里,用于处理业务请求。
* 业务逻辑处理器,分为ChannelInboundHandler 输入数据处理器
* 和ChannelOutboundHandler 输出业务处理器
* 通常情况下,业务逻辑都是存在于ChannelHandler之中
* ChannelHandlerContext,用于传输业务数据。
* 通信管道的上下文
* ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。
* 用于存放ChannelHandler的容器
*
* 他们的交互流程是:
*
* 1.事件传递给 ChannelPipeline 的第一个 ChannelHandler
* 2.ChannelHandler 通过关联的 ChannelHandlerContext 传递事件给 ChannelPipeline 中的 下一个
*
* Buffer
* 他有三种使用模式:
* 1.Heap Buffer 堆缓冲区
* 堆缓冲区是ByteBuf最常用的模式,他将数据存储在堆空间。
* 2.Direct Buffer 直接缓冲区
* 直接缓冲区是ByteBuf的另外一种常用模式,他的内存分配都不发生在堆,jdk1.4引入的nio的ByteBuffer类允许jvm通过本地方法调用分配内存,这样做有两个好处
* 通过免去中间交换的内存拷贝, 提升IO处理速度; 直接缓冲区的内容可以驻留在垃圾回收扫描的堆区以外。
* DirectBuffer 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响.
* 3.Composite Buffer 复合缓冲区
* 复合缓冲区相当于多个不同ByteBuf的视图,这是netty提供的,jdk不提供这样的功能。
*
*
* Codec
* Netty中的编码/解码器,通过他你能完成字节与pojo、pojo与pojo的相互转换,从而达到自定义协议的目的。
* 在Netty里面最有名的就是HttpRequestDecoder和HttpResponseEncoder了
*/

  

【Netty】初识Netty的更多相关文章

  1. DotNetty网络通信框架学习之初识Netty

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  2. Netty1:初识Netty

    为什么使用Netty Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性.可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明.对于为什么使用Netty这个话 ...

  3. Netty(一):初识Netty

    Netty是什么? Netty是由JBOSS提供的一个java开源框架. Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 封装了JDK底 ...

  4. Netty:初识Netty

    前文总结了NIO的内容,有了NIO的一些基础之后,我们就可以来看下Netty.Netty是Java领域的高性能网络传输框架,RPC的技术核心就是网络传输和序列化,所以Netty给予了RPC在网络传输领 ...

  5. 【Netty】Netty入门之WebSocket小例子

    服务端: 引入Netty依赖 <!-- netty --> <dependency> <groupId>io.netty</groupId> <a ...

  6. Netty学习——Netty和Protobuf的整合(二)

    Netty学习——Netty和Protobuf的整合(二) 这程序是有瑕疵的,解码器那里不通用,耦合性太强,有两个很明显的问题,但是要怎么解决呢?如:再加一个内部类型 Person2,之前的代码就不能 ...

  7. Netty学习——Netty和Protobuf的整合(一)

    Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...

  8. [Netty 1] 初识Netty

    1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架. Netty项目地址:htt ...

  9. Netty 学习 一、初识Netty【原创】

    在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...

  10. 初识Netty

    我们已经了解了Socket通信/IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识,其实我们之前所学习的仅仅是一个模型,如果想把这些真正的用于实际工作中去,其实我们之前所学习的仅仅是一个模型 ...

随机推荐

  1. VueCli3新特性

    升级VueCli3的理由: 1.构建速度大大加快,之前看到一个升级的例子是2的3倍速度,具体可以在自己迁移一个项 目测试下,这里的优化有默认开启了多核构建.缓存 并行和缓存 2.webpack被内置到 ...

  2. vue+element table的弹窗组件

    在处理表格编辑相关的需求,是需要做一个弹框进行保存的:或者查看表格数据的详细信息时,也是需要做弹窗: 当然 ,这是类似于这样的 ,当然 element 已经帮我们做好 弹窗这一块 主要 我想记录的是 ...

  3. Java 并发系列之十:java 并发框架(2个)

    1. Fork/Join框架 2. Executor框架 3. ThreadPoolExecutor 4. ScheduledThreadPoolExecutor 5. FutureTask 6. t ...

  4. Thrift源码分析(二)-- 协议和编解码

    协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议 ...

  5. 记一次Pr字幕模糊问题及解决方法

    目录 问题: 解决: 问题: 1.导出视频后,发现字幕很模糊 2.发现我们导出时的设置如下图,画面大小为432x244 3.即使暴力修改宽度为1080,导出画面的清晰度也不会有什么变化. 解决: 1. ...

  6. 解决myeclipse2017 properties中文被Unicode编码

    输入:http://propedit.sourceforge.jp/eclipse/updates/ 在线安装插件解决.

  7. [转帖]How long does it take to make a context switch?

    How long does it take to make a context switch?   FROM: http://blog.tsunanet.net/2010/11/how-long-do ...

  8. Akka-CQRS(7)- CQRS Reader Actor 示范

    我们在这篇通过一个具体CQRS-Reader-Actor的例子来示范akka-persistence的query端编程和应用.在前面的博客里我们设计了一个CQRS模式POS机程序的操作动作录入过程,并 ...

  9. ubuntu18 docker中部署ELK

    ELK是ElasticSearch.Logstash.Kibana的简称,一般用于日志系统,从日志收集,日志转储,日志展示等入手,用以提供简洁高效的日志处理机制. 鉴于没有额外的机器,这里就用dock ...

  10. bootstrap使用笔记

    本文翻译自[http://getbootstrap.com/2.3.2/scaffolding.html#gridSystem] 1.需要在H5的文档声明中使用: 2.如下一个简单的两列布局,先添加一 ...