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

在这里插入图片描述

目录

    • 一、开源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.mzph.cn/news/157452.shtml

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

相关文章

UI for Apache Kafka

文章Overview of UI Tools for Monitoring and Management of Apache Kafka Clusters | by German Osin | Towards Data Science中介绍了8种常见的kafka UI工具,这些产品的核心功能对比信息如下图所示, 通过对比发现 UI for Apache Kafka 功能齐全且免费,因此可以作为我们的首…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。 本文将带你深入理解容器探测[2],并特别关注相对较…

Linux安装ErLang(亲测可用)

注(我这里安装完成后显示的是中文,有的是显示的英文) 1.下载er wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm2.安装er yum -y install epel-release截图截不全,就只截安装完成的部分了 rp…

2023年中国语言大模型行业发展趋势分析:预计未来行业将迎来高速增长[图]

自然语言处理(NLP)大模型是一种利用深度学习技术来理解、解释和生成人类语言的高参数模型。语言大模型通过编码解码的方式模仿人类处理语言的过程从而达到进行自然语言文本输出的能力。 语言大模型主要组成部分 资料来源:共研产业咨询&#…

STM32出现 Invalid Rom Table 芯片锁死解决方案

出现该现象的原因为板子外部晶振为25M,而程序软件上以8M为输入晶振频率,导致芯片超频锁死,无法连接、下载。 解决方案 断电,将芯片原来通过10k电阻接地的BOOT0引脚直接接3.3V,硬件上置1上电,连接目标板&am…

3.9-Dockerfile实战

这一节介绍怎么将python程序打包成一个image,然后运行为一个container。 首先,创建/home/python/目录 mkdir /home/python/ 然后创建app.py文件。 vim app.py app.py文件的内容如下: from flask import Flaskapp Flask(__name__)app.route(…

解决收集问卷难的方法与策略:提升数据收集效率

随着社会的发展和科技的进步,问卷调查成为了获取信息和研究数据的重要手段之一。然而,面临的一个普遍难题是如何解决收集问卷困难的问题。无论是在学术研究、市场调研还是社会调查中,都存在着一些挑战和阻碍因素。本文将从不同角度探讨如何突…

B032-服务器 Tomcat JavaWeb项目 Servlet

目录 服务器服务器的认识 Tomcat服务器Tomcat服务器的介绍Tomcat的安装Tomcat报错的情况Tomcat要启动成功的条件 JavaWeb项目Web的项目结构发布项目的第一种方式发布项目的第二种方式 Eclipse中搭建动态Web项目eclipse安装Tomcat插件servletservlet示例servlet的执行流程servle…

同为科技(TOWE)工业连接器:保障高效、可靠、安全的电气连接

国内经济快速的发展,人们生活水平的不断提高,基础设施的建设是发展的基础,完善的基础设施对加速经济的发展起到至关重要的作用。其中,基础建设中机场、港口、电力、通讯等公共设施必须配套相应的电气设施,工业用插头插…

函数模板(成长版)

与普通函数区别&#xff1a;1.多了个template<class T>;2.某些确定类型变不确定类型T 一&#xff1a;引子&#xff1a; #include<iostream> using namespace std; template<typename T> T Max(T a, T b) {return a > b ? a : b; } int main() {int x, …

Mysql数据库 17.Mysql存储引擎

Mysql体系结构分为4层&#xff1a; 1.连接层 最上层是一些客户端和连接服务&#xff0c;包括大多数基于客户端/服务端工具实现的类似于TCP/IP的通信&#xff0c;主要功能是完成一些类似于连接处理、授权认证、安全方案等&#xff0c;在该层上还引入线程池的概念&#xff0c;为…

vue实现聊天栏定位到最底部(超简单、可直接复制使用)

原理 通过watch监听聊天内容的加载&#xff0c;一旦加载完成或者数据更新触发vue的数据监听时&#xff0c;就重新修改【滚动滑钮到滚动条顶部的距离滚动条的高度】&#xff0c;从而实现定位到底部的效果。 实现 1、布局 新建一个div&#xff08;聊天框&#xff0c;如下&…

微信收款助手消息不弹窗的解决办法

最近在做微信个人收款的回调&#xff0c;主要方法是根据通知栏截取收款信息&#xff0c;然后进行回调。 其中&#xff0c;发现一个问题&#xff0c;就是微信版本某次升级后&#xff0c;发现微信收款时不弹出消息了。 于是找到了这个解决方法&#xff0c;遇到相同问题的同学们…

Qt TCP相关的一些整理:服务端常见操作 socket 通信 network

目录 前言&#xff1a; 1、相关的库和类 2、服务端常用API 核心代码呈上&#xff1a; 前言&#xff1a; 在Qt的服务端上&#xff0c;不单单会用到服务端本身的API&#xff0c;对连接上来的客户端&#xff0c;也需要进行数据交互&#xff0c;也要用到一些收发包相关的…

代码随想录刷题】Day16 二叉树03

文章目录 1.【104】二叉树的最大深度&#xff08;优先掌握递归&#xff09;1.1 前言1.2 题目描述1.3 递归法java代码实现1.4 迭代法java代码实现1.5 相关练习题【559】N叉树的最大深度 2.【111】二叉树的最小深度&#xff08;优先掌握递归&#xff09;2.1 题目描述2.2 递归法ja…

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题&#xff1a;美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了&#xff0c;好开心&#xff0c;迫不及待地把题目分享出来&#xff0c;希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

c语言上机作业:给函数增加防御机制

1.题目 2.思路 1.首先&#xff0c;我们可以知道&#xff0c;我们必须先要把z求出来&#xff0c;但这里需要注意的是x&#xff0c;y并不包含了全部的定义域&#xff0c;所以我们必须先判断是否输入的数据满足条件。而这&#xff0c;就是我们所需要突破的函数的防御&#xff0c;…

.nvmrc 文件使用详解

文章目录 1. 前言2. .nvmrc 是什么3. 创建 .nvmrc 文件4. 使用 .nvmrc 文件5. 终端自动切换版本 1. 前言 当开发多个项目时&#xff0c;每个项目运行环境要求的 node 版本不一样&#xff0c;那么我们就需要给每个项目指定 node 版本&#xff0c;也就是通过终端执行 nvm install…

风丘电动汽车热管理方案 为您的汽车研发保驾护航

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

Android HAL学习 及 与BSP的区别

Android HAL学习 及 与BSP的区别 参考链接&#xff1a; 1、https://www.cnblogs.com/looner/articles/11579335.html 2、https://blog.csdn.net/leesan0802/article/details/124087630 3、https://zhuanlan.zhihu.com/p/336531442 在HAL的学习之前&#xff0c;我们来先了解…