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