netty(已完结)
2019-11-27 10:09:42 6 举报
AI智能生成
Netty教程
作者其他创作
大纲/内容
NIO入门
传统的BIO
伪异步I/O编程
NIO编程
NIO类库简介
缓冲区Buffer
通道Channel
多路复用器<b>Selector</b>
NIO Server<br>
客户端关闭的时候会抛异常<br>
selector.select();阻塞,那为什么说nio是非阻塞的IO
SelectionKey.OP_WRITE
一个NIO是不是只能有一个selector
selector是不是只能注册一个ServerSocketChannel
一个Thread+队列=一个单线程线程池 = > 线程安全的,任务时线程串行执行的<br>
对象池
对象组
客户端的实现
单客户端<br>
Client
ClietnHandler
单客户单多连接
MultClient
ClientHandler
Start
服务端的实现
Server
ServerHandler
使用场景<br>
分布式进程通信
hadoop<br>
dubbo
akka
游戏服务器开发<br>
两台机器是怎样通信的?
netty线程模型
netty默认模式
netty架构
netty 组件<br>
Bootstrap
EventLoop
Channel
Channel接口
状态查询<br>
ChannelPipeline
ChannelHandler
ChannelHandlerContext
netty心跳
idleStateHandler
服务端
客户端<br>
TCP粘包/拆包问题的解决之道
发生原因<br>
粘包
分包
解决策略<br>
消息定长
在包尾增加回车换行符进行分割,例如FTP协议
将消息分为消息头和消息体
更复杂的应用层协议
Netty默认提供的解决方案
LineBasedFrameDecoder+StringDecoder
DelimiterBasedFreameDecoder
FixedLengthFrameDecoder
自定义数据包<br>
请求编码器<br>
请求解码器
响应编码器<br>
响应解码器<br>
编解码技术<br>
java序列化的目的
网络传输
对象持久化
序列化协议基础<br>
基于NIO的序列化
基于Netty的序列化
java原始对象序列化
评判一个编解码框架的优劣<br>
是否支持跨语言,支持的语言种类是否丰富
编码后的码流大小
编解码的性能
类库是否小巧,API 使用是否方便<br>
使用者需要手动开发的工作量和难度
主流的编解码框架
Google Protobuf<br>
特点<br>
结构化数据存储方式(XML,JSON等)
高效的编解码性能<br>
语言无关
官方支持Java、C++ 和 Python三种语言<br>
Facebook的Thrift
支持的编解码方式<br>
通用的二进制编码器
压缩二进制编解码
优化的可选 字段压缩编解码<br>
JBoss Marshalling<br>
优点<br>
可插拔的 类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制<br>
可插拔的对象替换技术,不需要通过继承的方式
可插拔的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能
无需实现java.io.Serializable接口,即可实现Java序列化
通过缓存技术提升对象的序列化性能
jar包下载<br>
MarshallingCodeCFactory
服务端开发<br>
客户端开发<br>
Future和Promise
Future功能
ChannelFuture
私有协议的开发<br>
传统java 应用中节点通信方式<br>
通过RMI进行远程服务调用
通过JAVA的Socket+Java序列化的方式进行跨节点调用
利用一些开源的RPC框架进行远程服务调用,例如:Facebook de Thrift 、Avro<br>
利用标准的公有协议进行跨节点服务调用,例如HTTP+XML、HTTP+JSON 或者WebService<br>
子主题
Netty 之Http协议应用实践<br>
什么是Http协议<br>
Http交互过程
传输数据
交换数据<br>
<br>
Http协议内容组成
请求方法<br>
请求头
响应头
响应状态
基于Netty实现Http协议过程分析<br>
Http协议分为三部分
远程数据传输
报文编解码
业务处理
实现HTTP协议的方式
基于容器
Tomcat
Jetty<br>
Jboss
netty
JDK自带http
HTTP压缩类型
<span style="color:rgb(0,0,0);">压缩需要客户端,服务器端同时支持。在chrome中,请求默认会加上Accept-Encoding: gzip, deflate,客户端默认开启数据压缩。而tomcat默认关闭压缩,如果开启需要增加配置。</span>
<span style="color:rgb(0,0,0);">在请求时,需要通过header的Accept-Encoding: gzip, deflate 来告诉服务器客户端支持的压缩类型。</span>
<span style="color:rgb(0,0,0);">在返回时,http server会在返回的header中添加Content-Encoding: gzip 来告诉客户端数据的压缩方式。</span>
<span style="color:rgb(0,0,0);">压缩类型主要包含如下几种:</span>
gzip
compress
deflate
identity
netty实现过程分析
建立连接读取消息流
解码Request
业务处理<br>
编码Response
返回消息关闭连接<br>
HttpObjectAggregator解码器
Http chunked 介绍<br>
背景 <br>
Content-Length描述
chunked描述
chuncked协议<br>
优点<br>
假如body的长度是10K,对于Content-Length则需要申请10K连续的buffer,而们对于Transfer-Encoding:chunked可以申请1K的空间,然后循环使用10次,节省了内存空间的开销。<br>
如果内容的长度不可知,则可使用trunked方式能有效的解决Content-Length的问题
http服务器压缩可以采用分块压缩,而不是整个块压缩。分块压缩可以一边进行压缩,一边发送数据,来加快数据的传输时间
缺点
trunked协议解析比较复杂
在http转发的情景下(比如nginx)难以处理,比如如何对分块数据进行转发
简单HTTP实现<br>
HTTP协议实现的抽象
request的流程处理
response的流程处理
压缩实现
简单实现的代码
弹幕系统设计<br>
特点
<b>实时性高</b>:你发我收,毫秒之差
<b>并发量大</b>:一人吐槽,万人观看<br>
业务架构
实现代码
WebsocketDanmuServer
WebsocketDanmuServerInitializer
TextWebSocketFrameHandler
HttpRequestHandler
netty之WebSocket协议应用
实现web版的聊天室<br>
Ajax轮询去服务器取消息
Flash XMLSocket<br>
webSocket简介
特点<br>
单一TCP长连接,采用全双工通信模式
对代理、防火墙透明
无头部信息、消息更简洁
通过ping/pong来保活
服务器可以主动推送消息给客户端,不再需要客户轮询
webSocket在浏览器中的使用
spring+netty+websocket
添加jar包<br>
AfterSpringBegin
Constant<br>
WebSocketServer
WebSocketChildChannelHandler
WebSocketServerHandler<br>
BaseWebSocketServerHandler
applicaiton-netty.xml
jsp页面
0 条评论
下一页