- bio问题
- 1.每个请求都要独立线程
- 2.并发数较大时,需要创建大量线程,占用资源
- 3.阻塞线程,浪费资源
- 适用连接数较少的
- NIO:同步非阻塞
- 多路复用器
- 聊天服务器,弹幕系统,服务器之间通讯
- AIO
- 消息异步通知
- 连接多且长,如相册服务器等
- NIO编程
- 三大核心:Channel通道,BUffer缓冲区,Selector选择器
- Buffer
- get()读取数据
- filp()切换读模式,设置position位置
- clear()设置positon和limit
- rewind()重置最开始读取
- Channel接口
- ServerSocketChannel
- 1.打开通道
- 2.设置IP和端口
- 3.写出数据
- 4.读取服务器写回的数据
- 5.释放资源
- SocketChannel(客户端)
- 1.打开通道
- 2.设置IP和端口
- 3.写出数据
- 4.读取服务器写回的数据
- 5.释放资源
- Selector(选择器)
- 没有选择器的情况下,在客户端连接后,不能马上发送消息,会阻塞
- 监听服务端连接事件,得到客户端通道,然后监听客户端读写事件
- SelectionKey监听4种事件
- 1.连接继续事件
- 2.连接就绪事件
- 3.读事件
- 4.写事件
- Netty核心
- 原生NIO存在的问题:
- 1.NIO类库和API繁杂
- 2.需要十分熟悉JAVA多线程,因为NIO涉及到Reactor模式
- 3.开发工作量难度大,例如断连重连,网络闪断,半包读写,失败缓存,网络堵塞等问题
- 4.NIO BUG。Epoll bug会导致selector空轮训,导致CPU100%
- Netty是JBOSS提供,ES和DUBBO都用了Netty
- 线程模型
- Reactor模式:IO复用监听事件
- 1.单线程reactor
- 优点:模型简单,
- 缺点:无法发挥多核CPU,可靠性问题
- 2.单reactor多线程
- 优点:利用多核CPU能力
- 缺点:模型复杂,容易有并发问题
- 3.主从Reactor多线程
- 优点;职责明确,支持高并发
- 缺点:编程复杂度高
- 1+M+N模式,在Nginx,Memcached,netty等应用
- Netty线程模型
- BossGroup
- 1.selector
- 2.processselectedkeys
- 3.runalltasks
- WorkGroup
- 1.selector
- 2.processselectedkeys
- 3.runalltasks
- Netty开发要自定义handler实现channelhandle或者子接口或实现类重写方法
- 1.通道就绪事件
- 2.通道读取数据事件
- 3.数据读取完毕事件
- 4.通道发生异常事件
- ChannelPipeline是handler集合
- Netty实现
- 服务端
- 1.创建Bossgroup处理连接事件
- 2.创建Workgroup处理读写事件
- 3.创建服务端启动助手
- 4.设置Bossgroup和workgroup线程组
- 5.设置服务端通道实现为NIO
- 6.参数设置
- 7.创建一个通道初始化对象
- 8.想Pipeline中添加自定义业务处理Handlder
- 9.启动服务端并且绑定端口,将异步改为同步
- 10关闭通道(设置同步监听通道关闭的状态)和连接池
- 客户端
- 1.创建线程组
- 2.创建客户端启动助手
- 3.设置线程组
- 4.设置客户端通道实现为NIO
- 5.创建一个通道初始化对象
- 6.向pipeline中添加自定义handler
- 7.启动客户端
- 8、关闭通道和连接池
- Netty都是异步操作,返回channelFuture对象可以添加监听器监听异步操作事件
- Netty编解码器
- java称之为序列化
- java序列化缺点:无法跨语言,流大,性能低
- 自定义编解码器继承接口,在handler中配置
- WebSocket和http的区别
- websocket是多路复用,可以减少多余信息,服务端可以主动向客户端发消息
- 粘包和拆包
- TCP会把数据流拆分,如果包比较小会合并在一起粘包,如果数据包较大,会拆包,因为数据需要经过操作系统的缓冲区
- 解决:
- 1.消息长度固定
- 2.换行符
- 3.特殊分隔符
- 4.表示消息长度
- Netty提供粘包和拆包的解码器
- 自定义RPC
- 1.创建一个借口,定义抽象方法
- 2.创建一个提供者。监听消费者的请求
- 3.创建一个消费者,调用自己不存在的方法,使用netty通讯
- 4.提供者于消费者数据传输使用json
- 5.提供者使用netty继承spring boot
- 分布式系统架构
- 强一致性,弱一致性,最终一致性
- CAP定理
- 1一致性2.可用性3.分区容错性
- 分布式系统不可能同时满足三点
- BASE理论
- 两阶段提交协议2PC:比较常用的分布式事务问题解决方式
- 阶段一:事务询问,执行事务不提交,返回成功
- 阶段二:提交或者回滚事务
- 问题:
- 1.同步阻塞2.单点问题3.数据不一致4.过于保守
- 三阶段提交协议3PC:可超时
- 阶段一:协调器发送是否可以提交事务
- 阶段二:预提交
- 阶段三:提交或者回滚事务(如果超时自动提交)
- NWR协议:一致性协议
- N:数据副本,W;写节点,R;读节点
- R+W>N就是强一致性
- Gossip协议:一致性协议,AP场景,如redis cluster
- 反伤传播和谣言传播
- 优点:1.扩展性2.容错3.去中心化4.最终一致性
- 缺点:1.消息延迟2.消息冗余
- Paxos协议
- Lease机制
- 证书有效期
- 心跳检测
- 高可用
- 1.主备
- Master/slave
- 2.互备
- 多个master
- 3.集群
- zuul和nginx解决跨域,网关请求转发
- zk分布式锁
- 1.创建一个mylock目录
- 2.在mylock创建顺序节点
- 3.获取mylock目录下所有子节点,然后获取比自己小的节点吗,如果不存在,则获得锁
- 4.线程b判断不是最小,监听最小节点状态
- 服务肖峰(消息队列或者流量漏斗)
- CDN过滤静态资源
- 缓存过滤
- 程序过滤
- 服务降级
- 服务限流
- 1.计数器
- 2.窗口计数
- 3.漏桶
- 4.令牌桶
- 服务熔断:spring cloud hystrix/sentinel