微服务 Spring Cloud 8,开源RPC框架如何选型?

news2024/11/15 15:51:11

在这里插入图片描述

目录

    • 一、开源RPC框架有哪些?
      • 1、跟语言平台绑定的开源RPC框架
      • 2、跨语言平台的开源RPC框架
    • 二、跟语言平台绑定的开源RPC框架 -- Dubbo
      • 1、Dubbo的架构主要包含四个角色
      • 2、Dubbo的调用框架是如何实现的?
    • 三、如何选择?
    • 四、跨语言平台的开源RPC框架 -- gRPC
    • 五、跨语言平台的开源RPC框架 -- Thrift
    • 六、对比选型
    • 七、总结
    • 微服务 Spring Cloud系列

大家好,我是哪吒。

一、开源RPC框架有哪些?

1、跟语言平台绑定的开源RPC框架

  1. Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持Java语言。
  2. Motan:微博内部使用的RPC框架,于2016年对外开源,仅支持Java语言。
  3. Tars:腾讯内部使用的RPC框架,于2017年对外开源,仅支持C++语言。
  4. Spring Cloud:国外Pivotal公司2014年对外开源的RPC框架,仅支持Java语言。

2、跨语言平台的开源RPC框架

  1. gRPC:Google于2015年对外开源的跨语言RPC框架,支持多种语言。
  2. Thrift:最初是由Facebook开发的内部系统跨语言的RPC框架,2007年贡献给了Apache基金,成为Apache开源项目之一,支持多种语言。

如果你的业务场景仅仅局限于一种语言的话,可以选择跟语言绑定的RPC框架中的一种;如果涉及多个语言平台之间的相互调用,就应该选择跨语言平台的RPC框架。

二、跟语言平台绑定的开源RPC框架 – Dubbo

1、Dubbo的架构主要包含四个角色

  1. 服务提供者(Provider):提供服务的实体,通常是一个具体的业务服务实现类。
  2. 服务消费者(Consumer):调用远程服务的实体,通常是一个具体的业务服务调用方。
  3. 注册中心(Registry):负责服务的注册与发现,通常是一个高可用的分布式服务注册中心。
  4. 监控中心(Monitor):收集服务调用的统计信息,通常用于监控服务调用的性能、质量等。

在这里插入图片描述

具体的交互流程是Consumer一端通过注册中心获取到Provider节点后,通过Dubbo的客户端SDK与Provider建立连接,并发起调用。Provider一端通过Dubbo的服务端SDK接收到Consumer的请求,处理后再把结果返回给Consumer。

可以看出服务消费者和服务提供者都需要引入Dubbo的SDK才来完成RPC调用,因为Dubbo本身是采用Java语言实现的,所以要求服务消费者和服务提供者也都必须采用Java语言实现才可以应用。

2、Dubbo的调用框架是如何实现的?

Dubbo的调用框架的实现主要基于以下几个核心组件和服务治理策略:

  1. 服务注册与发现:Dubbo通过注册中心进行服务的注册与发现。服务提供者在启动时,将自己的元数据(如服务IP、Port等)注册到注册中心。服务消费者在启动时,向注册中心订阅服务提供者的元数据。注册中心将服务提供者地址列表提供给消费者,并在数据变更时推送给订阅的消费者。
  2. RPC调用:在获取服务提供者的元数据后,服务消费者可以发起RPC调用。Dubbo的RPC层负责建立网络通信连接,实现服务的远程调用。同时,RPC层还支持负载均衡、容灾和集群功能,以确保调用的稳定性和性能。
  3. 服务监控:在RPC调用前后,Dubbo会向监控中心上报统计信息,如并发数、调用接口等。这些信息可以用于服务的性能监控和调优。

此外,Dubbo的实现还采用了分层的思想,每层负责不同的职责,使得用户可以基于Dubbo框架进行二次开发,扩展其功能。同时,Dubbo还支持与Spring框架的无缝集成,使得用户可以更方便地将其应用于实际的业务场景中。

三、如何选择?

  • SpringCloud提供了服务注册组件、配置中心组件、负载均衡组件、断路器组件、分布式消息追踪组件等一系列组件;
  • Dubbo只提供了最基础的RPC框架的功能,其他微服务组件都需要自己去实现。
  • Spring Cloud的RPC通信采用了HTTP协议,相比Dubbo所采用的私有协议来说,在高并发的通信场景下,性能相对要差一些,所以对性能有苛刻要求的情况下,可以考虑Dubbo。

因此,在堆性能没有苛刻要求的场景下,都会选择SpringCloud。

四、跨语言平台的开源RPC框架 – gRPC

gRPC通过IDL(Interface Definition Language)文件定义服务接口的参数和返回值类型,然后通过代码生成程序生成服务端和客户端的具体实现代码,这样在gRPC里,客户端应用可以像调用本地对象一样调用另一台服务器上对应的方法。

在这里插入图片描述
它的主要特性包括三个方面。

  1. 通信协议采用了HTTP/2,HTTP/2提供了连接复用、双向流、服务器推送、请求优先级、首部压缩等机制,在通信过程中可以节省带宽、降低TCP连接次数、节省CPU、尤其对移动端来说,可以帮助延长电池寿命。
  2. IDL使用了ProtoBuf,ProtoBuf是由Google开发的一种数据序列化协议,它的压缩和传输效率极高,语法也简单,所以被广泛应用在数据存储和通信协议上。
  3. 多语言支持,能够基于多种语言自动生成对应语言的客户端和服务端的代码。

五、跨语言平台的开源RPC框架 – Thrift

Thrift是一种轻量级的跨语言RPC通信方案,支持多达25种编程语言。为了支持多种语言,跟gRPC一样,Thrift也有一套自己的接口定义语言IDL,可以通过代码生成器,生成各种编程语言的Client端和Server端的SDK代码,这样就保证了不同语言之间可以相互通信。它的架构图可以用下图来描述。

在这里插入图片描述
从这张图上可以看出Thrift RPC框架的特性。

  • 支持多种序列化格式:如Binary、Compact、JSON、Multiplexed等。
  • 支持多种通信方式:如Socket、Framed、File、Memory、zlib等。
  • 服务端支持多种处理方式:如Simple 、Thread Pool、Non-Blocking等。

六、对比选型

那么涉及跨语言的服务调用场景,到底该选择gRPC还是Thrift呢?

从成熟度上来讲,Thrift因为诞生的时间要早于gRPC,所以使用的范围要高于gRPC,在HBase、Hadoop、Scribe、Cassandra等许多开源组件中都得到了广泛地应用。而且Thrift支持多达25种语言,这要比gRPC支持的语言更多,所以如果遇到gRPC不支持的语言场景下,选择Thrift更合适。

但gRPC作为后起之秀,因为采用了HTTP/2作为通信协议、ProtoBuf作为数据序列化格式,在移动端设备的应用以及对传输带宽比较敏感的场景下具有很大的优势,而且开发文档丰富,根据ProtoBuf文件生成的代码要比Thrift更简洁一些,从使用难易程度上更占优势,所以如果使用的语言平台gRPC支持的话,建议还是采用gRPC比较好。

七、总结

以上就是我对几种使用最广泛的开源RPC框架的选型建议,也是基于它们目前现状所作出的判断,从长远来看,支持多语言是RPC框架未来的发展趋势。正是基于此判断,各个RPC框架都提供了Sidecar组件来支持多语言平台之间的RPC调用。

  • Dubbo在去年年底又重启了维护,并且宣称要引入Sidecar组件来构建Dubbo Mesh提供多语言支持。
  • Motan也在去年对外开源了其内部的Sidecar组件:Motan-go,目前支持PHP、Java语言之间的相互调用。
  • Spring Cloud也提供了Sidecar组件spring-cloud-netflix-sideca,可以让其他语言也可以使用Spring Cloud的组件。

所以未来语言不会成为使用上面这几种RPC框架的约束,而gRPC和Thrift虽然支持跨语言的RPC调用,但是因为它们只提供了最基本的RPC框架功能,缺乏一系列配套的服务化组件和服务治理功能的支撑,所以使用它们作为跨语言调用的RPC框架,就需要自己考虑注册中心、熔断、限流、监控、分布式追踪等功能的实现,不过好在大多数功能都有开源实现,可以直接采用。


微服务 Spring Cloud系列

微服务 Spring Cloud 1,服务如何拆分?使用微服务的注意事项?

微服务 Spring Cloud 2,一文讲透微服务核心架构(注册中心、服务通信、服务监控、服务追踪、服务治理)

微服务 Spring Cloud 3,如何对微服务进行有效的监控?

微服务 Spring Cloud 4,分布式系统如何进行数据分区

微服务 Spring Cloud 5,一图说透Spring Cloud微服务架构

微服务 Spring Cloud 6,用了这么多年Docker容器,殊不知你还有这么多弯弯绕

微服务 Spring Cloud 7,Nacos配置中心的Pull原理,附源码


🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1236043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux shell编程学习笔记27:tput

除了stty命令,我们还可以使用tput命令来更改终端的参数和功能。 1 tput 命令的功能 tput 命令的主要功能有:移动更改光标、更改文本显示属性(如颜色、下划线、粗体),清除屏幕特定区域等。 2 tput 命令格式 tput [选…

基于SSM的校园活动资讯网设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

OceanBase:OBServer节点管理

目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…

单体进化微服务:拆分、注册、调用、网关、过滤、治理、分布式事务

这里写目录标题 基本介绍生产-消费-网关父依赖生产者服务消费者服务网关服务common服务 感想 基本介绍 Spring Cloud 是一个用于构建分布式系统和微服务架构的开发工具包。它提供了一系列的功能和组件,用于解决微服务架构中的常见问题,如服务注册与发现…

Python---函数的应用案例(多个)

案例:使用print方法打印一条横线 print(- * 40) 案例:对上个案例进行升级,可以根据输入的num数值,生成指定数量的横线 def print_lines(num, length):""" print_lines函数主要作用用于生成多条指定长度的横线&…

Windows安装MongoDB

1、下载MongoDB的zip,解压 2、创建目录 mkdir D:\JavaSoftware\Database\MongoDB\mongodb-win32-x86_64-windows-5.0.8\data\db mkdir D:\JavaSoftware\Database\MongoDB\mongodb-win32-x86_64-windows-5.0.8\data\log 3、创建一个配置文件mongod.cfg&#xff0c…

【JavaEE】Servlet实战案例:表白墙网页实现

一、功能展示 输入信息: 点击提交: 二、设计要点 2.1 明确前后端交互接口 🚓接口一:当用户打开页面的时候需要从服务器加载已经提交过的表白数据 🚓接口二:当用户新增一个表白的时候,…

Self-Supervised Exploration via Disagreement论文笔记

通过分歧进行自我监督探索 0、问题 使用可微的ri直接去更新动作策略的参数的,那是不是就不需要去计算价值函数或者critic网络了? 1、Motivation 高效的探索是RL中长期存在的问题。以前的大多数方式要么陷入具有随机动力学的环境,要么效率…

1.Qt5.15及其以上的下载

Qt5.15及其以上的下载 简介: ​ Qt是一个跨平台的C库,允许开发人员创建在不同操作系统(如Windows、macOS、Linux/Unix)和设备上具有本地外观和感觉的应用程序。Qt提供了一套工具和库,用于构建图形用户界面&#xff0…

C语言基础---函数、数组

目录 一、函数 二、数组​ 一、函数 交换两个数: 发现这样并没有交换a和b的值,只是交换了x和y的值,这是因为: //当实参传递给形参的时候,形参是实参的一份临时拷贝 //对形参的修改不能改变实参 实参与形参是…

linux高性能服务器

第一部分、TCP/IP协议详解 TCP协议为应用层提供可靠的、面向连接的和基于流的服务 可靠 使用超时重传(发送端在发送报文后启动一个定时器,若定时器在规定时间内没有收到应答就会重发该报文),发送应答机制(发送端发送的每个TCP报文都必须得到接收方的应答…

城市易涝点怎么安装万宾科技内涝积水监测仪?

城市内涝是多个城市广泛存在的问题,经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失,甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题,内涝积水监测仪的应用是一大重要的举措&…

机器视觉兄弟们,新工作之前,不要过度准备

大家对工作的渴望我感同身受,有人去机器视觉培训机构培训,有人默默无闻地努力学习,不都是为了一份高新好工作吗? 实际上是: 技术高的人,劳动力贬值。 技术低的人,没有生存空间。 你有野心&…

linux 开发板以太网通过Ubuntu上外网方法

在开发板嵌入式设备,有一个mgbe网卡,用网线与连接soc的网卡,和外接网卡,将网卡usb接口插入电脑,选择接入到Ubuntu系统 在Ubuntu将能识别到这个外接网卡,这样就可以通过Ubuntu和soc通讯了, 如下…

关于标准库中的string类 - c++

目录 关于string类 string类的常用接口 string类常用接口的简单模拟实现 关于string类 string类在cplusplus.com的文档介绍 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。 3. string在…

SEO与 SMO 的区别

SEO和SMO都是为网站带来流量的方法,但二者截然不同。搜索引擎优化(SEO)是一种在搜索引擎结果页面上提高网站流量的技术,而社交媒体优化(SMO)则是一种让更多用户看到社交媒体内容的技术。 阅读本文&#xf…

开源之夏2023 MatrixOne 项目结业啦

开源之夏是由中国科学院软件研究所与 OpenEuler 社区共同主办的一项面向高校学生的暑期在线活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。 在开源之夏 2023 年中,MatrixOne 一共有 2 个任务项目&#…

智能座舱架构与芯片- (11) 软件篇 上

一、智能汽车基础软件平台分类 汽车软件主要分为应用软件和基础软件。应用软件和业务形态高度关联,不同控制器的应用软件之间差异较大。基础软件介于应用软件和硬件之间,用于屏蔽硬件特性、支撑应用软件。可有效地实现应用软件与硬件之间解耦&#xff0…

MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况

目录 一、索引 1.1、简单介绍 1.2、索引的分类 1.2.1、主键索引 1.2.2、单值索引(单列索引、普通索引) 1.2.3、唯一索引 1.2.4、复合索引 1.2.5、复合索引经典问题 1.3、索引原理 1.3.1、主键自动排序 1.3.2、索引的底层原理 1.3.3、B 树和 B…

【Web】Ctfshow XSS刷题记录

目录 反射型XSS ①web316 ②web317-319 ③web320-322 ④web323-326 存储型XSS ①web327 ②web328 ③web329 ④web330 ⑤web331 ⑥web332-333 反射型XSS ①web316 直接输入<script>alert(1)</script>,能弹窗。xss题目一般会有个bot&#xff0c;可以触…