RPC框架深入剖析与设计实践

基础架构

奈学教育相关内容
在这里插入图片描述

01.RPC实现原理深入分析

RPC(Remote Procedure Call):远程过程调用,Remote Procedure Call Protocol它是一个计算机通信协
议。它允许像调用本地方法一样调用远程服务。由于不在一个内存空间,不能直接调用,需要通过网络来表
达调用的语义和传达调用的数据
1.RPC作用
屏蔽组包解包
l屏蔽数据发送/接收
l提高开发效率
l业务发展的必然产物
2.RPC核心组成
远程方法对象代理
l连接管理
l序列化/反序列化
l寻址与负载均衡
3.RPC调用方式
同步调用
l异步调用
RPC调用过程
在这里插入图片描述

02.精简版RPC调用代码实现

如果没有RPC框架支持,实现远程调用需要做哪些事
Client 端工作
Ø 建立与Server的连接
Ø 组装数据
Ø 发送数据包
Ø 接收处理结果数据包
Ø 解析返回数据包
Server 端工作
Ø 监听端口
Ø 响应连接请求
Ø 接收数据包
Ø 解析数据包,调用相应方法
Ø 组装请求处理结果数据包
Ø 发送结果数据包
设计“用户”服务
Ø 功能需求:用户信息管理—CRUD
Ø 调用方式:TCP长连接同步交互
Ø 协议:自定义协议

  • 接口设计
    Ø 注册
    bool addUser(User user)
    Ø 更新
    bool updateUser(long uid, User user)
    Ø 注销
    bool deleteUser(long uid)
    Ø 查询
    User Info getUser(long uid)
  • 序列化协议
    远程调用涉及数据的传输,就会涉及组包和解包,需要调用方和服务方约定数据格式——序列化协议
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

03.RPC服务消费方核心功能设计实现

RPC产品是什么样
仅仅实现远程调用是不够的,离产品化还有很长一段距离

数据传输 序列化/反序列化 客户端代理类实现 请求映射分发
仅此而已?作为RPC产品还需要哪些功能

Comsumer
Ø 连接管理
Ø 负载均衡
Ø 请求路由
Ø 超时处理
Ø 健康检查
Provider
Ø 队列/线程池
Ø 超时丢弃
Ø 优雅关闭
Ø 过载保护
Consumer功能分析
Ø 连接管理:保持与服务提供方长连接,用于传输请求数据也返回结果
Ø 初始化时机:网关连接下游系统非常多,程序启动时创建,这样程序启动比较慢,而且有的节点可以已经没有流量,启动就建立也有问题,浪费资源;可以使用懒加载模式,需要调用摸个模块时才建立连接
Ø 连接数维护
Ø 心跳/重连
在这里插入图片描述

  • 客户端线程模型
    阻塞等待:是工作线程在等待网络IO吗?工作线程不做发送接收数据,但工作线程确认是在等待,等待的是IO线程返回唤醒;一般都是工作线程把任务放队列,然后由IO线程获取队列任务发送任务,返回的数据也有IO接收然后放入队列并唤醒工作线程
    在这里插入图片描述

在这里插入图片描述

  • 负载均衡
    确保多个服务提供方节点流量均匀/合理,支持节点扩容与灰度发布
    Ø 轮训
    Ø 随机
    Ø 取模
    Ø 带权重
    Ø 一致性Hash
    在这里插入图片描述
    权重负载均衡设计
    Ø 权重0~10范围内取值
    Ø 值越大表示权重越高
    Ø 权重高分配流量比例大
    在这里插入图片描述
    权重负载均衡设计
    Ø 数据结构
    l 数组,根据权重值填充
    l 0,1的位置随机打乱
    Ø 算法描述
    l 负载均衡选出一个结点
    l 生成0~9之间随机值
    l 对应数组中的值
    • 0 使用该节点
    • 1 不使用该节点
    在这里插入图片描述
    也可以不生成随机值,直接轮训数组就可以,0使用该节点,1不使用就可以了;如果每次生成随机值就是计算型,消耗CPU,直接使用随机数组,轮训访问就可以解决
  • 轮询数组初始化
    Ø num表示1的个数
    Ø 随机填充数组
    在这里插入图片描述
  • 轮询+权重负载均衡实现
    Ø 轮询到某一Server结点
    Ø 根据权重再进行一次过滤
    Ø 轮询到下一结点
    在这里插入图片描述
    请求路由
    通过一系列规则过滤出可以选择的服务提供方节点列表,在应用隔离,读写分离,灰度发布中都发挥作用
  • 路由功能设计
    Ø 匹配规则
    Ø 行为
    Ø 链表
    在这里插入图片描述
  • 路由功能设计实现
    Ø 规则描述
    l 待比较属性
    l 运算符
    l 属性匹配值
    l 匹配结点
    Ø 数据结构设计
    l 链表(filter过滤器)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    超时处理
    对于长时间没有返回的请求,需要作出异常处理,及时释放资源
    在这里插入图片描述
    调用方超时处理
    Ø 工作线程阻塞位置
    l 等待回包通知
    Ø 超时逻辑
    l 工作线程等待通知
    l 数据返回终止等待
    l 超时抛出异常
    Ø 数据结构
    l Map:SessionID-WindowData

04.RPC服务提供方核心功能设计实现

Provider功能分析
Ø 队列/线程池
Ø 超时丢弃
Ø 优雅关闭
Ø 过载保护
队列/线程池
将不同类型的请求,放入各自的队列,每个队列分配独立的线程池,资源隔离
在这里插入图片描述
队列数,线程池线程数如何选择?
线程池分配
Ø 单队列多线程 164
Ø 多队列单线程 64
1
在这里插入图片描述
单队列多线程可以很好处理慢请求
多队列单线程容易造成任务堆积,任务超时
超时丢弃
快速失败已经超时的请求,缓解队列堆积
在这里插入图片描述
IO放入队列的速度要比工作线程处理任务的速度快,就会造成任务在队列中堆积,就会出现队列中存在长时间没有处理的任务,就需要判断是否超时,超时就快速失败丢弃
流量增加,工作线程处理不过来,也会导致任务堆积,最终造成队列中的任务超时
这种任务超时的就直接丢弃,因为和客户端已经超时,没必要在处理,直接丢弃不用处理
压力增大工作线程处理不过来,就可以增加节点,增加服务处理能力,直接扩容后抗住流量。其中丢弃的请求不是最终解决办法,扩容是为了保证现在可以正常处理请求,然后在进行分析代码优化性能。
超时丢弃的处理逻辑,如下图:
在这里插入图片描述在这里插入图片描述
优雅关闭
进程退出前确保接收到的请求全部处理完成
服务端关闭服务之前要通知调用方;长链接可以通过链路返回服务端关闭的信息类型,客户端接去除这个服务端的服务
如何通知调用方?
Ø 返回数据中带关闭信息:弊:可能一段时候没有请求,可能没有返回(拉数据)
Ø 专门关闭协议通知调用方(推数据)
还有一种个人认为可以实现的,rpc服务都是需要注册到注册中心的,当停止一台服务应用是可以先下线注册中心的服务,然后在真正停止应用服务

  • 优雅关闭Server端实现
    Ø 监听关闭信号 kill -12
    Ø 改变服务状态
    Ø 通知客户端
    在这里插入图片描述
  • 改变服务状态
    在这里插入图片描述
    通知客户端
    在这里插入图片描述
    在这里插入图片描述
    优雅关闭
    客户端收到关闭通知后如何处理?
    在这里插入图片描述
    节点探活功能,单独的线程定时请求后端服务,尝试和服务端建立连接
    过载保护
    服务提供方为保证正常运行,主动丢弃超出处理能力外的请求
    在这里插入图片描述
    在这里插入图片描述
    RPC高级功能
    高级功能
    Ø 服务熔断
    Ø 服务降级
    Ø 限流
    Ø 动态权重
  • 服务熔断
    当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调
    在这里插入图片描述
  • 服务降级
    对业务降级,跳过异常调用,返回关键数据,确保服务可用
    在这里插入图片描述
    动态权重
    为刚启动节点分配较低权重,逐步提高权重
    在这里插入图片描述
    限流
    通过限制调用放流量,以达到对服务提供方的保护
    每个服务端应用服务收集调用端的流量(QPS),可以基于filter进行采集每个调用端的流量,然后上报给管控平台,管控平台对每个调用端都配置一个阀值,如果服务端上报的调用端流量大于阀值,那么管控平台就下发指令给每个调用端或者服务端也可以,告知调用端不在调用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值