0%

go 实现一个简单的rpc

rpc 的一个流程

当一个请求过来的,经过网关,网关调用应用服务,应用服务也需要调其他的服务。这个时候我们要考虑的问题。

  • 服务之间的发现
    我们需要一个发现服务和注册服务的地方,既是注册中心。还需要监控服务的可用性
  • 服务是多机器部署的,怎么均衡服务节点的流量
    负载均衡的实现,保证流量不被打到某一台或者特定的几台节点上,其他节点无流量
  • 调用超时问题
    需要关心网关调用服务,或者服务之间调用的超时问题
  • 服务负载问题
    如果某一个服务集群负载过高怎么办
  • 服务的节点管理等等
    怎么样管理和监控服务节点
  • 服务之间交互的协议
    gateway

协议的格式

[版本号]|[数据包长度]|[requestID]|[请求报文类型]|[报文编码格式]|[实际报文内容]的封包格式

request 请求体结构

1
2
3
4
5
type Request struct {
ServerName string
MethodName string
Params []interface{}
}

一个RPC的请求流程

客户端建立与服务端的链接 -> 基于客户端代理类,调用需要请求的方法 -> 生成请求体request,基于编码格式和协议格式,做数据转换->发送到服务端-》服务端接受到二进制报文,基于编码和协议格式,做反解码操作-》基于request的指定的server类和方法名调用注册的server方法返回数据-> 服务端把返回数据,编码返回给客户端->客户端反解码,拿到调用结果

调式

1
2
go run main.go -start server -port 9099
go run main.go -start client -port 9099
1
初始代码:https://github.com/lihongsheng/go-simple-rpc.git

服务端

客户端