本文已参与「新人创作礼」活动,一起开启掘金创作之路。
- 由于项目需要,准备开发一个分布式限速服务,参考:分布式限速,会应用到RPC服务,所以需要先调研主流RPC服务的性能,可靠,易用性。
Go RPC
golang原生的rpc服务
go的官方包就叫: rpc, 提供通过网络或其他 I/O 连接访问对象的导出方法。服务器注册一个对象,使其作为具有对象类型名称的服务可见。注册后,对象的导出方法将可以远程访问。服务器可以注册多个不同类型的对象(服务),但是注册多个相同类型的对象是错误的。 看下怎么用的:
func (t *T) MethodName(argType T1, replyType *T2) error
其中 T1 和 T2 可以通过 encoding/gob 进行编组。即使使用不同的编解码器,这些要求也适用。(将来,这些要求可能会针对自定义编解码器而有所缓和。)
方法的第一个参数代表调用者提供的参数;第二个参数表示要返回给调用者的结果参数。该方法的返回值(如果非零)作为字符串传回,客户端将其视为由errors.New 创建的。如果返回错误,则不会将回复参数发送回客户端。
服务器可以通过调用 ServeConn 来处理单个连接上的请求。更典型的是,它将创建一个网络侦听器并调用 Accept,或者对于 HTTP 侦听器,HandleHTTP 和 http.Serve。
希望使用该服务的客户端建立一个连接,然后在该连接上调用 NewClient。便利功能 Dial (DialHTTP) 为原始网络连接(HTTP 连接)执行两个步骤。生成的 Client 对象有两个方法 Call 和 Go,它们指定要调用的服务和方法,一个包含参数的指针,一个用于接收结果参数的指针。
Call 方法等待远程调用完成,而 Go 方法异步启动调用并使用 Call 结构的 Done 通道发出完成信号。
除非设置了显式编解码器,否则使用包 encoding/gob 来传输数据。
GRPC
底层协议基于HTTP2。最终我们项目还是选择了GRPC,其中很大原因就是非常易于开发,不同水平的开发人员都可以很快上手。
所以带团队的时候,一定要考虑易用性,因为团队成员肯定是擅长不同的领域。
RPCX
之后再补充吧。