自定义RPC

207 阅读5分钟
  • 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