RPC的未来在哪里?

举报
JavaEdge 发表于 2022/06/26 11:53:30 2022/06/26
【摘要】 虽有这些问题,但RPC并未消失。在编码基础上构建了各种RPC框架:Thrift和Avro带有RPC支持gRPC使用Protocol Buffers的RPC实现Finagle也使用ThriftRest.li使用JSON over HTTP这种新一代RPC框架更加明确远程请求和本地方法调用是不同的。如:Finagle和Rest.li 使用Futures(Promises)封装可能失败的异步操作。...

虽有这些问题,但RPC并未消失。在编码基础上构建了各种RPC框架:

  • Thrift和Avro带有RPC支持
  • gRPC使用Protocol Buffers的RPC实现
  • Finagle也使用Thrift
  • Rest.li使用JSON over HTTP

这种新一代RPC框架更加明确远程请求和本地方法调用是不同的。如:

  • Finagle和Rest.li 使用Futures(Promises)封装可能失败的异步操作。Futures还可简化需并行请求多服务并将结果合并的场景
  • gRPC支持流,其中一个调用不仅包括一个请求和一个响应,还可以是随时间的一系列请求和响应

一些框架还提供服务发现:允许客户端找出在哪个IP地址和端口可找到特定服务。

使用二进制编码格式的自定义RPC协议可实现如REST上的JSON之类的通用协议更好的性能。但RESTful API还有其他优点:方便实验和调试(只需使用Web浏览器或命令行工具curl,无需代码生成或软件安装),能被所有主流语言和平台支持,还有丰富工具(服务器,缓存,负载平衡器,代理,防火墙,监控,调试工具,测试工具等)生态系统。

由于这些原因,REST似乎是公共API的主流风格。 RPC框架的主要侧重于同一组织内多个服务之间的请求,通常在同一IDC。

RPC 的数据编码与演化

可演化性,重要的是独立更改和部署RPC客户端和服务器。与基于DB的数据流相比,可做个简化假设:假定所有服务器都先被更新,其次是所有客户端。因此,只需在请求上具有向后兼容性,且对响应具有前向兼容性。

RPC方案的向前和向后兼容性属性取决于它具体编码:

  • Thrift,gRPC(Protobuf)和Avro RPC可根据相应编码格式的兼容性规则进行演变
  • SOAP,请求和响应是使用XML模式指定。这些可以演变,但有一些微妙陷阱
  • RESTful API通常使用JSON用于响应,请求则使用JSON或URI编码/表单编码的请求参数。为保持兼容性,一般考虑添加可选的请求参数、向响应对象添加新字段

若RPC经常用于跨组织边界的通信,则服务兼容性会更困难,因此服务的提供者经常无法控制其客户,也不能强迫他们升级。因此,需长期保持兼容性,也许无限期。若不得不进行一些破坏兼容性的更改,则服务提供者通常会同时维护多个版本的服务API。

对API版本管理应该如何工作(即客户端如何指示它想要使用哪个版本API)没有统一方案:

  • 对RESTful API,一般在URL或HTTP Accept头使用版本号
  • 使用API密钥来标识特定客户端的服务,另一种选择是将客户端请求的API版本存储在服务器,并允许通过单独的管理界面更新该版本选项
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。