当前位置: 首页 > 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;设计样式和布局。‌…...

STM32CubeMX LL库配置外部中断,从按键消抖到中断嵌套的实战避坑指南

STM32CubeMX LL库外部中断深度优化&#xff1a;从硬件消抖到中断嵌套的工程实践 当你的嵌入式系统需要实时响应外部事件时&#xff0c;外部中断(EXTI)往往是最高效的选择。但在实际项目中&#xff0c;简单配置EXTI只是开始——按键抖动导致的误触发、中断优先级冲突引发的死锁、…...

如何让旧款iOS设备重获新生:Legacy-iOS-Kit终极指南

如何让旧款iOS设备重获新生&#xff1a;Legacy-iOS-Kit终极指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Le…...

哪个降AI软件好?2026年4款主流降AI工具按场景对位横评!

哪个降AI软件好&#xff1f;2026年4款主流降AI工具按场景对位横评&#xff01; 「哪个降 AI 软件好」没有标准答案。学生最常踩的坑是把这个问题简化成「哪款最便宜」或者「哪款最有效」——其实好不好用看你的场景。学校送知网严标准、送维普重灾区、自媒体被判 AI、本科双重问…...

XUnity.AutoTranslator:5步实现Unity游戏实时翻译的完整解决方案

XUnity.AutoTranslator&#xff1a;5步实现Unity游戏实时翻译的完整解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过心仪的外语游戏&#xff1f;XUnity.AutoTransla…...

别再搞混了!海康威视工业相机SDK和安防SDK开发环境配置避坑指南(VS2019+MVS3.2)

海康威视工业相机开发避坑指南&#xff1a;从硬件选型到SDK环境配置全解析 第一次接触海康威视工业相机的开发者&#xff0c;往往会被网上铺天盖地的安防相机教程带偏方向。我曾亲眼见过团队花费三天时间尝试用iVMS-4200客户端激活一台根本不需要密码的工业相机&#xff0c;也调…...

如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流?

如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流&#xff1f; 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: h…...

爱普生SG-8201CJ石英可编程振荡器:精准频率控制专家首选

在电子设计中&#xff0c;晶振的选择往往是决定系统性能的关键因素之一。特别是在需要高精度和稳定性的应用中&#xff0c;选择一款合适的晶振尤为重要。今天&#xff0c;我们就来聊聊爱普生&#xff08;Epson&#xff09;的SG-8201CJ石英可编程振荡器&#xff0c;看看它如何成…...

H3C交换机三层组网配置保姆级复盘:从拓扑设计到排错命令一条龙

H3C交换机三层组网实战指南&#xff1a;从规划到排错的完整工作流 当企业网络规模逐渐扩大&#xff0c;部门间的隔离与互通需求变得复杂时&#xff0c;二层交换网络往往显得力不从心。这时&#xff0c;三层交换技术的引入就成为网络工程师的必修课。本文将带你深入一个真实的办…...

揭秘SITS 2026调度内核:如何用1个轻量CRD替代3类Operator+2个Admission Webhook,实现离线推理任务零配置交付?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生批处理优化&#xff1a;SITS 2026离线推理任务调度策略 SITS 2026&#xff08;Scalable Intelligent Task Scheduler&#xff09;是专为AI原生工作负载设计的离线推理调度引擎&#xff0c;其核心…...

开源AI智能体记忆服务:构建持久化共享记忆中枢

1. 项目概述&#xff1a;为AI智能体构建持久化共享记忆中枢 如果你正在构建或使用基于LangGraph、CrewAI、AutoGen这类框架的多智能体系统&#xff0c;或者你厌倦了每次与Claude、Cursor等AI助手开启新会话时都要重复解释项目背景&#xff0c;那么你很可能正面临一个核心痛点&…...