Netty
一、Netty基础
1、Netty架构
Netty三大组件:缓冲(buffer),通道(channel),事件模型(event
model)
2、Netty实现异步的两个方法
1)、回调
Netty JavaScript Node.js都使用了很多回调方法
2)、Futures
一个Future要么获得计算完的结果,要么获得计算失败后的异常。Java在java.util.concurrent包中附带了Future接口,它使用Executor异步执行。
3.Netty的聚合
4.Netty应用场景
1)分布式进程通信
例如: hadoop、dubbo、akka等具有分布式功能的框架,底层RPC通信都是基于netty实现的
2)游戏服务器开发
最新的游戏服务器有部分公司可能已经开始采用netty4.x 或 netty5.x
二、
1.NIO框架通信模式
1)线程模型方面的改变,一个线程维护一个客户端的线程模型变成了一个线程维护一个多路复用注册器,或多客户端过来之后客户端直接注册到多路复用注册器,一个线程在多路复用注册器上面轮询,然后获取一个事件KEY集合,然后在做业务处理
2)高速双向通道Channel,其实底层是封装SOCKET,但是这个读写/且能完成读写共存状态,都可以通过Channel完成,减少服务器开销,高速封装
3)byteBuffer:字节缓存
2.Netty框架(基于NIO框架封装)
第一:以为Reactor线程模型,会根据启动参数来决定最佳的线程调度方式。
主要使用于客户端连接,用于业务处理
第二:引入变种责任链,
Channel对应管道,它会将实际处理业务类编织起来,序列 双向链表形式 next pre 精细控制处理流程
第三:业务分离 调度和实际处理分离
三、源码剖析
boss:派发任务,客人给worker
worker线程:每个worker有8个,处理SockerChannel的连接事件,read/write等
Thread.start()子线程就绪
thread.run()主线程
轮询selector事件,事件有4种
NioWorker
task.run();
RPC框架:Dubbo ZooKeeper ElasticSearch
1.编解码
2.序列化协议 Protobuf协议
3.Netty心跳,粘包分包socket攻击
粘包:多个请求合成一个
分包:1个请求分成多个
序列化协议:对象序列化成二进制数组
数据包=包头+模块号+命令号+长度+数据
java对象
int,long,String
int 20
大端序列:先写高位
小端序列:
ObjectOutputStream 效率很低,因为:类名 类的描述 属性 数据长度 数据本身
ObjectInputStream