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