rpc简介

RPC (Remote Procedure Call)

RPC 是一种分布式计算技术,允许一个计算机程序(客户端)在本地调用另一个计算机程序(服务器)的方法或函数,就像调用本地代码一样,尽管这些程序可能运行在不同的网络环境中,甚至可能使用不同的操作系统和编程语言。RPC 提供了一种抽象,让开发者无需直接处理底层网络通信细节(如 socket 编程、序列化、反序列化、错误处理等),就能实现跨进程、跨网络的服务调用。

核心概念与工作原理:

  1. 接口定义:首先,需要定义服务接口(包括方法名、参数类型、返回类型等),描述客户端可以调用的远程操作。接口定义通常是平台无关的,可以通过 IDL(Interface Definition Language)如 Google 的 Protocol Buffers(protobuf)来编写。

  2. 客户端 stub:客户端拥有一个本地的代理对象(stub),它实现了服务接口。当客户端调用这个 stub 的方法时,实际发生的是对远程服务的调用请求封装成网络消息发送出去。

  3. 服务端 stub:服务端同样有一个 stub,它接收来自客户端的请求消息,解封请求数据,调用实际的服务逻辑,然后将执行结果打包成响应消息返回给客户端。

  4. 网络通信:客户端和服务端通过网络协议(如 TCP/IP)交换请求和响应消息。这些消息需要经过序列化(将数据结构转换为适合网络传输的字节流)和反序列化(将字节流还原为原数据结构)过程。

  5. 透明性:对于客户端程序员而言,调用远程服务就如同调用本地函数一样,无需关心网络连接、数据传输、错误处理等复杂细节。RPC 框架负责处理这些底层任务,提供了一种跨网络、跨语言的透明调用体验。

RPC 的优点:

  • 抽象复杂性:简化分布式系统开发,屏蔽底层网络通信细节。
  • 模块化与解耦:服务间通过接口定义进行交互,有利于系统架构的模块化和松耦合。
  • 跨语言与跨平台:通过统一的接口定义,支持不同语言、不同平台间的互操作。
  • 易扩展与维护:服务可以独立部署、升级,不影响其他服务,利于系统规模的伸缩和维护。

gRPC

gRPC 是一个高性能、开源、通用的 RPC 框架,由 Google 主导开发。它基于 HTTP/2 协议标准,并广泛使用 Google 的 Protocol Buffers(protobuf)作为接口描述语言和默认的数据序列化方式。gRPC 的主要特点如下:

  1. HTTP/2 支持:利用 HTTP/2 的多路复用、二进制帧、头部压缩、优先级控制等特点,实现高效、低延迟的通信。同时,由于基于 HTTP/2,gRPC 能够轻松穿越大多数防火墙和代理。

  2. protobuf:使用 protobuf 作为接口定义语言(IDL)和数据交换格式,提供强类型、语言无关、高效的序列化与反序列化能力。protobuf 支持丰富的数据类型,并且可以自动为多种编程语言生成对应的 stub 代码。

  3. 多语言支持:gRPC 原生支持 C、Java、Go、Python、Node.js、Ruby、Objective-C、PHP、C# 等多种编程语言,使得不同语言编写的微服务可以无缝互操作。

  4. 服务类型:gRPC 支持多种服务类型,包括 unary(一发一收)、server streaming(一发多收)、client streaming(多发一收)和 bidirectional streaming(双向流),满足不同场景下的通信需求。

  5. 工具链完善:提供了丰富的开发、调试、测试、监控工具,如服务发现、负载均衡、健康检查、跟踪、日志、认证与授权等功能。

使用 gRPC 的步骤大致如下:

  1. 定义服务接口:使用 protobuf 文件定义服务接口和消息类型。

  2. 生成代码:使用 protobuf 编译器生成对应语言的 stub 代码。

  3. 实现服务:服务端实现 protobuf 生成的服务接口代码。

  4. 启动服务:服务端启动 gRPC 服务器,监听指定端口。

  5. 调用服务:客户端创建 gRPC 客户端实例,通过 stub 调用远程服务方法。

  6. 配置与管理:根据需要配置负载均衡、身份验证、日志记录、监控等高级功能。

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

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

相关文章

【Python】函数(纯干货版)

目录 什么是函数 函数定义 函数的文档说明 局部变量和全局变量 综合案例:模拟实现ATM界面 什么是函数 函数是组织好的,可重复使用的,用于实现特定功能的代码段,将功能封装在函数内,可供随时随地重复利用&#xff…

加固平板电脑加速国产化!应用场景大科普

随着时代的发展,国产化平板电脑已经开始慢慢的实现了,国产芯片、国产操作系统、国产 GPU、国产 GNSS 等众多关键技术的集成与应用。全新的平台,全新的突破,全新的应用,让国产加固型移动计算机系列往前进了一步。那么加…

如何用 AI 工具做数据分析与可视化?

(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 万字长文,助力你用 AI 提升科研效率。 2024 年 4 月 14 日,应武汉大学信息管理学院的邀请,我和北京大学步一老师给几…

python 头文件怎么写

本文主要以python2为例。首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。 编程风格 #!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器 # -*- coding: utf…

【开源】使用Python+Flask+Mysql快速开发一个用户增删改查系统

项目演示 项目本身很简单,增删改查是几乎所有系统的骨架。正所谓万丈高楼平地起,学会了增删改查,航母就指日可待了:),光速入门,直接看演示图: 项目地址 https://github.com/mudf…

设计模式代码实战-责任链模式

1、问题描述 小明所在的公司请假需要在OA系统上发布申请,整个请求流程包括多个处理者,每个处理者负责处理不同范围的请假天数,如果一个处理者不能处理请求,就会将请求传递给下一个处理者,请你实现责任链模式&#xff…

大华相机C#学习之IDevice类

获取方式 Enumerator.GetDeviceByGigeIP() 通过IP地址获取设备对象。 private void test_Click(object sender, EventArgs e) {devicesEnumerator.EnumerateDevices();device Enumerator.GetDeviceByGigeIP("192.168.0.11"); } 常用属性 DeviceInfo 获取设备的信…

uniapp_微信小程序_预约时间组件的使用

一、官方文档 DatetimePicker 选择器 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 二、完成的效果 之前使用的是Calendar 日历 这个太耗性能了&#xff0c;直接页面卡顿&#xff0c;所以就换成以上选择器了 三、代码 <u-datetime-p…

短信登录session-redis

1.流程 1.1 发送验证码 模拟路径 http://127.0.0.1:8080/api/user/code?phone1335566 Request Method:POSTcontroller层 /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {…

flink on k8s部署

在 Kubernetes 上部署一套 Flink 集群需要使用 Kubernetes 原生资源和工具,如 StatefulSet、Deployment、Service 等,或使用专门的 Flink Operator 来自动化和简化 Flink 集群的部署和管理。以下是一般的部署步骤: 使用 Flink Operator 部署 Flink 集群: 安装 Flink Opera…

C#自定义窗体更换皮肤的方法:创建特殊窗体

目录 1.窗体更换皮肤 2.实例 &#xff08;1&#xff09;图片资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#xff09; 生成效果 &#xff08;5&#xff09;一个遗憾 1.窗…

【银角大王——Django课程Day1】

Django框架第一课 安装Django框架方式一&#xff08;命令行的形式创建Django项目&#xff09;方式二&#xff08;适合企业版的pycharm&#xff09;默认文件介绍app文件介绍快速上手我的导包一直爆红是因为我没使用解释器&#xff0c;没导入包&#xff0c;去设置里面导入包即可—…

Java注解相关

Java注解相关 TableId注解 需要 import com.baomidou.mybatisplus.annotation.TableId; <!-- 各个依赖的版本号 --><properties><spring-boot.version>3.2.5</spring-boot.version><java.version>17</java.version><mybatis-plus.versi…

在 Node.js 中配置代理 IP 采集文章

不说废话&#xff0c;直接上代码&#xff1a; const http require(http); const https require(https);// 之后可以使用 http 或 https 模块发起请求&#xff0c;它们将自动使用配置的代理 // 代理ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg const proxy …

mysql常用

文章目录 匹配和正则表达式匹配&#xff1a;like正则表达式&#xff1a;rlike&#xff08;与regexp完全一样没有区别&#xff09; 窗口函数 匹配和正则表达式 匹配&#xff1a;like %&#xff1a;用来匹配 0 个或多个字符 _&#xff1a;用来匹配1个字符 SELECT * FROM Webs…

OpenHarmony实战开发-如何视频弹幕功能。

介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c;弹幕自动开启点…

【位运算】Leetcode 只出现一次的数字 ||

题目解析 137. 只出现一次的数字 II 算法讲解 nums中要么一个数字出现三次&#xff0c;一个数字出现一次&#xff0c;按照比特位来说只可能出现上面的四种情况&#xff1a; 3n个0 0 或者 3n个0 1 或者 3n个1 0 或者 3n个1 1&#xff0c;它们相加的结果依次是0&#xff0c;…

websocket 连接,http 协议下用 ws, https 协议下必须要使用 wss

解决方案&#xff1a; https 相当于使用 httpssl 认证&#xff0c;使用 https 时 websocket 访问&#xff08;比如建立链接时&#xff09;必须要使用 wss。 详细解释&#xff1a; WebSocket 协议有两个主要版本&#xff1a;“ws”和“wss”。"ws"表示非加密的 Web…

【机器学习300问】77、什么是梯度消失和梯度爆炸?

一、梯度消失&#xff08;Vanishing gradients&#xff09; &#xff08;1&#xff09;定义 在训练深度神经网络时&#xff0c;随着误差梯度从输出层向输入层逐层回传&#xff0c;梯度可能因为连乘效应逐渐减小。当使用激活函数的导数的最大值小于1时&#xff0c;深度网络中越…

qt-C++笔记之QProcess声明在堆上和声明在栈上对进程执行是否异步的影响

qt-C笔记之QProcess声明在堆上和声明在栈上对进程执行是否异步的影响 —— 2024-04-13 code review! 文章目录 qt-C笔记之QProcess声明在堆上和声明在栈上对进程执行是否异步的影响1.结论2.关于异步执行在堆上声明 QProcess在栈上声明 QProcess 3.waitForFinished详解函数原…