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

网络常见命令

一.添加ip地址 &#xff08;1&#xff09;先进入端口号 interface 端口号 &#xff08;2&#xff09;添加ip地址 IP address xxx.xxx.x.x 主机位 二、查看路由表&#xff08;查看192.168.3.1&#xff09; display ip routing-table 192.168.3.1 三、宣告&#xff08;宣告完后…...

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…...

Flume和kafka的整合:使用Flume将日志数据抽取到Kafka中

文章目录 1、Kafka作为Source【数据进入到kafka中&#xff0c;抽取出来】2、kafka作为Sink 【数据从别的地方抽取到kafka里面】 1、Kafka作为Source【数据进入到kafka中&#xff0c;抽取出来】 kafka源 --> memory --> 控制台&#xff1a; a1.sources r1 a1.sinks k1…...

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…...

ScreenshotToCode安装教程

网页截图生成代码&#xff0c;我测试的效果一般 快速安装教程如下 1&#xff0c;首先你得有OpenAI的账号 国内用这个代理就可以&#xff1a; https://www.closeai-asia.com/ 充值一块钱&#xff0c;在本项目中可以生成两次 2&#xff0c;下载程序 下载程序压缩包&#xff1…...

最佳实践:如何在 Vue.js 项目中使用 Jest 进行单元测试

前言 随着应用程序规模和复杂性的增加&#xff0c;保证代码质量和稳定性变得愈发重要。单元测试作为软件测试的一部分&#xff0c;能够有效地捕捉代码中的错误&#xff0c;防止在开发过程中引入新的 Bug。在众多测试框架中&#xff0c;Jest 因其易用性、强大功能以及与 Vue.js…...

MySQL 与 MongoDB 存储差异分析

MySQL 与 MongoDB 存储差异分析&#xff1a;为什么随机生成数据的存储空间不同&#xff1f; 在实际应用中&#xff0c;我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中&#xff0c;数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说…...

【2024】前端学习笔记19-ref和reactive使用

学习笔记 1.ref2.reactive3.总结 1.ref ref是 Vue 3 中用来创建响应式引用的一个函数&#xff0c;通常用于基本数据类型&#xff08;如字符串、数字、布尔值等&#xff09;或对象/数组的单一值。 ref特点&#xff1a; ref 可以用来创建单个响应式对象对于 ref 包裹的值&…...

2024.11.26总结

今晚考了个科目四&#xff0c;只准备了半天&#xff0c;考试的时候几乎都是乱选的&#xff0c;选完后就走人了&#xff0c;相当于白白浪费了一次机会。有时候感觉上班太累了&#xff0c;不知道是心累&#xff0c;还是其他方面。 思来想去&#xff0c;还是决定继续在CSDN上输出…...

《通俗易懂 · JSqlParser 解析和构造SQL》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流…...

网站开发工程师培训班/网络营销总结

升压IC芯片在诸多电子电路中均有所应用&#xff0c;在现代生活中&#xff0c;升压芯片是不可或缺的器件之一。对于升压芯片&#xff0c;想必大家均具备一定了解。在本文中&#xff0c;将主要为大家讲解FSB628升压IC芯片&#xff0c;不知大家对这款升压芯片以及其应用是否熟悉。…...

郑州建设网站费用/棋牌软件制作开发多少钱

从最开始的&#xff0c;SSH到SpringMVC&#xff0c;随着Spring的发展&#xff0c;使得开发越来越容易了&#xff0c;SpringBoot已经成为Java程序员必会的一项&#xff0c;以下给小伙伴整理了30道相关面试题&#xff0c;也可以作为知识点&#xff0c;学习收藏起来。1.什么是Spri…...

wordpress模板淘宝客模板/小说搜索风云榜

表面看起来&#xff0c;如今是以太坊的至暗时刻&#xff0c;而黎明前往往是最黑暗的。种种迹象表明&#xff0c;ETH 2.0 或许会成为以太坊下一个爆发点。文 | 秦晓峰 运营 | 盖遥 编辑 | 卢晓明出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09;作为最早的…...

汕头 网站/品牌宣传

在我们平时工作中经常会遇到要操作Excel的功能&#xff0c;比如导出个用户信息或者订单信息的Excel报表。你肯定听说过POI这个东西&#xff0c;可以实现。但是POI实现的API确实很麻烦&#xff0c;它需要写那种逐行解析的代码&#xff08;类似Xml解析&#xff09;。今天给大家推…...

男男床做第一次视频网站/辽源seo

《五年级信息技术期末测试题(答案)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《五年级信息技术期末测试题(答案)(2页珍藏版)》请在人人文库网上搜索。1、五年级信息技术期末测试题一、填空题(每空 4 分&#xff0c;共 20 分)1、创建新网页的快捷键是 CtrlN2、如果…...

网站没收录了怎么办/有什么软件可以推广

进来学习C语言碰到了指针&#xff0c;着实学了一段时间&#xff0c;搞不出个头绪&#xff0c;今日感觉有些眉目&#xff0c;来此做个记录&#xff0c;也望能给困顿的人一起分享下感悟。学习指针还要从变量&#xff0c;数组&#xff0c;函数的定义这些基础说起。如&#xff1a;i…...