Netty知识点梳理
2023-12-26 18:57:17 22 举报
AI智能生成
Netty知识点梳理
作者其他创作
大纲/内容
Java原生提供
BIO
NIO
组成
Channel
表示 IO 源与目标打开的连接,是双向的,但不能直接访问数据,只能与Buffer 进行交互
FileChannel的read方法和write方法都导致数据复制了两次!
Buffer
与Channel进行交互,数据是从Channel读入缓冲区,从缓冲区写入Channel中的
方法
flip方法
clear方法
rewind方法
直接缓冲区(DirectByteBuffer)可减少一次系统空间到用户空间的拷贝。
直接缓冲区主要分配给那些易受基础系统的本机I/O 操作影响的大型、持久的缓冲区。
如果数据量比较小的中小应用情况下,可以考虑使用heapBuffer,由JVM进行管理。
直接缓冲区主要分配给那些易受基础系统的本机I/O 操作影响的大型、持久的缓冲区。
如果数据量比较小的中小应用情况下,可以考虑使用heapBuffer,由JVM进行管理。
Buffer创建和销毁的成本更高,不可控,通常会用内存池来提高性能。
Selector
可使一个单独的线程管理多个Channel
方法
open方法:可创建Selector
register方法:向多路复用器注册通道,可以监听的事件类型:读、写、连接、accept;
注册事件后会产生一个SelectionKey:它表示SelectableChannel 和Selector 之间的注册关系
注册事件后会产生一个SelectionKey:它表示SelectableChannel 和Selector 之间的注册关系
wakeup方法:使尚未返回的第一个选择操作立即返回
建立过程
1.Selector.open():打开一个Selector;
2.ServerSocketChannel.open():创建服务端的Channel;
3.bind():绑定到某个端口上。并配置非阻塞模式;
4.register():注册Channel和关注的事件到Selector上;
5.select()轮询拿到已经就绪的事件
2.ServerSocketChannel.open():创建服务端的Channel;
3.bind():绑定到某个端口上。并配置非阻塞模式;
4.register():注册Channel和关注的事件到Selector上;
5.select()轮询拿到已经就绪的事件
AIO
IO模型
序列化
影响序列化性能的关键因素
序列化后的码流大小(网络带宽的占用)
序列化的性能(CPU资源占用)
是否支持跨语言(异构系统的对接和开发语言切换)
xml方式
优点
人机可读性好,可指定元素或特性的名称
缺点
序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息
只能序列化公共属性和字段;不能序列化方法
文件庞大,文件格式复杂,传输占带宽
适用场景
当做配置文件存储数据,实时数据转换
JSON
优点
兼容性高、数据格式比较简单,易于读写、序列化后数据较小,可扩展性好,兼容性好、与XML相比,其协议比较简单,解析速度比较快
缺点
数据的描述性比XML差、不适合性能要求为ms级别的情况、额外空间开销比较大
适用场景
跨防火墙访问、可调式性要求高、基于Web browser的Ajax请求、传输数据量相对小,实时性要求相对低(例如秒级别)的服务
JDK Serializer
无法跨语言、序列化后的码流太大、序列化的性能差
不支持跨语言
FST
缺点
只争对Java,不跨语言
优点
序列化速度时JDK的10倍
序列化结果时JDK看的1/3
语法及其简洁
kryo
基于protobuf协议,只支持java语言,需要注册(Registration),然后序列化(Output),反序列化(Input)
缺点
主要支持Java
优点
同FST样,使用简单,配置灵活
性能和FST相差不多
Fastjson
采用一种“假定有序快速匹配”的算法
优点
接口简单易用、目前java语言中最快的json库
缺点
过于注重快,而偏离了“标准”及功能性、代码质量不高,文档不全
适用场景
协议交互、Web输出、Android客户端
Thrift
不仅是序列化协议,还是一个RPC框架
优点
序列化后的体积小, 速度快、支持多种语言和丰富的数据类型、对于数据字段的增删具有较强的兼容性、支持二进制压缩编码
提供丰富的语言支持
缺点
使用者较少、跨防火墙访问时,不安全、不具有可读性,调试代码时相对困难、不能与其他传输层协议共同使用(例如HTTP)、无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议
适用场景
分布式系统的RPC解决方案
Avro
Hadoop的一个子项目,解决了JSON的冗长和没有IDL的问题
优点
支持丰富的数据类型、简单的动态语言结合功能、具有自我描述属性、提高了数据解析速度、快速可压缩的二进制数据形式、可以实现远程过程调用RPC、支持跨编程语言实现
缺点
对于习惯于静态类型语言的用户不直观
适用场景
在Hadoop中做Hive、Pig和MapReduce的持久化数据格式
Protobuf
将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性
优点
序列化后码流小,性能高、结构化数据存储格式(XML JSON等)、通过标识字段的顺序,可以实现协议的前向兼容、结构化的文档更容易管理和维护
缺点
需要依赖于工具生成代码、支持的语言相对较少,官方只支持Java 、C++ 、python、Go、C#
适用场景
对性能要求高的RPC调用、具有良好的跨防火墙的访问属性、适合应用层对象的持久化
protostuff
基于protobuf协议,但不需要配置proto文件,直接导包即可
Jboss marshaling
可以直接序列化java类, 无须实java.io.Serializable接口
Message pack
一个高效的二进制序列化格式
Hessian
采用二进制协议的轻量级remoting onhttp工具
缓冲区
内存中预留指定大小的存储空间用于对IO的数据作临时存储
优点
减少实际的物理读写次数
内存区域重复使用,减少了动态分配/关闭内存的次数
服务器推送技术
Ajax短轮询
实现机制
用一个定时器不停的去网站上请求数据
优点
服务端基本不用改造
服务器内存较友好,不需要保持连接
缺点
服务器沉重压力和资源的浪费
数据同步不及时
Comet
实现机制
基于 HTTP长连接、无须在浏览器端安装插件的“服务器推”技术
基于 AJAX 的长轮询(long-polling)方式
服务器端会阻塞请求直到有数据传递或超时才返回。
客户端JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
应用
Spring带来的DeferedResult
Servlet3里的异步任务
基于iframe及htmlfile流的方式
服务器推送事件 Server-sent-events(SSE)
原理
严格地说,HTTP 协议无法做到服务器主动推送信息。
但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。
也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。
这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。
本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。
但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。
也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。
这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。
本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。
是 HTML 5 规范中的一个组成部分
SSE 是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息,则需要一个新的 HTTP 请求。
SSE适用于更新频繁、低延迟并且数据都是从服务端到客户端。
文本协议
优点
SSE 使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。
SSE 属于轻量级,使用简单;WebSocket 协议相对复杂。
SSE 默认支持断线重连,WebSocket 需要自己实现。
一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
SSE 支持自定义发送的消息类型。
WebSocket
借用了HTTP的协议来完成一部分握手
实现比SSE负载,适用于需要进行复杂双向数据通讯的场景
二进制协议
特点
HTML5中的协议,实现与客户端与服务器双向通道,基于消息的文本或二进制数据通信
适合于对数据的实时性要求比较强的场景,如通信、直播、共享桌面,特别适合于客户与服务频繁交互的情况下,如实时共享、多人协作等平台。
采用新的协议,后端需要单独实现
客户端并不是所有浏览器都支持
全双工,可以进项双向的数据传输
简单(流)文本定向消息协议
STOMP
STOMP
STOMP协议的前身是TTMP协议(一个简单的基于文本的协议),专为消息中间件设计。是属于消息队列的一种协议, 和AMQP, JMS平级. 它的简单性恰巧可以用于定义websocket的消息体格式. STOMP协议很多MQ都已支持, 比如RabbitMq, ActiveMq。
生产者(发送消息)、消息代理、消费者(订阅然后收到消息)
STOMP是基于帧的协议
网络协议
0 条评论
下一页