RPC | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

RPC⼊⻔

RPC是远程过程调⽤的简称,是分布式系统中不同节点间流⾏的通信⽅式。在互联⽹时代,RPC已经 和 IPC⼀样成为⼀个不可或缺的基础构件。因此Go语⾔的标准库也提供了⼀个简单的RPC实现,我们 将以此为⼊⼝学习RPC的各种⽤法。

RPC的优点

可以像使用本地函数一样使用远程服务

  • 简单
  • 高效

跨语⾔的RPC

标准库的RPC默认采⽤Go语⾔特有的gob编码,因此从其它语⾔调⽤Go语⾔实现的RPC服务将⽐较困难。

相比较与通用的JSON编码,每个语言都认识它,他就是一个跨语言的编码,但是gob不是跨语言的编码,所以我们要选择一个合适的编码。

常见的编解码:

MessagePack:高效的二进制序列化格式 JSON:文本编码 XML:文本编码 ProtoBuf:二进制编码 在互联⽹的微服务时代,每个RPC以及服务的使⽤者都可能采⽤不同的编程语⾔,因此跨语⾔是 互联⽹时代RPC的⼀个⾸要条件。得益于RPC的框架设计,Go语⾔的RPC其实也是很容易实现跨语⾔⽀持的。

Go语⾔的RPC框架有两个⽐较有特⾊的设计:⼀个是RPC数据打包时可以通过插件实现⾃定义的编码 和解码;另⼀个是RPC建⽴在抽象的io.ReadWriteCloser接⼝之上的,我们可以将RPC架设在不同的通讯协议之上。

服务治理型的 RPC 框架有 Dubbo、DubboX、Motan 等,这类的 RPC 框架的特点是功能丰富,提供高性能的远程调用以及服务发现及治理功能,适用于大型服务的微服务化拆分以及管理,对于特定语言(Java)的项目可以十分友好的透明化接入。但缺点是语言耦合度较高,跨语言支持难度较大。

跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等,这一类的 RPC 框架重点关注于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合于为不同语言提供通用远程服务的场景。但这类框架没有服务发现相关机制,实际使用时一般需要代理层进行请求转发和负载均衡策略控制