一、为什么会出现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. c++隐式转换(implicit conversion)

    1.缘由 最近在使用nlohmann的json,发现有些地方不是特别好用,所以就想自己修改一下(目的是为了增加类似jsoncpp中可以//增加注释的功能),在看源码的时候看到了一个迷惑的地方,就是解析 ...

  2. highcharts实现组织机构的点击选中和取消选中事件

    代码   Highcharts.chart('container', { chart: { height: 600, inverted: true }, title: { text: 'Highsof ...

  3. Azure容器监控部署(下)

    上文已经基本完成了环境的搭建,prometheus可以以https的方式从node_exporter和cAdvisor上pull到数据,访问grafana时也可以以https的方式访问,安全性得到了一 ...

  4. linux下ELK搭建好之后配置sentinl插件,进行邮件告警

    ELK的环境搭建好之后,如何利用收集到的数据进行数据告警呢?在破解ELK之后,它本身提供一个监视器功能,配置偏向编写脚本.有一个更加方便的插件sentiel. 一.下载并安装sentinl插件 htt ...

  5. c# 大白话告诉你Thread的Sleep和Join的区别

    我们的程序默认会有两个线程,一个是主线程,一个是负责垃圾回收的线程.如果代码不使用多线程,就只有主线程这一条干道.1.在主线程中调用Thread.Sleep(1000),表示主线程阻塞自己1秒.2.在 ...

  6. 词向量实践(gensim)

    词向量训练步骤: 分词并去停用词 词频过滤 训练 项目完整地址:https://github.com/cyandn/practice/tree/master/Word2Vec gensim中Word2 ...

  7. [转帖]spring、springMvc、springBoot和springCloud的联系与区别

    spring.springMvc.springBoot和springCloud的联系与区别 -- :: 尘光掠影 阅读数 文章标签: springspringmvcspringbootspringCl ...

  8. 利用Travis IC实现Hexo博客自动化部署

    1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...

  9. docker搭建etcd集群环境

    其实关于集群网上说的方案已经很多了,尤其是官网,只是这里我个人只有一个虚拟机,在开发环境下建议用docker-compose来搭建etcd集群. 1.拉取etcd镜像 docker pull quay ...

  10. SQL系列(二)—— 查询(select)

    在开始之前先了解下SQL中的操作分类.根据与数据库不同操作的交互,对数据不同的处理类型,可以将SQL分为四种:插入.删除.修改.查询.本篇文章中主要介绍查询操作.其实查询操作也是日常应用使用最为频繁且 ...