Foreword

总结一下常用的RPC

RPC

RPC,远程过程调用,落到具体代码里其实是非常简单的,就是你掉了一个远程函数,这个函数的执行是其实不是本机,而是在远端,执行完成以后通过各种渠道返回结果信息。

对于接口或者函数使用者来说,相当于屏蔽了后面的细节,就当成普通函数用就行了。

对于RPC的基建来说,那可就复杂了,走了一个类似这样的流程

早期RPC可能是仅仅局限于网络传输,其实到了后期RPC在各种介质或者渠道上都有可能进行传输

RPC对于使用者来说似乎是简单了,同时也对平台或者基建层有一些要求,导致有些小平台上可能无法使用

gRPC

https://github.com/grpc/grpc

https://grpc.io/

gRPC由Google开发。 协议基础:基于HTTP/2协议,并使用Protocol Buffers(ProtoBuf)作为序列化协议。 支持语言:支持多语言,包括C++、Java、Python、Go、Ruby、C#、Node.js等。

gRPC 有四种调用方式,分别是一元、服务端/客户端流式、双向流式。

特点:

  • 提供强大的IDL(接口定义语言)和自动代码生成工具
  • 支持双向流、流式传输等特性
  • 适用于大规模分布式系统,要求高性能和跨语言支持的场景
  • 适用于需要使用Protocol Buffers进行高效数据序列化的场景

Dubbo

https://cn.dubbo.apache.org/zh-cn/

Dubbo 是阿里巴巴开源的基于 Java 的 RPC 分布式服务框架,提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。另外,基于 Spring Cloud Alibaba 技术栈的 Spring-cloud-alibaba-dubbo 更是对 dubbo 技术进行了封装,在基于 Spring Cloud Alibaba 提供的 Nacos 注册中心下,提供了 Dubbo 和 Spring Cloud 的整合方案,即 Dubbo Spring Cloud,使得服务内部的 RPC 协议调用几乎是零成本的改造,实现了基于 RPC 的服务调用。

Dubbo更像是实现了一个订阅发布类型的基础框架,这框架其实也算是一种RPC的形式

  • Dubbo主要是Java的RPC,对于其他语言支持一般

Thrift

https://thrift.apache.org/

thrift是一种可伸缩的跨语言服务的RPC软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,高效、无缝地在多种语言间结合使用。2007年由facebook贡献到apache基金,是apache下的顶级项目,具备如下特点:

  • 支持多语言:C、C++ 、C# 、D 、Delphi 、Erlang 、Go 、Haxe 、Haskell 、Java 、JavaScript、node.js 、OCaml 、Perl 、PHP 、Python 、Ruby 、SmallTalk
  • 消息定义文件支持注释,数据结构与传输表现的分离,支持多种消息格式
  • 包含完整的客户端/服务端堆栈,可快速实现RPC,支持同步和异步通信

Motan

https://github.com/weibocom/motan

微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。据说是基于Dubbo改出来的一个类似的精简版。

  • 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力。
  • 支持集成consul、zookeeper等配置服务组件,提供集群环境的服务发现及治理能力。
  • 支持动态自定义负载均衡、跨机房流量调整等高级服务调度能力。
  • 基于高并发、高负载场景进行优化,保障生产环境下RPC服务高可用。

Tars

https://github.com/TarsCloud/Tars

https://tarscloud.org/

Tars 是腾讯将其内部使用的微服务框架 TAF(Total Application Framework)多年的实践成果总结而成的开源项目,在腾讯内部有上百个产品使用,服务内部数千名 C++、Java、Golang、Node.Js 与 PHP 开发者。其包含一整套开发框架与管理平台,兼顾多语言、易用性、高性能与服务治理,理念是让开发更聚焦业务逻辑,让运营更高效

TARS 协议采用接口描述语言(IDL)来支持多种编程语言,C++、Java、Node.JS、PHP、Python、Golang等,使不同平台、不同语言编写的程序能够相互通信交流,打破语言屏障。

erpc

https://github.com/EmbeddedRPC/erpc

eRPC(嵌入式RPC)是NXP开源的、用于多芯片嵌入式系统和异构多核SoC的开源远程过程调用(RPC)系统。与其他现代RPC系统(如出色的Apache Thrift)不同,eRPC的与众不同之处在于它是为紧密耦合的系统设计的,使用纯C实现远程功能,并且代码大小较小(<5kB)。它不适用于网络上的高性能分布式系统。

eRPC也是基于IDL来生产对应的文件的

  • eRPC轻量、可剪裁
  • 传输层可以被二次定义开发
  • 序列化层同样可以被二次开发
  • 基于C语言设计,适配C++也没问题
  • 支持异步
  • 支持多线程
  • 每个函数有唯一标签
  • 请求和响应匹配
  • 延迟极低

Summary

目前能看到的RPC基本就这几个,每个应用方向都不太一样,客户端之间比较适合gRPC,嵌入式就只有erpc了,web最好的还是Dubbo,Spring那一套

Quote

https://blog.csdn.net/yuiezt/article/details/140190124

https://www.ked.pub/coding/grpc-with-web/

https://www.cnblogs.com/JulianHuang/p/17934703.html

https://www.cnblogs.com/JulianHuang/p/17934703.html

https://www.51cto.com/article/701423.html

https://javaguide.cn/distributed-system/rpc/rpc-intro.html