gRPC远程调用协议

news2024/9/22 20:32:54

gRPC

简介

gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。

HTTP2.0

grpc采用HTTP2.0,相对于HTTP1.0 在更快的传输和更低的成本两个目标上做了改进。有以下几个基本点:

  • 引入帧、流的概念,在TCP连接中,可以区分出多个request/response
  • 一个域名只会有一个TCP连接,借助帧、流可以实现多路复用,降低资源消耗
  • 引入二进制编码,降低header带来的空间占用

HTTP1.1核心问题在于:在同一个TCP连接中,没办法区分response是属于哪个请求,一旦多个请求返回的文本内容混在一起,则没法区分数据归属于哪个请求,所以请求只能一个个串行排队发送。这直接导致了TCP资源的闲置。
HTTP2为了解决这个问题,提出了流的概念,每一次请求对应一个流,有一个唯一ID,用来区分不同的请求。基于流的概念,进一步提出了帧,一个请求的数据会被分成多个帧,方便进行数据分割传输,每个帧都唯一属于某一个流ID,将帧按照流ID进行分组,即可分离出不同的请求。这样同一个TCP连接中就可以同时并发多个请求,不同请求的帧数据可穿插在一起,根据流ID分组即可。HTTP2.0基于这种二进制协议的乱序模式 (Duplexing),直接解决了HTTP1.1的核心痛点,通过这种复用TCP连接的方式,不用再同时建多个连接,提升了TCP的利用效率。
在这里插入图片描述

gRPC的异步通信

不管是 Client 还是 Server,异步 gRPC 都是利用 CompletionQueue API 进行异步操作。基本的流程:

  • 绑定一个 CompletionQueue 到一个 RPC 调用
  • 利用唯一的 void* Tag 进行读写
  • 调用 CompletionQueue::Next() 等待操作完成,完成后通过唯一的 Tag 来判断对应什么请求/返
    回进行后续操作

gRPC 的 CompletionQueue(CQ)是一个事件队列,用于处理 gRPC 异步操作的完成事件。它是 gRPC 实现异步通信的核心机制之一。

CompletionQueue 可以理解为一个事件循环,它会不断地从网络层接收到来自服务端的响应或客户端请求的完成事件,并将这些事件加入到队列中。在客户端代码或服务端代码中,我们可以通过异步 API 来向 CompletionQueue 注册我们感兴趣的事件,然后等待 CompletionQueue 返回这些事件的完成状态。

在客户端,我们可以通过 CompletionQueue 来实现异步的 gRPC 调用。当我们调用 gRPC 的异步 API 时,会向 CompletionQueue 注册一个请求完成事件。当服务端响应到达时,CompletionQueue 会将该事件放入队列中,并通知客户端代码请求已完成。此时客户端可以从 CompletionQueue 中取出该事件,获取响应数据,并进行后续处理。

在服务端,我们可以通过 CompletionQueue 来实现异步的 gRPC 处理。当服务端接收到客户端的请求时,会向 CompletionQueue 注册一个请求完成事件。当处理完成时,服务端将该事件放入队列中,并通知 CompletionQueue 请求已完成。此时服务端可以从 CompletionQueue 中取出该事件,获取请求数据,并进行后续处理。

总之,CompletionQueue 是 gRPC 实现异步通信的核心机制,它可以帮助我们实现高效、低延迟的 gRPC 应用程序。

grpc网络模型

grpc同步模型

grpc会启动多个线程的epoll来处理描述符,不管异步还是同步,每个epoll都对应一个线程。

在这里插入图片描述

其中监听scceptfd会被轮询地放在所有线程的epoll中,保证线程上的负载均衡。目前grpc的分配策略是轮询(round-robin)

grpc异步模型

异步处理的epoll方式和同步是类似的,但对于rpc函数的响应提供了更灵活的处理机制,可以将一些耗时的处理逻辑放到外部的线程池进行处理。

在这里插入图片描述

grpc四种模式

一元RPC模式

服务器 流RPC模式

客户端流RPC模式

双向流RPC模式

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

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

相关文章

NFT Insider #100:The Sandbox 展示泰国 2023 年元宇宙生态系统,​游戏巨头世嘉暂缓链游项目开发

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…

第三章 数据链路层【计算机网络】

第三章 数据链路层【计算机网络】 前言推荐第三章 数据链路层3.1 数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本问题 3.2点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP协议的工作状态 3.3 使用广播信道的数据链路层3.3.1 局域网的数据链路层3.…

ADManager Plus:企业自动化管理的利器

在当今数字化时代,企业管理面临着越来越多的挑战。为了提高效率、降低成本并确保信息安全,自动化管理成为了企业的首要选择。而在众多自动化管理工具中,ADManager Plus无疑是一款卓越的解决方案。本文将为您介绍ADManager Plus的功能与优势&a…

【Accumulate】Gitee解决每次推送输入账户密码问题

【前言】 每次建立私人仓库后,一推送就得输入账户密码,真的巨烦人啊。 【解决】 step1: 绑定私匙: 配置Git_犟小孩的博客-CSDN博客 step2: 每次绑定远程仓库的时候,使用SSH绑定 如果已经绑定过了&…

虚拟化技术(KVM)基础

如何实现虚拟化技术? 三种类型的虚拟机管理软件Hypervisor KVM(kernrl -bsed v m) 环境检查和部署 一、虚拟化技术概述 虚拟化技术就是对资源的抽象 1.1、从资源提供角度分类 平台虚拟化即硬件平台虚拟化,可以把物理机的CPU和MEM提供给来宾主机做资源…

使用Electron来给若依系统打包成exe程序,出现登录成功但是不跳转页面(已解决)

阿丹: 之前解决了css找不到文件等问题,那么新问题就来了! 问题描述: 进入到登录页面发现问题: 点击登录一直在转圈,但是不进去!!! 更诡异的是!后台相应的很…

vue启动失败;‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题1: 启动vue项目失败: vue启动失败;‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 获或者问题2:npm i 失败: C:\Users\28602\AppData\Roaming\npm-cache_logs\2023-07-07…

一篇看懂web端音频

三方音频录制的库 recorder-core库: github地址:https://github.com/xiangyuecn/Recorder 支持录音格式:mp3 wav ogg webm amr pcm 该库基于Web Audio API(html5)的录音库,支持在大部分已实现getUserMedi…

安装yum源

三个源,httpd的: 首先:安装yum源 关闭防火墙和安全机制 然后访问本机ip 显示出来,删除掉,然后创建本地yum源 挂载,但是test没有 创建test,然后挂载 必须要进入到这个目录下创建挂载才行&…

(vue)el-table表格删除操作加气泡确认框

(vue)el-table表格删除操作加气泡确认框 效果&#xff1a; 代码&#xff1a; <el-table-column fixed"right" label"操作" width"120"><template slot-scope"scope"><el-popconfirm title"确定移除吗&#xff…

Keepalived及其工作原理

目录 一、keepalived概述 1.1.1 管理LVS负载均衡软件 1.1.2 支持故障自动切换&#xff08;failover&#xff09; 1.1.3 实现LVS集中节点的健康检查&#xff08;health checking&#xff09; 1.1.4 实现LVS负载调度器 节点服务器的高可用性&#xff08;HA&#xff09; 二、…

Stable Diffusion 使用lora-scripts WebUI训练LoRA模型

如果对代码使用有困难的小伙伴可以直接使用WebUI版的LoRA模块进行训练操作。不管是训练人物&#xff0c;场景&#xff0c;风格&#xff0c;还是服装都是一套通用的模式&#xff0c;仅仅是使用不同的数据集得到的结果不同。 文章目录 lora-scripts WebUI的安装LoRA训练过程SD切分…

【贪心】CF1845 C

Problem - C - Codeforces 题意&#xff1a; Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn3e510; const int mxe1e510; const int mod1e97; const int Inf0x3f3f3f3f;string s,l,r;int M;void solve(){s.clear…

前端部署--入门Vercel

Vercel Vercel 你可以理解为一个部署工具&#xff0c;支持部署静态网页和Node服务&#xff0c;部署后你还可以访问它自带生成的域名https。 模版支持 Nuxt.js: Vue的SSR框架 Hexo: 快速生成博客网站 Remix&#xff1a; 一款边缘原生的全栈 JavaScript 框架 … Vercel的核心…

免押租赁软件开发|租赁小程序适合各种产品开发

租赁小程序适合各种产品开发&#xff0c;特别是那些可以通过租赁方式提供给用户使用的产品。以下是一些适合开发租赁小程序的产品类型&#xff1a;   租房&#xff1a;租赁小程序可以方便房东和租客之间的房屋租赁交易。租客可以通过小程序浏览房源信息并联系房东&#xff0c…

力扣 | 数组和字符串简介

数组是数据结构中的基本模块之一。因为字符串是由字符数组形成的&#xff0c;所以二者是相似的。力扣LeetBook——数组和字符串 文章目录 &#x1f4da;数组简介&#x1f449;寻找数组的中心索引&#x1f449;搜索插入位置&#x1f449;合并区间 &#x1f4da;二维数组简介&…

adb连接安卓模拟器或真机hook参数加密详细过程(frida)

app逆向时&#xff0c;参数与函数的确定很关键&#xff0c;找到可疑的函数&#xff0c;不确定是否由该函数生成&#xff0c;该怎么解决&#xff1f;hook就应允而生了&#xff0c;首先是要求本地电脑和安卓模拟器&#xff08;网易mumu模拟器支持多系统&#xff0c;该模拟器作为主…

Docker学习笔记23

Docker Swarm架构&#xff1a; Swarm中以集群&#xff08;Cluster&#xff09;为单位进行管理&#xff0c;支持服务层面的操作。 集群是Swarm所管理的对象。 基本概念&#xff1a; 节点&#xff08;Node&#xff09;为Swarm集群中的一个Docker Engine实例。其中管理节点&#…

线程池问题处理

拒绝策略 AbortPolicy&#xff1a;默认的拒绝策略&#xff0c;直接抛出RejectedExecutionException异常。 CallerRunsPolicy&#xff1a;将任务退回给调用者执行。 场景 等线程池里的任务执行完通过future.get的方式获取线程池里的线程执行结果&#xff0c;然后合并到主流程…

自动化平台总结(httprunner+djangorestframework+python3+Mysql+Vue)【基础结构构思】

目录 一、前言 二、简介 三、整体结构 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 一、前言 把一个以前自己搭建的自动化测试平台进行了一下重构升级&#xff0c;记录一下过程中的一些问题和总结。 二、简介 搭建的平台语言使用的是Python3.6&#xff0c;未来…