如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。

RPC 远程服务调用是分布式服务架构的基础,无论微服务设计上层如何发展,讨论服务治理都绕不开远程服务调用,那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢?

如何理解 RPC

RPC(Remote Procedure Call)是一种进程间通信方式,百科给出的定义是这样的:“RPC(远程过程调用协议),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议”。

RPC 允许程序调用另一个地址空间的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。

比如两台服务器 A、B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数或者方法,由于不在一个内存空间,则不能直接调用,这时候就可以应用 RPC 框架的实现来解决。

RPC 如何实现

早期的远程服务调用一般是通过 RMI 或 Hessian 等工具实现,以 Java RMI 为例,RMI 是 Java 语言中 RPC 的一种实现方式。

Java RMI(Java 远程方法调用,Java Remote Method Invocation)是 Java 编程语言里,一种用于实现远程过程调用的应用程序编程接口。应用 Java RMI,可以让某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。

Java RMI 实现主要依赖 java.rmi 包下面的工具类,具体流程包括继承 Remote 实现远程接口,开发业务逻辑,创建 Server 并且注册远程对象,客户端创建 Client 调用远程方法等。关于 RMI 的实现细节,由于实际开发中很少应用,这里不展开讲解了。

以 Java RMI 为代表的的早期 RPC 实现起来比较繁琐,需要在代码中直接编码地址,并且不支持服务治理,比如无法对服务调用进行统计、无法梳理服务依赖情况、无法保证服务上下线时的稳定性等。随着分布式系统规模的增长,传统方式已经无法满足开发需求,于是诞生了一系列的 RPC 服务框架。

RPC 框架代表

开源社区里有许多优秀的 RPC 框架,比如常用的 Dubbo、Thrift、gRPC 等,下面简单介绍一下这几款组件。

Apache Dubbo

Dubbo 是阿里巴巴公司开源的一个高性能 Java 分布式服务框架,目前已经成为 Apache 顶级项目。Dubbo 可以通过高性能的 RPC 实现服务的输出和输入,支持服务治理,提供了控制台界面,可以独立应用,也可以和 Spring 框架无缝集成。

Dubbo 在设计中采用了微内核架构,基于对 Java SPI 机制的扩展实现,Dubbo 对分布式服务调用核心功能都开放了扩展点,包括服务调用的负载均衡策略、序列化协议、传输协议等,使用者都可以添加自定义实现。

Dubbo 在国内曾经拥有很高的人气,是微服务架构的首选,后来随着 Spring Cloud 的流行,社区一度停更,外部用户发布了 DubboX 等升级版本。最近,Dubbo 社区又重新活跃,更新后的 Dubbo 也发布了 3.0 预览版等,并且宣布会在未来的版本中支持更多特性,值得期待。

Google 的 gRPC

gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,gRPC 使用 ProtoBuf 来定义服务,ProtoBuf 是 Google 开发的一种数据序列化协议,性能比较高,压缩和传输效率高,语法也比较简单。另外,gRPC 支持多种语言,并能够基于语言自动生成客户端和服务端功能库。

Apache Thrift

Thrift 起源于 Facebook,和 Dubbo 一样,后来被提交 Apache 基金会将 Thrift 作为一个开源项目。Facebook 创造 Thrift 的目的是为了解决 Facebook 各系统间大数据量的传输通信,以及系统间语言环境不同需要跨平台的问题。

Thrift 支持多种编程语言,如 Java、C++、Python、PHP、Ruby 等,可以在多种不同的语言之间通信。应用 Thrift,需要在一个语言无关的 IDL 文件里,定义数据类型和服务接口,然后生成用来构建 RPC 客户和服务器所需的代码。

Thrift 主要的优点是跨语言;缺点是,由于需要定义独立的 IDL 文件,如果对服务进行修改,当数据结构发生变化时,必须重新编辑 IDL 文件、重新编译和生成相关的代码,修改起来比较繁琐。

微博 Motan

Motan 是新浪微博开源的一个 Java RPC 框架,官方文档对外宣传在微博平台已经广泛应用,每天为数百个服务完成近千亿次的调用。

Motan 基于 Java 语言开发,设计和实现与 Dubbo 比较类似,包括服务提供者(RPC Server)、服务调用方(RPC Client)、服务注册中心(Registry)三个角色。服务端会向注册中心注册服务,消费端使用服务需要先向注册中心进行订阅,根据注册中心的返回列表与具体的 服务端建立连接,进行 RPC 通讯。当服务端发生变更的时候,注册中心也会同步变更,然后同步的通知到消费端。

Motan 也提供了服务治理的功能,包括服务的发现、服务的摘除、高可用及负载均衡。

RPC 框架用到哪些技术

了解了常见的 RPC 框架后,我们来看一下实现一个 RPC 框架需要哪些技术。

如何建立通信

实现分布式服务框架,首先要解决不同节点之间通讯的问题,需要在客户端和服务器之间建立 TCP 连接,远程过程调用的所有交换的数据都在这个连接里传输。

一般来说,建立通信可以使用成熟的网络通信框架,比如 Java 语言中的 Netty,这是一个优秀的网络通信框架。在 Dubbo、Motan 中都应用了 Netty。

如何进行网络传输

建立通信之后,节点之间数据传输采用什么协议,也就是选择什么样的二进制数据格式组织;传输的数据如何序列化和反序列化,比如在 Dubbo 中,传输协议默认使用 Dubbo 协议,序列化支持选择 Hessian、Kryo、Protobuf 等不同方式。

如何进行服务注册和发现

服务注册和发现,也就是服务寻址,以 Dubbo 为例,下图分布式服务典型的寻址和调用过程:

image.png

服务注册,需要服务提供者启动后主动把服务注册到注册中心,注册中心存储了该服务的 IP、端口、调用方式(协议、序列化方式)等信息。

服务发现,当服务消费者第一次调用服务时,会通过注册中心找到相应的服务提供方地址列表,并缓存到本地,以供后续使用。当消费者再次调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从 IP 列表中取一个服务提供者调用服务。

上面列举了一些分布式服务框架的实现要点,除了这些,还有很多技术细节,比如如何实现服务调用,RPC 框架如何和服务层交互,Java 中通过代理实现服务调用,那么代理对象如何解析请求参数、如何处理返回值等。

总结

本文分享了 RPC 远程服务调用的概念,介绍了常见的 RPC 框架实现,以及 RPC 框架需要关心哪些技术。通过本课时的学习,相信你对 RPC 相关技术有了一个初步认识,如果对其中某个框架感兴趣,你可以找一些资料深入了解。

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

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

相关文章

3D点云广义零样本分类的递归循环对比生成网络笔记

1 Title Contrastive Generative Network with Recursive-Loop for 3D point cloud generalized zero-shot classification(Yun Hao, Yukun Su, Guosheng Lin, Hanjing Su, Qingyao Wu)【Pattern Recognition】 2 Conclusion This work aims to facilitate research on 3D poi…

web微服务规划

一、背景 通过微服务来搭建web系统,就要对微服务进行规划,包括服务的划分,每个服务和数据库的命名规则,服务用到的端口等。 二、微服务划分 1、根据业务进行拆分 如: 一个购物系统可以将微服务拆分为基础中心、会员…

卸载Postman?这款IDEA插件真可以!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

群晖7.2使用Docker安装容器魔方结合内网穿透实现远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔…

注意std::shared_ptr的循环引用

指针智能是RAII的思想的具体体现。利用对象生命周期来管理资源。 在C11中,引入shared_ptr、weak_ptr和unique_ptr。 share_ptr是一个能有效解决赋值和拷贝构造的引用技术。 std::shared_ptr通过引用计数的方式来管理对象的生命周期,但是如果两个对象互…

老卫带你学---leetcode刷题(29. 两数相除)

29. 两数相除 问题 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 &…

动态面板简介以及ERP原型图案列

动态面板简介以及ERP原型图案列 1.Axure动态面板简介2.使用Axure制作ERP登录界面3.使用Asure完成左侧菜单栏4.使用Axuer完成公告栏5.使用Axuer完成左边侧边栏 1.Axure动态面板简介 在Axure RP中,动态面板是一种强大的交互设计工具,它允许你创建可交互的…

致远互联FE协作办公平台 editflow_manager.jsp 存在SQL注入漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 致远互联FE协作办公平台是一个专注于协同管理软件领域的数智化运营平台及云服务提供商。平台旨在为企业提供数字化转型和升级的解决方案,特别是针对大中型政府和企业客户。平台的主要特点包括开放共享…

Linux环境下HTTP请求的代码详解与实例

嘿,Linux狂热者们,是时候让我们在这个充满激情的平台上探索一下HTTP协议的奥秘了。我知道,对于这个我们每天都在使用,但却可能没深入了解过的HTTP,你们一定充满了好奇和期待。那么,让我们一起踏上这趟探索之…

LeetCode977有序数组的平方两种方法实现(java实现)

今天来分享的是LeetCode977有序数组的平方的实现方法,我们先来看下题目: 提示:我们在读题的时候一定要仔细,注意题目给定的条件是有序数组。 方法1:我们在看到题目的第一时间是无非是将数组每个元素进行平方&#xff…

高德地图+Vue中使用出现的问题

最近在做高德地图的逆向地理编码API出现了问题 按着官方的方式写代码运行时出现了问题,随后问了技术人员。 添加之后成功运行

云原生之深入解析Kubernetes中服务的性能

一、Pyroscope 简介 ① 什么是 Pyroscope? 开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因,为此通常需要可以通过日志和代码工具收集的信息。不幸的是,这种方法通常很耗时,并且不能提供有关潜在问题的足够详细信…

关于APP出海营销,有哪些开发者成功出圈?

NetMarvel 投身于开发者出海用户增长/广告变现业务已将近9个年头,帮助国内外众多开发者解决全球移动营销难题,最大化收益,实现全球范围内的极速增长。 NetMarvel有效助力Piggy Go、VNG、Candy Crack等游戏应用, Shopee、Tango等非…

四六级高频词组13

目录 词组 其他链接: 词组 551. beyond (all) question (without question) 毫无疑问 552. out of the question (impossible) 不可能的 553. in question (under discussion&…

Etsy运营秘籍——打造大卖店铺的九大技巧

在跨境电商的浩瀚海洋中,Etsy 作为一个注重手工制作与独特设计的平台,吸引了众多卖家的关注。在 Etsy 的世界里,成功运营小店需要更多的智慧和技巧。作为一位在 Etsy 上开店多年的老手,在这过程中也总结了不少经验,这篇…

案例066:基于微信小程序的家政预约设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

第P7周:咖啡豆识别(VGG-16复现)

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、前期工作 import …

【ET8框架入门】1.运行指南

主要学习网址 论坛地址为:https://et-framework.cn Git地址为:GitHub - egametang/ET: Unity3D Client And C# Server Framework 官方QQ群 : 474643097 多线程多进程框架设计-01预告_哔哩哔哩_bilibili 项目检出 检出项目切换到release8.0分支 Git…

网络安全——基于Snort的入侵检测实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤: 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 七、实验截图: 一、实验目的要求: 1、掌握…

visdom使用小技巧

visdom常用于深度学习迭代过程的可视化。在代码中,需要在相应位置增加如下代码: import visdomvis visdom.Visdom(envudomain_accuracy) #设置的环境名称vis.line(Xnp.array([epoch]), Ynp.array([domain_accuracy]),windomain_accuracy,updateappend,…