当前位置: 首页 > news >正文

RPC学习

一、什么是 RPC

RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的子程序或函数,就好像调用本地程序中的函数一样,无需程序员显式地去编写处理网络通信、数据序列化与反序列化等底层细节的代码。

简单来说,就是让不同机器上的程序之间能够方便地进行通信和交互,使得分布式系统的开发更加便捷高效。

二、为什么要用 RPC

  1. 分布式系统需求
    在现代的大型应用系统中,往往采用分布式架构,将不同的功能模块部署在不同的服务器上。例如,电商系统中订单处理、库存管理、用户认证等模块可能分别位于不同的机器。RPC 可以方便地实现这些不同模块之间的通信,让它们协同工作,就如同在一个单机系统中一样。

  2. 提高系统可扩展性
    当业务增长需要增加新的功能模块或者对现有模块进行扩展时,通过 RPC 可以轻松地将新模块添加到分布式系统中,并与其他模块进行交互,而不需要对整个系统进行大规模的重构。

  3. 资源共享与复用
    不同的应用程序或服务可能需要使用相同的功能,比如多个业务系统都需要进行数据加密、文件上传下载等功能。通过将这些公共功能封装成 RPC 服务并发布出去,其他应用可以方便地调用,实现资源的共享与复用。

  4. 跨语言协作
    在一个复杂的企业级应用环境中,不同的团队可能使用不同的编程语言来开发各自的模块。RPC 支持多种语言实现,使得不同语言编写的程序之间能够进行通信,例如用 Java 编写的服务可以被 Python 编写的客户端调用,促进了跨语言的协作。

三、常用的 RPC 框架

  1. gRPC

    • 由 Google 开发并开源,基于 HTTP/2 协议进行通信,性能较高。
    • 使用 Protocol Buffers 作为默认的接口定义语言和消息序列化格式,具有高效的序列化和反序列化能力。
    • 支持多种编程语言,如 Java、Python、C++、Go 等,方便在不同语言环境下开发分布式应用。
  2. Dubbo

    • 阿里巴巴开源的一款高性能、轻量级的 RPC 框架,在 Java 领域应用广泛。
    • 提供了丰富的服务治理功能,如服务注册与发现、负载均衡、容错处理等,能够很好地应对大规模分布式系统中的复杂情况。
    • 可以与 Spring 框架无缝集成,方便 Java 开发者使用。
  3. Thrift

    • 最初由 Facebook 开发,现在是 Apache 的开源项目。
    • 支持多种通信协议(如 TCP、UDP 等)和多种序列化方式(如二进制、JSON 等),具有较高的灵活性。
    • 同样支持多种编程语言,可用于构建跨语言的分布式应用。

四、RPC 原理

  1. 客户端调用过程

    • 当客户端程序需要调用远程服务时,首先会通过本地的代理(Stub)对象来发起调用。这个代理对象就像是远程服务在本地的一个替身,它隐藏了远程调用的底层细节。
    • 客户端将调用的参数进行序列化,即将参数对象转换为可以在网络上传输的格式,比如将 Java 对象序列化为字节流。
    • 然后通过网络将序列化后的参数发送给远程服务所在的服务器。
  2. 服务器端处理过程

    • 服务器端有一个对应的骨架(Skeleton)对象,它接收从客户端发送过来的序列化后的参数。
    • 首先对接收的参数进行反序列化,将其还原为服务器端能够处理的对象格式。
    • 然后根据调用的方法名等信息,找到对应的实际服务实现类,并执行相应的方法。
    • 执行完方法后,将返回结果进行序列化,再通过网络发送回客户端。
  3. 客户端接收结果

    • 客户端接收到服务器端返回的序列化后的结果后,进行反序列化操作,将其还原为本地能够处理的结果对象格式,最后将结果返回给调用的客户端程序部分,完成整个远程调用过程。

五、如何做到透明化远程服务调用

  1. 代理机制
    通过在客户端创建代理对象(Stub),让客户端程序感觉就像是在调用本地的函数一样。代理对象负责处理与远程服务通信的所有细节,包括参数序列化、网络发送、接收结果、反序列化等,对客户端程序隐藏了这些复杂的远程调用过程。

  2. 接口定义一致性
    在客户端和服务器端定义相同的服务接口,确保双方对于服务的方法名、参数类型、返回值类型等有一致的理解。这样客户端按照接口定义进行调用,服务器端按照接口定义进行实现和处理,使得远程调用过程在逻辑上更加清晰和一致,仿佛是在本地进行的调用。

  3. 服务注册与发现机制
    采用服务注册与发现系统,如 Zookeeper、Consul 等。服务器端将自己提供的服务注册到注册中心,客户端通过查询注册中心来获取需要调用的服务的地址等信息。这样,客户端不需要事先知道远程服务的确切位置,只要知道服务的名称等标识信息,就可以通过注册中心找到并调用相应的服务,进一步增强了远程服务调用的透明性。

六、如何对消息进行编码和解码

  1. 编码(序列化)

    • 选择合适的序列化方式:根据应用场景和需求选择合适的序列化协议,如 JSON、Protocol Buffers、XML 等。不同的序列化方式有不同的特点,例如 JSON 格式简单易懂,适合于与 Web 应用交互;Protocol Buffers 则具有高效的序列化和反序列化性能,适合于对性能要求较高的场景。
    • 按照序列化协议规则进行操作:一旦确定了序列化协议,就需要按照该协议的具体规则来对消息对象进行操作。比如,对于 JSON 序列化,需要将对象的属性转换为 JSON 格式的键值对;对于 Protocol Buffers,需要先定义好消息结构的.proto 文件,然后根据文件中的定义将对象进行序列化。
  2. 解码(反序列化)

    • 识别序列化格式:首先要确定接收到的消息是采用哪种序列化格式进行编码的,这通常可以通过消息头或者约定的标识来判断。
    • 按照对应序列化协议规则进行反操作:根据确定的序列化格式,按照其反序列化的规则将接收到的消息还原为原始的对象格式。例如,对于 JSON 序列化的消息,需要将 JSON 格式的键值对转换为对象的属性;对于 Protocol Buffers,需要根据.proto 文件中的定义将接收到的字节流反序列化 为对象。

七、如何发布自己的服务

  1. 定义服务接口
    首先要明确自己要发布的服务提供哪些功能,然后使用合适的接口定义语言(如 Java 中的接口、Protocol Buffers 中的.proto 文件等)来定义服务的接口,包括服务的方法名、参数类型、返回值类型等信息。

  2. 实现服务接口
    根据定义好的服务接口,在服务器端编写具体的服务实现类,实现接口中定义的各个方法,这些方法将包含具体的业务逻辑来处理客户端的调用请求。

  3. 选择 RPC 框架
    根据项目的需求和特点,选择合适的 RPC 框架,如前面提到的 gRPC、Dubbo、Thrift 等。不同的框架有不同的特点和优势,需要综合考虑性能、功能、支持的编程语言等因素。

  4. 配置服务信息
    在选定的 RPC 框架中,按照框架的要求配置服务的相关信息,如服务的名称、端口号、服务所在的主机地址等,以便于其他客户端能够找到并调用该服务。

  5. 注册服务
    将服务注册到服务注册与发现系统(如 Zookeeper、Consul 等)中,这样客户端就可以通过查询注册中心来获取服务的相关信息,从而实现对服务的调用。在注册过程中,需要提供服务的名称、地址、端口号等关键信息。

  6. 启动服务
    完成上述步骤后,启动服务,使其处于可被客户端调用的状态。服务启动后,就可以等待客户端的调用请求,并按照服务实现类中的业务逻辑进行处理,将处理结果返回给客户端。

相关文章:

RPC学习

一、什么是 RPC RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的子程序或函数,就好像调用本地程序中的函数一样,无需程序…...

coe文件转mif(c语言)

1 mif文件格式 DEPTH=1024; --The size of data in bits WIDTH=16; --The size of memory in words ADDRESS_RADIX = DEC; --The radix for address values DATA_RADIX = UNS...

【leetcode】动态规划

31. 873. 最长的斐波那契子序列的长度 题目&#xff1a; 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#xff0c;都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr &#xff0…...

介绍一下atoi(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atoi(arr)&#xff1b;是返回整数(int型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atoi(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdlib.h>//atoi(arr); 返 <stdlib> int main(…...

docker入门学习笔记

docker的定义 docker是一个用于构建、运行、传送 应用程序的平台。 为什么要使用docker &#xff1f; 在开发测试库环境中测试成功后&#xff0c;打包成集装箱&#xff0c;到生产环境也是能够成功的。而传统的安装方式不仅繁琐&#xff0c;并且在测试环境安装后&#xff0c;到…...

使用Python和Pybind11调用C++程序(CMake编译)

目录 一、前言二、安装 pybind11三、编写C示例代码四、结合Pybind11和CMake编译C工程五、Python调用动态库六、参考 一、前言 跨语言调用能对不同计算机语言进行互补&#xff0c;本博客主要介绍如何实现Python调用C语言编写的函数。 实验环境&#xff1a; Linux gnuPython3.10…...

tableau-制作30个图表

制作条形图 步骤: 1、横轴是数值,对应了某一个度量值,纵轴是一个标签 战区的成交额,条形图横轴是战区,纵轴是成交额 下钻条形图 1、增加业务架构-战区右键点击,分层结构,增加分层结构 调整业务架构,将战区,城市,小组移动到业务架构下方 此时的条形图上方有➕号展开后…...

2024APMCM亚太杯数学建模C题【宠物行业】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年APMCM亚太地区大学生数学建模竞赛C题的成品论文。 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 10 一、问题重述 14 二&#xff0e;问题分析 15 2.1问题一 15 2.2问题二 15 2.3问题三…...

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…...

推荐一款龙迅HDMI2.0转LVDS芯片 LT6211UX LT6211UXC

龙迅的HDMI2.0转LVDS芯片LT6211UX和LT6211UXC是两款高性能的转换器芯片&#xff0c;它们在功能和应用上有所差异&#xff0c;同时也存在一些共同点。以下是对这两款芯片的详细比较和分析&#xff1a; 一、LT6211UX 主要特性&#xff1a; HDMI2.0至LVDS和MIPI转换器。HDMI2.0输…...

libmodbus 源码学习笔记

1.核心函数_框架_数据结构 整个通信的过程 就是上面这个框架 下面就是具体过程 <1> 主设备 我们首先要初始化 我们要使用的串口 然后 设置我们要访问的哪一个设备 最后打开串口 <2>从机设备 也是我们要初始化我们的串口 然后随后立即设置我们的串口设备地址 最后…...

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…...

Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)

Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它专门设计用于Web应用程序&#xff0c;并专注于视图层。Vue允许开发人员创建可重用的组件&#xff0c;并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统&#xff0c;用于高效地渲染和重新渲染组件。Vue以…...

Mybatis 执行存储过程,获取输出参数的值

数据库环境&#xff1a;SQL Server 2008 R2 存储过程 alter procedure proc_generateOuterApplyId acceptType varchar(4),acceptGroupId int,outerApplyId varchar(20) output as begin set nocount onset outerApplyId 24GD6688--select outerApplyId as …...

RAG架构类型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Oracle 数据库 IDENTITY 列的性能选项

在上一篇文章Oracle 数据库 IDENTITY 列中&#xff0c;我们介绍了Oracle IDENTITY列的基础知识。本文将介绍IDENTITY列的几个性能选项。由于IDENTITY列内部使用sequence机制&#xff0c;因此也等同于是sequence的性能选项。 由于sequence是递增的&#xff0c;在高并发时&#…...

计算(a+b)/c的值

计算&#xff08;ab&#xff09;/c的值 C语言代码C语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定3个整数a、b、c&#xff0c;计算表达式(ab)/c的值&#xff0c;/是整除运算。 输入 输入仅一行&…...

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段&#xff1a; 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;并通过argparse设置了输入图像和面部标记预测器的参数。…...

unity | 动画模块之卡片堆叠切换

一、预览动画 可以放很多图&#xff0c;可以自己往后加&#xff0c;可以调图片x轴和y轴间距&#xff0c;可以调图片飞出方向&#xff0c;可以调堆叠方向。 图1 图片堆叠动画预览 二、纯净代码 有粉丝问我这个效果&#xff0c;最近很忙&#xff0c;没有时间细写&#xff0c;先…...

前端开发工程师需要学什么?

‌前端开发工程师需要学习的主要内容包括HTML、CSS、JavaScript、前端框架、响应式设计、性能优化、版本控制等。‌ HTML/CSS/JavaScript ‌HTML‌&#xff1a;是网页的骨架&#xff0c;负责网页的结构和内容。‌CSS‌&#xff1a;用于美化网页&#xff0c;设计样式和布局。‌…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...