【Netty】初识Netty
一、为什么会出现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的更多相关文章
- DotNetty网络通信框架学习之初识Netty
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Netty1:初识Netty
为什么使用Netty Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性.可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明.对于为什么使用Netty这个话 ...
- Netty(一):初识Netty
Netty是什么? Netty是由JBOSS提供的一个java开源框架. Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 封装了JDK底 ...
- Netty:初识Netty
前文总结了NIO的内容,有了NIO的一些基础之后,我们就可以来看下Netty.Netty是Java领域的高性能网络传输框架,RPC的技术核心就是网络传输和序列化,所以Netty给予了RPC在网络传输领 ...
- 【Netty】Netty入门之WebSocket小例子
服务端: 引入Netty依赖 <!-- netty --> <dependency> <groupId>io.netty</groupId> <a ...
- Netty学习——Netty和Protobuf的整合(二)
Netty学习——Netty和Protobuf的整合(二) 这程序是有瑕疵的,解码器那里不通用,耦合性太强,有两个很明显的问题,但是要怎么解决呢?如:再加一个内部类型 Person2,之前的代码就不能 ...
- Netty学习——Netty和Protobuf的整合(一)
Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...
- [Netty 1] 初识Netty
1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架. Netty项目地址:htt ...
- Netty 学习 一、初识Netty【原创】
在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...
- 初识Netty
我们已经了解了Socket通信/IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识,其实我们之前所学习的仅仅是一个模型,如果想把这些真正的用于实际工作中去,其实我们之前所学习的仅仅是一个模型 ...
随机推荐
- git手册查询
1.创建版本库 通过git init命令把此目录变成Git可以管理的仓库; 添加文件到Git仓库,分两步 第一步:git add <file>,注意,可反复多次使用,添加多个文件:例如 g ...
- python总结二
1.在命令行:dd是删除光标所在的那一整行 yy是复制光标所在的那一整行 p是将已复制的数据在光标的下一行粘贴 P是将已复制的数据在光标的上一行粘贴 2.在命令行中查找的话 从上往下查找:/ 从下往上 ...
- 特征值、特征向量与PCA算法
一.复习几个矩阵的基本知识 1. 向量 1)既有大小又有方向的量成为向量,物理学中也被称为矢量,向量的坐标表示a=(2,3),意为a=2*i + 3*j,其中i,j分别是x,y轴的单位向量. 2)向量 ...
- sizeof 计算 struct 占字节数的方法总结
矛盾焦点: 1.结构体的内存对齐方式 字节对齐的目的: 1.提高CPU存储变量的速度 计算的核心点(默认对齐方式): 1.结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数 ...
- 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
SpringBoot 整合 Mybatis 有两种常用的方式,一种就是我们常见的 xml 的方式 ,还有一种是全注解的方式.我觉得这两者没有谁比谁好,在 SQL 语句不太长的情况下,我觉得全注解的方式 ...
- Expect Command And How To Automate Shell Scripts Like Magic
In the previous post, we talked about writing practical shell scripts and we saw how it is easy to w ...
- Maven 教程(6)— Maven之pom.xml文件简单说明
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79543963 通过前面几部分知识,我们对maven已经有了初步的印象,就像Mak ...
- Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)
一.说明 1.1 说明 前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-s ...
- FLASK-SQLALCHEMY如何使用or和and条件进行组合查询
FLASK-SQLALCHEMY如何使用or和and条件进行组合查询 http://www.cherishlau.site/2018/03/29/flask-sqlalchemy-use-or-and ...
- NPOI导出 The maximum column width for an individual cell is 255 characters
增加如下代码 ) { arrColWidth[column.Ordinal] = ; } //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidt ...