RPC 简介

RPCRemote Procedure Call,远程过程调用)是一种通过网络请求执行远程服务器上的代码的技术,使得开发者可以调用远程系统中的函数,就像调用本地函数一样。它隐藏了底层网络通信的细节,简化了分布式系统的开发。


RPC 的工作原理

  1. 客户端调用本地代理(Stub)

    • 客户端调用一个本地函数。
    • 本地代理负责将函数调用转换为网络请求。
  2. 序列化请求

    • 调用的参数和函数信息被打包(序列化)成网络数据包。
  3. 发送请求

    • 数据包通过网络传输到服务器。
  4. 服务器处理

    • 服务器的代理(Stub)接收到请求,反序列化为本地调用。
    • 调用相应的函数并返回结果。
  5. 返回结果

    • 返回值通过相同的流程(序列化、传输、反序列化)回到客户端。

常见的 RPC 框架

1. gRPC
  • 开发者:Google。
  • 特点
    • 使用 Protocol Buffers(protobuf)作为数据交换格式。
    • 支持多种编程语言(如 Python、Java、Go)。
    • 高效的二进制序列化格式。
  • 应用场景
    • 微服务架构、实时通信。
2. Thrift
  • 开发者:Apache。
  • 特点
    • 支持多语言代码生成。
    • 提供灵活的传输和序列化协议。
  • 应用场景
    • 跨语言通信。
3. JSON-RPC / XML-RPC
  • 特点
    • 轻量级,使用 JSON 或 XML 格式传输数据。
  • 应用场景
    • 简单的远程调用场景。
4. Dubbo
  • 开发者:阿里巴巴。
  • 特点
    • 专注于 Java 服务之间的 RPC 调用。
    • 支持服务发现和治理。
  • 应用场景
    • 分布式系统。

RPC 的优势

  1. 透明性:调用远程函数与本地函数无异,屏蔽底层网络细节。
  2. 高效性:支持二进制协议(如 gRPC)以提高性能。
  3. 跨语言支持:许多 RPC 框架支持多种编程语言。

RPC 的挑战

  1. 网络问题:调用可能因网络问题而失败。
  2. 调试复杂性:排查远程调用失败的原因可能较复杂。
  3. 序列化/反序列化开销:需要额外的计算和带宽。

RPC 与其他技术的对比

  • 与 REST
    • RPC 更注重函数调用,REST 是以资源为中心。
    • RPC 通常使用二进制协议,REST 使用 JSON 或 XML。
  • 与消息队列
    • RPC 是同步调用,消息队列一般是异步通信。

示例(使用 gRPC 的简单例子)

定义服务(.proto 文件):
syntax = "proto3";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply);
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}
生成代码并实现服务(Python 示例):
import grpc
from concurrent import futures
import greeter_pb2
import greeter_pb2_grpcclass GreeterService(greeter_pb2_grpc.GreeterServicer):def SayHello(self, request, context):return greeter_pb2.HelloReply(message=f"Hello, {request.name}!")server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
greeter_pb2_grpc.add_GreeterServicer_to_server(GreeterService(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
客户端调用:
import grpc
import greeter_pb2
import greeter_pb2_grpcchannel = grpc.insecure_channel('localhost:50051')
stub = greeter_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greeter_pb2.HelloRequest(name="World"))
print(response.message)

RPC 是现代分布式系统的重要基础设施之一,适用于需要高效、透明调用的场景。

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

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

相关文章

Unity ShaderGraph中Lit转换成URP的LitShader

ShaderGraph中的LitShader如下: 在顶点和片元着色器暴露出了上图中的几个参数,要转换成URPLitShaderLab,首先要找到这几个参数,打开LitShader,找到第一个Pass,可以看到下图中的顶点和片元的定义函数,还有引…

从漏洞管理到暴露管理:网络安全的新方向

在网络安全的快速发展中,传统的漏洞管理仍然是防御体系的基石。然而,面对日益复杂的威胁和不断增长的漏洞数量,单靠漏洞优先级评分(如VPR)已经无法满足现代安全需求。暴露管理这一全新的思维模式正在引领企业从被动应对…

中职网络建设与运维ansible服务

ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本,可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator,点击Environment,再点击new(new是我下载anaconda的文件夹名称),然后点击创建 点击绿色按钮,并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具,在上篇…

【WPS】【WORDEXCEL】【VB】实现微软WORD自动更正的效果

1. 代码规范方面 添加 Option Explicit:强制要求显式声明所有变量,这样可以避免因变量名拼写错误等情况而出现难以排查的逻辑错误,提高代码的健壮性。使用 On Error GoTo 进行错误处理:通过设置错误处理机制,当代码执行…

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一

2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 9.1 检查点(Checkpoint) 9.1.1 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我…

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明: –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明: –…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压,通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块(ad_10bit_to_16bit):为了方便数据传输,数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

【进程与线程】进程的状态

在操作系统中,进程是执行中的程序实例。进程在其生命周期中会经历不同的状态,操作系统根据进程的执行情况和资源调度,将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。 进程的状态:就绪态&#xff0…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上,小米宣布全面开源 Vela 操作系统。同时,OpenVela 项目正式上线 GitHub 和 Gitee,采用的是比较宽松的 Apache 2.0 协议,这意味着全球的开发者都可以参与到 Vela…

数字人助力企业出海增长,魔珐科技亮相2025晋江跨境电商峰会

近年来,越来越多中国企业纷纷投身于跨境电商行业,推动其规模实现了跨越式的发展。如今,跨境出海仍在加速的过程中,其中蕴涵了巨大的潜力和机遇。 1月3日,“跨境新域 聚势发展——2025晋江跨境电商年度发展峰会暨晋江市…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置:Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考:使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面,生成了证书: 5.给浏览器安装Jmeter代理的证书…

【Kotlin】上手学习之类型篇

一、类型 1.1 基本类型 主要分为 数字及其无符号版布尔字符字符串数组 1.1.1 数字 整数类型 Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类型,因此值的范围也不同: 类型大小(比特数)最小…

Android 高版本如何获取App安装列表?

有个需求需要获取App内的安装列表,但是现在在高版本Android中,只能获取到一部分App效果,我获取的代码如下: val calendar Calendar.getInstance()val packageManager context.packageManagerval usageStatsManager context.getSystemService(Context.USAGE_STATS_SERVICE) …

BIO、NIO、AIO

第一章 BIO、NIO、AIO课程介绍 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺…

VUE学习笔记4__安装开发者工具

https://chrome.zzzmh.cn/index 安装后需要关闭所有浏览器并重启 再次打开检查会看到vue标签&#xff0c;方便调试修改 如果安装后找不到vue标签&#xff0c;请尝试下载历史版本&#xff0c;这里用的是6.4.5 <!doctype html> <html lang"en"> <head&…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …