微服务 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在线答疑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

继承【C++】

继承【C】 一.什么是继承?二. 继承的方式与权限三. 继承中的成员3.0 基类和派生类中的重名成员i. 限定符ii. 隐藏 3.1 继承与默认成员函数i. 默认构造ii. 析构函数 3.2 继承与友元函数3.3 继承与静态成员变量 四. 基类和派生类的赋值五. 多继承5.1 菱形继承5.2 菱形…

CFCA证书——基于SM2/3算法的安全信任

在中国金融认证中心(CFCA)发行的证书中,采用了最新的国密SM2/3算法来提供更高的安全保障。这一创新举措进一步增强了我国网络安全能力,并为用户提供了一种更可靠、更安全的选择。 SM2/3算法是中国自主研发的非对称加密算法&#…

瑞格心理咨询系统设置多个管理员的操作方法

使用瑞格心理咨询系统,需要设置多个admin权限的管理员账号来管理,咨询厂家答复只能有1个管理员,个人觉得不可能,于是开始折腾。 解决办法: 在没有数据字典的情况下, 通过遍历数据库,发现用户信…

python趣味编程-5分钟实现一个石头剪刀布游戏(含源码、步骤讲解)

Python 中的石头剪刀布代码是 使用Tkinter和图形用户界面(GUI)设计的。 Python 石头剪刀布游戏是使用Python 编程语言开发的简单桌面应用程序。 项目系统文件包含资源文件和Python脚本。游戏画面流畅,用户控制起来很容易。

大数据:SAS数据分析1,数据步,和过程步

大数据:SAS数据分析 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql…

2023年DevOps国际峰会暨BizDevOps企业峰会(DOIS北京站)-核心PPT资料下载

一、峰会简介 在数字化转型的大背景下,企业选择实践 DevOps 来提升 IT 效能成为常态,BizDevOps 作为企业自身数字化变革的重要主题之一,需要全行业共同努力促进繁荣和发展。从 DevOps 到 BizDevOps,业务与技术如何融合&#xff1…

JAVAEE---多线程

内核 内核时操作系统的核心 操作系统有内核态和用户态,像我们平时所用到的qq音乐,微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器,扬声器的操作就是在内核空间进行操作,用户态不能对其进行操作。 操作系统 …

移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择

近日,移远通信重磅推出六款新型天线,覆盖5G、非地面网络(NTN)等多种新技术,将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示:“当前,物联网应用除了需要高性能的天线…

基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码

基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于卷尾猴优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

雷电模拟器报错:g_bGuestPoweroff.fastpipeapi. cpp_1153_1161

文章目录 一、报错详情:二、解决:【1】设置Windows功能【2】设置cmd(管理员身份)【3】重启电脑 三、windows10其中1809版本出现1153、1161,需要关闭内核隔离 一、报错详情: 二、解决: 【1】设置…

909-2014-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 二叉树采用二叉链表存储结构,设计算法,判断二叉树是否为满二叉树。叙述算法思想并给出算法实现。 2.算法思想 通过一次遍历,得到结点个数和树的高度。用结点个数和树的高…

什么是高防CDN?有什么优势?

德迅高防CDN技术概述 随着互联网的快速发展,网络安全问题越来越受到人们的关注。高防CDN(Content Delivery Network)作为一种有效的网络安全防御手段,在企业和个人网站中得到了广泛应用。本文将详细介绍高防CDN的技术原理、防御原理、优点和应用场景&am…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数,但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数,不能够通过线程池的方式调用。 但是现在我们实际的项目开发中,一般都是采…

用 HLS 实现 UART

用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此,从概念上讲&#xf…

秋招JAVA面经总结

面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…

会声会影2024出来了吗?会声会影2023怎么使用?

会声会影20247中文旗舰版 Corel VideoStudio 是一款功能强大的视频编辑软件,可以帮助用户创建高质量的视频作品。它提供了一系列完善的编辑功能,包括视频编辑、音频编辑、调色、特效、字幕、标题等。它还支持多种视频格式,可以将视频转换为多…

CSDN专栏设置

文章目录 一、规则1.1、专栏数量与等级关联1.2、等级与积分关联1.3、积分1.3.1、积分获取1.3.2、积分被扣 二、配置2.1、入口2.2、新建2.2.1、一级专栏2.2.2、二级专栏 2.3、快捷编辑2.4、拖拽 一、规则 写了一阵子CSDN博客后,发现自己新增专栏的时候提示不能再新增…

Linux调度域与调度组

引入调度域的讨论可以参考这篇文章。这篇笔记重点分析了内核调度域相关的数据结构以及内核用于构建调度域的代码实现,以此来加深对调度域的理解。调度域是调度器进行负载均衡的基础。 调度域拓扑层级 整个系统的调度域组成一个层级结构,内核设计了stru…

909-2015-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 编写算法,删除二叉搜索树(二叉排序树)的最小元素。叙述算法思想并给出算法实现,分析算法复杂性。二叉树采用链式存储结构,节点结构如下:…

编写函数求定积分的通用函数

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 不积跬步无以至千里,…