RPC基础

RPC基础知识

RPC 是什么?

RPC(Remote Procedure Call) 即远程过程调用,通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。

为什么要 RPC ? 因为,两个不同的服务器上的服务提供的方法不在一个内存空间,所以,需要通过网络编程才能传递方法调用所需要的参数。并且,方法调用的结果也需要通过网络编程来接收。但是,如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为,我们需要考虑底层传输方式(TCP 还是 UDP)、序列化方式等等方面。

RPC 能帮助我们做什么呢? 简单来说,通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。并且!我们不需要了解底层网络编程的具体细节。

举个例子:两个不同的服务 A、B 部署在两台不同的机器上,服务 A 如果想要调用服务 B 中的某个方法的话就可以通过 RPC 来做。

一言蔽之:RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。

RPC 的原理是什么?

为了能够帮助小伙伴们理解 RPC 原理,我们可以将整个 RPC 的 核心功能看作是下面 👇 5 个部分实现的:

  1. 客户端(服务消费端):调用远程方法的一端。
  2. 客户端 Stub(桩):这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
  3. 网络传输:网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最近基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
  4. 服务端 Stub(桩):这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类。
  5. 服务端(服务提供端):提供远程方法的一端。

具体原理图如下,后面我会串起来将整个 RPC 的过程给大家说一下。

RPC原理图

  1. 服务消费端(client)以本地调用的方式调用远程服务;
  2. 客户端 Stub(client stub) 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):RpcRequest
  3. 客户端 Stub(client stub) 找到远程服务的地址,并将消息发送到服务提供端;
  4. 服务端 Stub(桩)收到消息将消息反序列化为 Java 对象: RpcRequest
  5. 服务端 Stub(桩)根据RpcRequest中的类、方法、方法参数等信息调用本地的方法;
  6. 服务端 Stub(桩)得到方法执行结果并将组装成能够进行网络传输的消息体:RpcResponse(序列化)发送至消费方;
  7. 客户端 Stub(client stub)接收到消息并将消息反序列化为 Java 对象:RpcResponse ,这样也就得到了最终结果。over!

相信小伙伴们看完上面的讲解之后,已经了解了 RPC 的原理。

有哪些常见的 RPC 框架?

我们这里说的 RPC 框架指的是可以让客户端直接调用服务端方法,就像调用本地方法一样简单的框架,比如我下面介绍的 Dubbo、Motan、gRPC 这些。 如果需要和 HTTP 协议打交道,解析和封装 HTTP 请求和响应。这类框架并不能算是“RPC 框架”,比如 Feign。

Dubbo

img

Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,
涵盖 Java、Golang 等多种语言 SDK 实现。

Dubbo 提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,支持 Triple 协议(基于 HTTP/2 之上定义的下一代 RPC 通信协议)、应用级服务发现、Dubbo Mesh (Dubbo3 赋予了很多云原生友好的新特性)等特性。

img

Dubbo 是由阿里开源,后来加入了 Apache 。正是由于 Dubbo 的出现,才使得越来越多的公司开始使用以及接受分布式架构。

Dubbo 算的是比较优秀的国产开源项目了,它的源码也是非常值得学习和阅读的!

  • GitHub:https://github.com/apache/incubator-dubboopen in new window
  • 官网:https://dubbo.apache.org/zh/

Motan

Motan 是新浪微博开源的一款 RPC 框架,据说在新浪微博正支撑着千亿次调用。不过笔者倒是很少看到有公司使用,而且网上的资料也比较少。

很多人喜欢拿 Motan 和 Dubbo 作比较,毕竟都是国内大公司开源的。笔者在查阅了很多资料,以及简单查看了其源码之后发现:Motan 更像是一个精简版的 Dubbo,可能是借鉴了 Dubbo 的思想,Motan 的设计更加精简,功能更加纯粹。

不过,我不推荐你在实际项目中使用 Motan。如果你要是公司实际使用的话,还是推荐 Dubbo ,其社区活跃度以及生态都要好很多。

  • 从 Motan 看 RPC 框架设计:http://kriszhang.com/motan-rpc-impl/open in new window
  • Motan 中文文档:https://github.com/weibocom/motan/wiki/zh_overview

gRPC

img

gRPC 是 Google 开源的一个高性能、通用的开源 RPC 框架。其由主要面向移动应用开发并基于 HTTP/2 协议标准而设计(支持双向流、消息头压缩等功能,更加节省带宽),基于 ProtoBuf 序列化协议开发,并且支持众多开发语言。

何谓 ProtoBuf? ProtoBuf( Protocol Buffer)open in new window 是一种更加灵活、高效的数据格式,可用于通讯协议、数据存储等领域,基本支持所有主流编程语言且与平台无关。不过,通过 ProtoBuf 定义接口和数据类型还挺繁琐的,这是一个小问题。

img

不得不说,gRPC 的通信层的设计还是非常优秀的,Dubbo-go 3.0open in new window 的通信层改进主要借鉴了 gRPC。

不过,gRPC 的设计导致其几乎没有服务治理能力。如果你想要解决这个问题的话,就需要依赖其他组件比如腾讯的 PolarisMesh(北极星)了。

  • GitHub:https://github.com/grpc/grpcopen in new window
  • 官网:https://grpc.io/open in new window

Thrift

Apache Thrift 是 Facebook 开源的跨语言的 RPC 通信框架,目前已经捐献给 Apache 基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于 thrift 研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

Thrift支持多种不同的编程语言,包括C++JavaPythonPHPRuby等(相比于 gRPC 支持的语言更多 )。

  • 官网:https://thrift.apache.org/open in new window
  • Thrift 简单介绍:https://www.jianshu.com/p/8f25d057a5a9

作者声明

如有问题,欢迎指正!

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

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

相关文章

Hadoop学习笔记(HDP)-Part.07 安装MySQL

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

无人机停机坪的主要功能有哪些

随着无人机行业领域的不断完善,无人机停机坪作为一项关键基础设施,正发挥着越来越重要的作用。无人机停机坪也叫无人机机巢、无人机机库、无人机机场。无人机停机坪不仅是无人机的“家”,更是其高效运行的关键环节。让我们一同探索无人机停机…

探讨电能质量监测与治理解决方案在半导体行业的设计与应用-安科瑞 蒋静

摘要:在国家鼓励半导体材料国产化的政策导向下,本土半导体材料厂商不断提升半导体产品技术水平和研发能力,逐渐打破了国外半导体厂商的垄断格局,推进中国半导体材料国产化进程。半导体产品的制造使用到的设备如单晶炉、多晶炉等都…

Isaac Sim教程01 Isaac Sim介绍

Isaac Sim 介绍 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The author holds all…

【MySQL】基本安装配置

1 基础知识 1.1 MySQL安装 下载地址:https://dev.mysql.com/downloads/mysql/ 1.1.1 安装过程 配置环境变量(和配置Java8的环境变量如出一辙)在MySQL解压文件夹下,导入my.ini文件,与bin目录同级,具体文…

七、Linux服务器集群搭建

详见《Linux服务器集群搭建》 【往期回顾】 一、Linux系统概述和安装 二、Linux基础命令 三、Linux高级命令 四、虚拟机网络配置 五、Linux基础软件安装 六、shell编程

vivado时序方法检查1

TIMING-1 &#xff1a; 时钟修改块上的时钟波形无效 在 <cell_type> 输出 <pin_name> 上指定的时钟 <clock_name> 的时钟波形无效 &#xff0c; 与时钟修改块 (CMB) 设置不匹配。该时钟波形为 <VALUE> 。期望的波形为 <VALUE> 。 描述…

推荐6款本周 火火火火 的开源项目

本周 GitHub项目圈选 节选自微博、知乎、掘金等社区。 &#x1f525;&#x1f525;&#x1f525;本周推荐的开源项目是&#xff1a; kopia 日常备份工具 screenshot-to-code 截屏生成代码 MiniSearch 全文搜索 clone-voice 声音克隆 NvChad 高颜值终端 DB-GPT-Hub 文本到…

Java中子类都继承父类的什么?

1.构造方法 构造方法不可以被继承的&#xff0c;为什么呢&#xff1f;应为名称的定义&#xff0c;构造方法是一类名称与类名一致&#xff0c;无返回值和类型修饰的一种。所以如果子类继承父类的构造方法的话&#xff0c;那么就违背了构造方法的规定。 2.成员属性 成员属性是…

Linux下的java环境搭建

1&#xff0c;安装jdk 上传linux使用的jdk到/opt目录下 解压tar -zxvf文件 配置环境变量 vim /etc/profile 在文件中添加 export JAVA_HOME/opt/jdk8 export PATH$PATH:$JAVA_HOME/bin 使文件生效 source /etc/profile 2,安装tomcat 将tomcat包解压&#xff0c;进入bi…

使用gunicorn部署django项目时,发现静态文件加载失败问题

本文主要介绍如何配置Niginx加载Django的静态资源文件&#xff0c;也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置&#xff1a; STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 2、将 STATICFILES_DIRS [ os.p…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…

智能优化算法应用:基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

混音编曲软件tudio One 6.5.1 保姆级安装教程

根据软件大数据显示De-Esser驯服人声嘶嘶声和其他高频声音&#xff0c;和其他 Studio One 中新的去实体插件一样高效且直观易用&#xff0c;使用“收听”按钮查找有问题的频率&#xff0c;然后使用相关的旋钮和 S-Mon 功能拨入 S-Reduce 量即可。实际上我们可以这样讲工作流和协…

【深度学习笔记】08 欠拟合和过拟合

08 欠拟合和过拟合 生成数据集对模型进行训练和测试三阶多项式函数拟合&#xff08;正常&#xff09;线性函数拟合&#xff08;欠拟合&#xff09;高阶多项式函数拟合&#xff08;过拟合&#xff09; import math import numpy as np import torch from torch import nn from d…

公有云迁移研究——AWS Translate

大纲 1 什么是Translate2 Aws Translate是怎么运作的3 Aws Translate和Google Translate的区别4 迁移任务4.1 迁移原因 5 Aws Translate的Go demo6 迁移中遇到的问题6.1 账号和权限问题&#xff1a;6.2 小语种 1 什么是Translate Translate是一种文本翻译服务&#xff0c;它使…

xcode opencv

1、导入报错 Undefined symbols: linker command failed with exit code 1 (use -v to see invocation) 直接添加如下图内容即可

<JavaEE> synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法

目录 一、synchronized 关键字简介 二、synchronized 的特点 -- 互斥 三、synchronized 的特点 -- 可重入 四、synchronized 的使用示例 4.1 修饰代码块 - 锁任意实例 4.2 修饰代码块 - 锁当前实例 4.3 修饰普通方法 - 锁方法所在实例 4.4 修饰代码块 - 锁指定类对象 …

【从零开始学习JVM | 第二篇】字节码文件的组成

前言&#xff1a; 字节码作为JAVA跨平台的主要原因&#xff0c;熟练的掌握JAVA字节码文件的组成可以帮助我们解决项目的各种问题&#xff0c;并且在面试中&#xff0c;关于字节码部分的内容却是一大考点和难点&#xff0c;因此我们在这里穿插讲解一下字节码文件的组成。 目录 …

16、观察者模式(Observer Pattern)

观察者&#xff08;Observer Pattern&#xff09; 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。主要解决一个对象状态改变给其他对象通知的问题&#xff0c;而且要考虑到易用和低耦合&…