月浩有约 發表於 2020-7-18 16:26:00

Go RPCX学习:快速入门

<h3>RPCX的产生</h3>
<p>rpcx是一个类似阿里巴巴&nbsp;Dubbo&nbsp;和微博&nbsp;Motan&nbsp;的分布式的RPC服务框架,基于Golang net/rpc实现。</p>
<p>谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括由当当网维护的dubbox。<br>不知道dubbo在阿里的内部竞争中败给了HSF,还是阿里有意将其闭源了,官方的代码使用的spring还停留在2.5.6.SEC03的版本,dubbox的spring也只升级到3.2.9.RELEASE。<br>不管怎样,dubbo还是在电商企业得到广泛的应用,京东也有部分在使用dubbo开发。</p>
<div>
<p>DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。微博的RPC框架 Motan 也正式开源了,如张雷所说:</p>
<p>2013 年微博 RPC 框架 Motan 在前辈大师们(福林、fishermen、小麦、王喆等)的精心设计和辛勤工作中诞生,向各位大师们致敬,也得到了微博各个技术团队的鼎力支持及不断完善,如今 Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。</p>

</div>
<p>这两个个优秀的框架都是使用Java开发的,国外的互联网企业也有非常出名的的RPC框架如&nbsp;thrift&nbsp;、&nbsp;finagle&nbsp;。</p>
<p>本项目&nbsp;rpcx&nbsp;的目标就是实现一个Go生态圈的Dubbo,为Go生态圈提供一个分布式的、多插件的、带有服务治理功能的产品级的RPC框架。</p>
<p>Go生态圈已经有一些RPC库,如官方的&nbsp;net/rpc&nbsp;、&nbsp;grpc-go&nbsp;、&nbsp;gorilla-rpc&nbsp;等,为什么还要开发&nbsp;<strong>rpcx</strong>&nbsp;呢?</p>
<p>原因在于尽管这些框架都是为Go实现的RPC库,但是它们的功能比较单一,只是实现了点对点(End-to-End)的通讯框架。缺乏服务治理的功能,比如服务注册和发现、负载均衡、容灾、服务监控等功能。因此我基于Go net/rpc框架实现了一个类似Dubbo的分布式框架。</p>
<p>和rpcx比较类似的Go RPC框架是&nbsp;go-micro&nbsp;,但是rpcx提供了更丰富的功能,基于TCP的通讯协议性能更好。</p>
<p>那么rpcx 和 grpc 出来的定位是什么? rpcx支持protobuf3吗?</p>
<p>grpc 不会在企业大规模使用,或者说不会直接在企业中规模很大的服务中的推广。因为本身它的服务治理很弱。rpcx支持protobuf3, 而且默认提供了protobuf3的编码器实现。</p>
<h3>RPC是什么</h3>
<p>远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务。很显然,这是一种client-server的交互形式,调用者(caller)是client,执行者(executor)是server。典型的实现方式就是request–response通讯机制。</p>
<p>RPC 是进程之间的通讯方式(inter-process communication, IPC), 不同的进程有不同的地址空间。<br>如果client和server在同一台机器上,尽管物理地址空间是相同的,但是虚拟地址空间不同。<br>如果它们在不同的主机上,物理地址空间也不同。</p>
<p>RPC的实现的技术各不相同,也不一定兼容。</p>
<p>一个正常的RPC过程可以分成下面几步:</p>
<ol>
<li>client调用client stub,这是一次本地过程调用</li>
<li>client stub将参数打包成一个消息,然后发送这个消息。打包过程也叫做 marshalling</li>
<li>client所在的系统将消息发送给server</li>
<li>server的的系统将收到的包传给server stub</li>
<li>server stub解包得到参数。 解包也被称作 unmarshalling</li>
<li>最后server stub调用服务过程. 返回结果按照相反的步骤传给client</li>

</ol>
<p>RPC只是描绘了 Client 与 Server 之间的点对点调用流程,包括 stub、通信、RPC 消息解析等部分,在实际应用中,还需要考虑服务的高可用、负载均衡等问题,所以产品级的 RPC 框架除了点对点的 RPC 协议的具体实现外,还应包括服务的发现与注销、提供服务的多台 Server 的负载均衡、服务的高可用等更多的功能。目前的 RPC 框架大致有两种不同的侧重方向,一种偏重于服务治理,另一种偏重于跨语言调用。</p>
<p>服务治理型的 RPC 框架有 Dubbo、DubboX、Motan 等,这类的 RPC 框架的特点是功能丰富,提供高性能的远程调用以及服务发现及治理功能,适用于大型服务的微服务化拆分以及管理,对于特定语言(Java)的项目可以十分友好的透明化接入。但缺点是语言耦合度较高,跨语言支持难度较大。</p>
<p>跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等,这一类的 RPC 框架重点关注于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合于为不同语言提供通用远程服务的场景。但这类框架没有服务发现相关机制,实际使用时一般需要代理层进行请求转发和负载均衡策略控制。</p>
<p>本项目 rpcx 属于服务治理类型,是一个基于 Go 开发的高性能的轻量级 RPC 框架,Motan 提供了实用的服务治理功能和基于插件的扩展能力。</p>
<h3>RPCX的特点</h3>
<p>rpcx使用Go实现,适合使用Go语言实现RPC的功能。</p>
<ul>
<li>基于net/rpc,可以将net/rpc实现的RPC项目轻松的转换为分布式的RPC</li>
<li>插件式设计,可以配置所需的插件,比如服务发现、日志、统计分析等</li>
<li>基于TCP长连接,只需很小的额外的消息头,当然也支持Http</li>
<li>支持多种编解码协议,如Gob、Json、MessagePack、gencode、ProtoBuf等</li>
<li>服务发现:服务发布、订阅、通知等,支持多种发现方式如ZooKeeper、Etcd等</li>
<li>高可用策略:失败重试(Failover)、快速失败(Failfast)</li>
<li>负载均衡:支持随机请求、轮询、低并发优先、一致性 Hash等</li>
<li>规模可扩展,可以根据性能的需求增减服务器</li>
<li>双向调用:支持客户端与服务端双向通信</li>
<li>跨语言调用:支持Java、Python、C#、Node.js、Php、C\C++、Rust等等来调用 rpcx 服务,通过Gateway&nbsp;和&nbsp;Agent</li>
<li>安全:支持白名单,限流、消息大小、身份认证等</li>
<li>调用机制:支持超时与熔断机制</li>
<li>其他:调用统计、访问日志、ui管理界面等</li>
<li>支持压缩</li>
<li>支持扩展信息传递(元数据)</li>

</ul>
<p>rpcx目标是轻量级的,小而简单,但是期望所有的功能都可以通过插件的方式搭积木的方式完成。</p>
<h3>RPCX架构</h3>
<p>rpcx中有服务提供者 RPC Server,服务调用者 RPC Client 和服务注册中心 Registry 三个角色。</p>
<ul>
<li>Server 向 Registry 注册服务,并向注册中心发送心跳汇报状态(基于不同的registry有不同的实现)。</li>
<li>Client 需要向注册中心查询 RPC 服务者列表,Client 根据 Registry 返回的服务者列表,选取其中一个 Sever 进行 RPC 调用。</li>
<li>当 Server 发生宕机时,Registry 会监测到服务者不可用(zookeeper session机制或者手工心跳),Client 感知后会对本地的服务列表作相应调整。client可能被动感知(zookeeper)或者主动定时拉取。</li>
<li>可选地,Server可以定期向Registry汇报调用统计信息,Client可以根据调用次数选择压力最小的Server</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1477786/202007/1477786-20200718161914543-1263400364.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>当前rpcx支持zookeeper, etcd、Consul等注册中心。</p>
<p>rpcx基于Go net/rpc的底层实现, Client和Server之间通讯是通过TCP进行通讯的,它们之间通过Client发送Request,Server返回Response实现。<br>Request和Response消息的格式都是&nbsp;<code>Header+Body</code>&nbsp;的格式。Header和Body具体的格式根据编码方式的不同而不同,可以是二进制,也可以是结构化数据如JSON。</p>
<p>grpc中文文档:https://books.studygolang.com/go-rpc-programming-guide/</p>
<p>refer:</p>
<p>https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/82455716</p>
<p>https://www.tuicool.com/articles/vYB3euv</p><br><br>
来源:https://www.cnblogs.com/-wenli/p/13336193.html
頁: [1]
查看完整版本: Go RPCX学习:快速入门