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

基于dify智能客服工作流的多智能体架构实战:高并发场景下的设计与优化

背景痛点&#xff1a;当智能客服遭遇流量洪峰 最近在负责一个电商大促期间的智能客服系统保障&#xff0c;真切体会到了传统单体智能体架构的“力不从心”。我们的客服机器人基于一个大语言模型构建&#xff0c;平时QPS在50左右时&#xff0c;响应时间&#xff08;RT&#xff0…...

Java 面试八股文(全网最全20w字)

一、Java 基础知识 1、Object 类相关方法 getClass 获取当前运行时对象的 Class 对象。hashCode 返回对象的 hash 码。clone 拷贝当前对象&#xff0c; 必须实现 Cloneable 接口。浅拷贝对基本类型进行值拷贝&#xff0c;对引用类型拷贝引用&#xff1b;深拷贝对基本类型进行…...

终极指南:如何用 YahooFinanceApi 快速获取免费金融数据

终极指南&#xff1a;如何用 YahooFinanceApi 快速获取免费金融数据 【免费下载链接】YahooFinanceApi A handy Yahoo! Finance api wrapper, based on .NET Standard 2.0 项目地址: https://gitcode.com/gh_mirrors/ya/YahooFinanceApi 你是否正在寻找一个简单、免费且…...

使用xrdp实现Windows远程桌面无缝连接WSL2中的Ubuntu24.04

1. 为什么需要远程桌面连接WSL2&#xff1f; 很多开发者习惯在Windows系统上使用WSL2运行Ubuntu进行开发工作&#xff0c;但默认情况下WSL2只提供命令行界面。虽然大多数开发任务可以通过命令行完成&#xff0c;但有些场景下图形界面会更方便&#xff1a; 运行需要GUI的应用程…...

避坑指南:Xilinx PCIe IP的lane反序问题与GT时钟约束的隐藏陷阱

Xilinx PCIe IP实战&#xff1a;破解Lane反序与GT时钟约束的五大核心难题 当你在Vivado中首次生成PCIe IP核时&#xff0c;可能会惊讶地发现硬件实际的lane顺序与代码中的定义完全相反。这不是bug&#xff0c;而是Xilinx默认的设计特性。更棘手的是&#xff0c;GT参考时钟的自动…...

HunyuanVideo-FoleyGPU算力优化实践:24GB显存利用率提升30%实测分析

HunyuanVideo-FoleyGPU算力优化实践&#xff1a;24GB显存利用率提升30%实测分析 1. 引言 在视频内容创作领域&#xff0c;HunyuanVideo-Foley作为一款集视频生成与AI音效合成于一体的先进工具&#xff0c;正逐渐成为专业创作者的首选。然而&#xff0c;其强大的功能背后是对硬…...

Alpamayo-R1-10B入门必看:VLA模型与传统端到端/模块化架构的本质差异

Alpamayo-R1-10B入门必看&#xff1a;VLA模型与传统端到端/模块化架构的本质差异 1. 引言&#xff1a;自动驾驶决策的十字路口 想象一下&#xff0c;你正在教一个新手司机开车。传统的方法有两种&#xff1a;一种是让他死记硬背所有交通规则和操作步骤&#xff08;模块化&…...

2026年高性价比个人网盘盘点:告别“空间焦虑”,谁才是真正的效率神器?

在预算有限的情况下寻找个人网盘&#xff0c;大多数人的第一反应是打开计算器&#xff0c;算出“每 GB 只要几分钱”。但作为一个在存储行业摸爬滚打多年的老兵&#xff0c;我要告诉你一个反直觉的事实&#xff1a;对于 90% 的办公族和学生来说&#xff0c;网盘的“空间大小”是…...

重度抑郁症多基因风险与大脑结构的关联,一项涵盖50,975名参与者的大型分析,涵盖11项队列

论文总结 这篇论文通过大规模国际合作&#xff0c;整合了11项研究、共50,975名参与者的数据&#xff0c;采用统一的多基因风险评分和神经影像分析流程&#xff0c;发现抑郁症的多基因风险与较低的颅内体积、较小的皮质表面积&#xff08;尤其是额叶和眶额叶区域&#xff09;以…...

专科ENSP毕设实战:基于eNSP的校园网高可用架构设计与配置避坑指南

最近在帮几个专科的学弟学妹看他们的eNSP毕业设计&#xff0c;发现大家普遍卡在几个地方&#xff1a;拓扑画得挺漂亮&#xff0c;但一配置就各种不通&#xff1b;协议背得滚瓜烂熟&#xff0c;但实际命令敲下去就报错&#xff1b;最后答辩演示时&#xff0c;一拔线整个网络就瘫…...