gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架

背景介绍

gRPC 是一种现代开源高性能远程过程调用 (RPC) 可以在任何环境中运行的框架。它可以有效地连接服务 在数据中心内和数据中心之间,具有对负载平衡、跟踪、 运行状况检查和身份验证。它也适用于最后一英里 分布式计算,用于连接设备、移动应用程序和浏览器 后端服务。

主要使用场景

  • 在微服务风格架构中高效连接多语言服务
  • 将移动设备、浏览器客户端连接到后端服务
  • 生成高效的客户端库

使其出色的核心功能

  • 11 种语言的惯用客户端库
  • 高效的线路和简单的服务定义框架
  • 使用基于 http/2 的传输进行双向流式传输
  • 可插拔身份验证、跟踪、负载平衡和运行状况检查

gRPC 可以使用 protocol buffers 作为其接口定义语言 (IDL) 和基础消息 交换格式。

在 gRPC 中,客户端应用程序可以直接调用服务器应用程序上的方法 在不同的计算机上,就好像它是本地对象一样,使您可以更轻松地 创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 是 基于定义服务的思想,指定可以 使用其参数和返回类型远程调用。在服务器端, 服务器实现此接口并运行 gRPC 服务器来处理客户端调用。 在客户端,客户端有一个存根(在某些中称为客户端 语言),提供与服务器相同的方法。

alt

gRPC 客户端和服务器可以在各种 环境 - 从 Google 内部的服务器到您自己的桌面 - 并且可以 以任何 gRPC 支持的语言编写。因此,例如,您可以轻松地 在 Java 中创建 gRPC 服务器,并使用 Go、Python 或 Ruby 中的客户端。另外 最新的 Google API 将具有其接口的 gRPC 版本,让您 轻松将 Google 功能构建到您的应用程序中。

使用协议缓冲区

核心概念、架构和生命周期

服务定义

与许多 RPC 系统一样,gRPC 基于定义服务的思想, 指定可以使用其参数远程调用的方法,以及 返回类型。默认情况下,gRPC 使用协议 缓冲区作为接口 定义语言 (IDL),用于描述服务接口和 有效负载消息的结构。

alt

gRPC 允许您定义四种服务方法:

  • 一元 RPC,其中客户端向服务器发送单个请求并获得 单响应返回,就像正常的函数调用一样。
alt
  • 服务器流式处理 RPC,其中客户端向服务器发送请求并获取 用于读回消息序列的流。客户端从 返回流,直到没有更多消息。gRPC 保证消息 在单个 RPC 调用中排序。
alt
  • 客户端流式处理 RPC,其中客户端写入一系列消息并发送 它们到服务器,再次使用提供的流。一旦客户有 写完消息,它等待服务器读取它们并返回 它的回应。同样,gRPC 保证单个 RPC 中的消息排序 叫。
alt
  • 双向流式处理 RPC,其中双方发送一系列消息 使用读写流。这两个流独立运行,因此客户端 服务器可以按照他们喜欢的任何顺序读取和写入:例如, 服务器可以等待接收所有客户端消息,然后再写入其 响应,或者它可以交替阅读消息然后编写消息,或者 读取和写入的其他一些组合。每个消息的顺序 流被保留。
alt

使用接口

从文件中的服务定义开始,gRPC 提供协议 生成客户端和服务器端代码的缓冲区编译器插件。gRPC 用户 通常在客户端调用这些 API 并实现相应的 API 在服务器端。.proto

在服务器端,服务器实现服务声明的方法 并运行 gRPC 服务器来处理客户端调用。gRPC 基础结构解码 传入请求、执行服务方法并对服务响应进行编码。 在客户端,客户端有一个称为存根的本地对象(对于某些 语言,首选术语是客户端),它实现与 服务。然后,客户端可以在本地对象上调用这些方法, 并且这些方法将调用的参数包装在适当的协议缓冲区中 消息类型,将请求发送到服务器,并返回服务器的 协议缓冲区响应。 同步与异步 在响应从服务器到达之前阻止的同步 RPC 调用是 最接近过程调用 RPC 的抽象 渴望。另一方面,网络本质上是异步的,并且在许多 能够在不阻塞当前的情况下启动 RPC 非常有用的方案 线。

大多数语言的 gRPC 编程 API 都有同步和 异步风格。您可以在每种语言的教程中找到更多信息,并且 参考文档(完整的参考文档即将推出)。

RPC 生命周期

在本部分中,你将详细了解 gRPC 客户端发生的情况 调用 gRPC 服务器方法。有关完整的实现详细信息,请参阅 特定于语言的页面。

一元 RPC

首先考虑客户端发送单个请求的最简单类型的 RPC 并得到一个回复。

一旦客户端调用存根方法,服务器 通知已使用此调用的客户端元数据、方法名称和指定的截止时间调用 RPC,如果 适用。 然后,服务器可以发回自己的初始元数据(必须 在任何响应之前发送)立即,或等待客户的请求 消息。首先发生的是特定于应用程序的。 一旦服务器收到客户端的请求消息,它就会做任何工作 需要创建和填充响应。然后返回响应 (如果成功)与状态详细信息(状态代码和 可选状态消息)和可选的尾随元数据。 如果响应状态为“正常”,则客户端将获得响应,即 在客户端完成调用。 服务器流式处理 RPC 服务器流式处理 RPC 类似于一元 RPC,不同之处在于服务器返回 响应客户端请求的消息流。发送完所有后 消息、服务器的状态详细信息(状态代码和可选状态消息) 并将可选的尾随元数据发送到客户端。这样就完成了处理 在服务器端。客户端在拥有服务器的所有消息后完成。

客户端流式处理 RPC

客户端流式处理 RPC 类似于一元 RPC,不同之处在于客户端发送 发送到服务器的消息流,而不是单个消息。服务器 使用单个消息响应(以及其状态详细信息和可选 尾随元数据),通常但不一定要在它收到所有 客户端的消息。

双向流式处理 RPC

在双向流式处理 RPC 中,调用由客户端发起 调用方法和接收客户端元数据的服务器,方法名称, 和截止日期。服务器可以选择发回其初始元数据或 等待客户端开始流式传输消息。

客户端和服务器端流处理是特定于应用程序的。由于两者 流是独立的,客户端和服务器可以读取和写入消息 任何订单。例如,服务器可以等到它收到所有 客户端的消息在写入其消息之前,或者服务器和客户端可以播放 “乒乓球” – 服务器收到请求,然后发回响应,然后 客户端根据响应发送另一个请求,依此类推。

截止时间/超时 gRPC 允许客户端指定他们愿意等待 RPC 的时间 在 RPC 因错误而终止之前完成。上 服务器端,服务器可以查询查看特定 RPC 是否已超时, 或完成 RPC 还剩多少时间。DEADLINE_EXCEEDED

指定截止时间或超时是特定于语言的:某些语言 API 可以工作 在超时(持续时间)方面,某些语言 API 在超时方面工作 的截止日期(固定时间点),可能有也可能没有默认截止日期。

RPC 终止

在 gRPC 中,客户端和服务器都对 电话的成功,他们的结论可能不匹配。这意味着, 例如,您可能有一个在服务器端成功完成的 RPC (“我已经发送了我所有的回复!但在客户端失败(“响应 在我的截止日期之后到达!服务器也可以决定 在客户端发送其所有请求之前完成。

取消 RPC

客户端或服务器可以随时取消 RPC。取消 立即终止 RPC,以便不再执行任何进一步的工作。

元数据

元数据是有关特定 RPC 调用(如身份验证)的信息 详细信息)以键值对列表的形式,其中 键是字符串,值通常是字符串,但可以是二进制数据。

键不区分大小写,由 ASCII 字母、数字和特殊字符 组成,并且不得以 (为 gRPC 本身保留)开头。 二进制值键以 结尾,而 ASCII 值键不以结尾。-_.grpc--bin

gRPC 不使用用户定义的元数据,这允许客户端提供信息 与对服务器的调用相关联,反之亦然。

对元数据的访问取决于语言。

渠道

gRPC 通道提供与指定主机上的 gRPC 服务器的连接,并且 港口。它在创建客户端存根时使用。客户端可以指定通道 用于修改 gRPC 默认行为(如切换消息)的参数 打开或关闭压缩。通道具有状态,包括和 。connectedidle

gRPC 如何处理关闭通道取决于语言。有些语言也 允许查询通道状态。

谁在使用 gRPC,为什么?

许多公司已经在使用 gRPC 来连接其中的多个服务 环境。用例从连接少数服务到 在本地或云环境中提供数百种不同语言的服务。 以下是我们一些早期采用者的详细信息和引述。

alt

本文由 mdnice 多平台发布

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

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

相关文章

P20类神经网络训练不起来怎么办?- 批次和动量

什么是batchsmall batch 和 large batch 的比较 : large batch 更快,small batch 在训练集和测试集上效果效果更好动量的意义和作用: 类似于物理上多了一点惯性,防止困在鞍点。 动量是之前所有梯度的加权和。 1. batch 是什么 …

高压电气是什么

高压电气 电工电气百科 文章目录 高压电气前言一、高压电气是什么二、高压电气的类别三、高压电气的作用原理总结前言 高压电气在电力系统中起着重要的作用,它能够将电能有效地输送和分配到各个用户,为社会和工业生产提供稳定可靠的电力供应。然而,高压电气系统也需要注意安…

Mr_HJ / form-generator项目文档学习与记录(续)

以后主打超融开源社区 (jiangzhicheng88) - Gitee.com render.js就是对vue的render函数的自己简单定制封装。 render.js实现的功能是将json表单中的__config__.tag解析为具体的vue组件; 正常开发流程我们组件输入的时候会触发组件内的 this.$emit(getValue, val)…

PyQt6 安装Qt Designer

前言:在Python自带的环境下,安装Qt Designer,并在PyCharm中配置designer工具。 在项目开发中,使用Python虚拟环境安装PyQt6-tools时,designer.exe会安装在虚拟环境的目录中:.venv\Lib\site-packages\qt6_a…

NPM开发工具的简介和使用方法及代码示例

NPM(Node Package Manager)是Node.js的包管理工具,用于管理和共享被发布到模块仓库的JavaScript代码。本文将介绍NPM的定义、使用方法、代码示例以及总结。 一、NPM的定义 NPM是Node.js的默认包管理工具,它的功能包括安装、管理、…

机器学习算法---回归

1. 线性回归(Linear Regression) 原理: 通过拟合一个线性方程来预测连续响应变量。线性回归假设特征和响应变量之间存在线性关系,并通过最小化误差的平方和来优化模型。优点: 简单、直观,易于理解和实现。…

【日常笔记】notepad++ 正则表达式基本用法

一、场景 二、正则表达式--语法 2.1、学习基本的匹配字符: 2.2、学习特殊字符和量词: 2.3、学习转义字符 2.4、学习分组和捕获 2.5、区分大小写 和 匹配整个单词 2.6、引用分组 三、实战 ▶ 希望把课程目录中 -- 前面的都去掉 一、场景 希望把…

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题 Idea 在升级了2023.3以后,Jrebel 无法以 debug 的模式启动,找了半天,最后在插件主页的评论区找到了解决方案 特此记录一下

Dockerfile:创建镜像,创建自定义的镜像。

Docker的创建镜像的方式: 基于已有镜像进行创建。 根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性的功能还是需要自己定义(进入容器进行操作) 基于模板进…

SpringBoot 基础概念:SpringApplication#getSpringFactoriesInstances

SpringBoot 基础概念&#xff1a;SpringApplication#getSpringFactoriesInstances SpringApplication#getSpringFactoriesInstances SpringApplication#getSpringFactoriesInstances private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,…

在 Spring Boot 中发送邮件简单实现

Spring Boot 对于发送邮件这种常用功能也提供了开箱即用的 Starter&#xff1a;spring-boot-starter-mail。 通过这个 starter&#xff0c;只需要简单的几行配置就可以在 Spring Boot 中实现邮件发送&#xff0c;可用于发送验证码、账户激活等等业务场景。 本文将通过实际的案…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析&#xff1a; 标题手画二次元需要技巧&#xff1a; 二次元高清图片的绘制技巧主要包括以下几点&#xff1a; 线条的运用&#xff1a;在二次元风格的绘画中&#xff0c;线条的运用非常重要。要绘制出流畅、细腻的线条&#xff0c;需…

用于自动驾驶的基于深度学习的图像 3D 物体检测:综述

论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/10017184/ 背景 准确、鲁棒的感知系统是理解自动驾驶和机器人驾驶环境的关键。自动驾驶需要目标的 3D 信息&#xff0c;包括目标的位置和姿态&#xff0c;以清楚地了解驾驶环境。 摄像头传感器因其颜色和…

初识JVM底层知识,一文读懂JVM知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

nginx反向代理实践指南:访问Tomcat

目录 前言1 实现的效果2 访问流程分析3 安装tomcat并测试4 配置4.1 在Windows系统的hosts文件进行域名和IP对应关系的配置4.2 在NGINX进行请求转发的配置&#xff08;反向代理配置&#xff09; 5 最终测试结论 前言 从Windows系统访问Tomcat Web应用程序&#xff0c;设置和配置…

VUE-脚手架搭建

文章目录 一、概述二、前提准备1. 安装 node-js2. npm 镜像设置3. 安装 vs-code 三、脚手架搭建1. Vue-2 搭建1. Vue-3 搭建 一、概述 官网&#xff1a;http://cn.vuejs.org/ vue 有两个大版本&#xff0c;分别是 vue-2 和 vue-3&#xff0c;目前新项目的话用 vue-3 的会比较多…

Elasticsearch 进阶(索引、类型、字段、分片、副本、集群等详细说明)-06

笔记来源&#xff1a;Elasticsearch Elasticsearch进阶 进阶-核心概念 索引Index 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字…

RT-DETR 图片目标计数 | 特定目标进行计数

全类别计数特定类别计数如何使用 RT-DETR 进行对象计数 有很多同学留言说想学 RT-DETR 目标计数。那么今天这篇博客,我将教大家如何使用 RT-DETR 进行对象计数。RT-DETR 是一种非常强大的对象检测模型,它可以识别图像中的各种对象。我们将学习如何利用这个模型对特定对象进行…

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest, ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…

C++ 学习系列 -- 模板 template

一 C 模板介绍&#xff1f; C 为什么引入模板&#xff1f; 我的理解是&#xff1a; C 引入模板的概念&#xff0c;是为了复用重复的代码&#xff0c;当某些代码除了操作的数据类型不同以外&#xff0c;其他逻辑全都相同&#xff0c;此时就适合采用模板的方式。 定义模板类或者…