RPC框架
扫描二维码
随时随地手机看文章
1、定义
RPC-远程过程调用,是一种通信协议,允许调用不同进程空间的程序,即调用另一个地址空间(通常是远程机器)的过程或函数,就像调用本地函数/方法一样
2、优点
- 无论是客户端还是服务端,不需要额外的定义,RPC直接调用
- RPC使用自定义的协议格式,减少冗余报文
- RPC采用更高效的序列化协议,将文本转换为二进制传输
- RPC更容易扩展和集成
3、RPC框架处理的问题
- 两个应用程序部署在两台机器—选择TCP协议或者HTTP协议
- 两个应用程序部署在一台机器—选择Unix Socket协议
- 报文编码格式—选择JSON或者XML
- 报文较大—选择protobuf
4、注册中心
客户端和服务端互相不知道对方的存在,服务端启动时,将自己注册到注册中心;客户端调用时,从注册中心获取到所有可用的实例,选择一个来调用。注册中心还需要实现服务动态添加、删除,使用心态确保服务处于可用状态。
核心角色
- 服务端(Provider):启动时向注册中心注册自己的地址和元数据
- 客户端(Consumer):调用服务时从注册中心获取可用服务端地址
- 注册中心(Registry):记录服务地址并提供健康检查(如 Consul、Etcd、ZooKeeper)
5、关键流程解析
服务注册:
- 服务端启动时将自己的地址(如 192.168.1.100:8080)和元数据(服务名称、健康检查接口)注册到 Consul
- Consul 会定期调用健康检查接口(如 /health),自动剔除故障节点
服务发现:
- 客户端不直接写死服务端地址,而是向 Consul 查询 math-service 的可用实例列表
- 客户端通过负载均衡策略(随机、轮询、权重等)选择一个可用地址进行调用
解耦效果:
服务端无需知道客户端的存在,只需关注自身服务实现;客户端无需维护服务端地址列表,动态感知服务实例变化;注册中心统一管理服务拓扑关系。
6、场景模拟
假设有 3 个服务端实例:
math-service-1(192.168.1.101:8080)
math-service-2(192.168.1.102:8080)
math-service-3(192.168.1.103:8080)
当客户端调用时:
- Step1:通过 Consul 获取到 3 个实例地址
- Step2:随机选择其中一个(如 math-service-2)发起 RPC 调用
- Step3:如果 math-service-2 宕机,Consul 会在下次健康检查时将其标记为不可用
- Step4:客户端下次发现时只会获得剩余 2 个健康实例
7、关于GeeRPC
GeeRPC从零实现go语言官方的标准库net/rpc,并在此基础上增加协议交换、注册中心、服务发现、负载均衡、超时处理等模块。