基本概念
本地函数调用
远程函数调用
如下图所示,这个就是远程调用的过程:
RPC 概念模型
一次 RPC 的完整过程
RPC 的优点
RPC 的问题
- 服务宕机,对方应该如何处理?
如果服务宕机的话,可以返回一个快速失败的策略,比如说提示服务不可用,防止因为服务的局部不可用导致整体的服务雪崩,导致整个服务的崩溃,这个一般来说就是我们所说的服务保护,即微服务中常常说的熔断降级。
- 在调用过程中发生网络异常,如何保证消息的可达性?
这个可以从两个角度去考虑,第一个角度是重试的角度,一般在分布式系统中,网络是作为一个不可信的角度,就是网络抖动很大概率会导致调用的丢失,所以我们一般会添加重试策略,重试策略这里常常用的有两种,一个是指数退避,另外一个是均匀重试,从重试的角度去考虑,另外一个就是我们常常说的确认连接的建立,通过传输层协议的可靠性,来保证连接的可靠。
3.请求量突然增加导致服务无法及时处理
一般针对这种情况,我们可以通过限流 + 异步的方式,来降低服务器的压力,从而提高服务的处理能力,然后针对请求量突然增加的情况,我们还可以使用消息队列进行削峰填谷。
分层设计
以 Apache Thfift 为例
编码和解码层
编解码层-生成代码
编解码层-数据格式
编解码层-二进制编码
编码解码-选型
协议层
协议层可以基于多种协议,比如 TCP、UDP、HTTP 等,主要看封装
协议层-概念
协议层-协议改造
因为原先的报文格式可能不适配传输的要求,所以我们一般需要对于协议进行改造
协议层-协议解析
网络通信层
网络通信层-Sockets API
网络通信层-网络库
关键指标
稳定性-保证策略
- 熔断:保护调用方,防止被调用的服务出现问题从而影响到整个链路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用的节点上