c++grpc详解

news2024/12/26 3:55:40

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一.简介
    • 支持的语言
    • 使用场景
    • 特点
  • 二.传输原理
    • protobuf传输
    • HTTP2.0
      • 流和帧
  • 三.grpc的四种模式
    • 1.一元RPC模式
    • 2.服务端流
    • 3.客户端流
    • 4.双向流
  • 四.基本流程


一.简介

  • gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言
    版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C,
    PHP 和 C# 支持.
  • gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等 特性。这
    些特性使得其在移动设备上表现更好,更省电和节省空间占用。
  • 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法, 使得您
    能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念: 定义一个服务,指
    定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口, 并运行一个 gRPC 服务器来
    处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法
    在这里插入图片描述

支持的语言

c++ java Objective-C python Ruby Go C# Node.js

使用场景

  • 低延迟,高扩展的分布式系统
  • 与云服务器通信
  • 设计与语言无关的协议
  • 分层设计

特点

  • 跨平台,跨语言
  • 协议自由,可根据需求自己选择协议(json, XML,thirft)
  • 支持同步和异步
  • 可以取消请求和设置超时
  • 流处理,可以处理大型数据集

二.传输原理

在这里插入图片描述

  • 使用stub代理使用protobuf将数据序列化,再使用http2.0将数据发送给tcp
  • 选择使用HTTP2.0和protobuf大大提升了传输效率
  • 在这里插入图片描述

protobuf传输

  • protobuf是Goole开发的一种跨语言,跨平台,可扩展的序列化数据协议
  • protobuf传输速度快比JOSN,采用二进制序列化方式,
  • 早期的rpc使用JSON传输,现在基本都采用Protobuf的二进制传输
  • 差别在于Json是适合人阅读,protobuf适合机器

HTTP2.0

在这里插入图片描述

http2.0,相对于http1.0有以下几个改进:

  • 未改变HTTP语义
  • 引入帧,流的概念,可以区分多个请求和相应
  • 借助帧和流可以实现多路复用
  • 使用二进制编码,降低header空间占用

流和帧

  • HTTP1.1存在无法区分请求,只能串行发送
  • HTTP2.0提出流的概念,每个请求对应一个ID,来区分不同请求
  • 基于流又提出帧的概念,将数据分成多个帧,分割传输,而这多个帧都属于一个流
  • 通过这种二进制乱序的模式,解决了HTTP1.1的核心痛点,通过这种复用tcp连接的方式,不用再同时建立多个连接,提升了TCP利用效率

三.grpc的四种模式

1.一元RPC模式

一元 RPC 模式也被称为简单 RPC 模式。在该模式中,当客户端调用服务器端的远程方法时,客户端发送请求至服务器端并获得一个响应,与响应一起发送的还有状态细节以及元数据。

2.服务端流

在一元 RPC 模式中,gRPC 服务器端和 gRPC 客户端在通信时始终只有一个请求和一个响应。在服务器端流 RPC模式中,服务器端在接收到客户端的请求消息后,会发回一个响应的序列。这种多个响应所组成的序列也被称为“流”。在将所有的服务器端响应发送完毕之后,服务器端会以元数据的形式将其状态发送给客户端,从而标记流的结束。

  • 在protoc文件中定义方式
    在这里插入图片描述
  • 客户端流式代码
std::unique ptr<ClientReader<Feature>>reader(stub ->ListFeatures(&context,rect));
while(reader->Read(&feature))
{
std::cout<<"Found feature called "<< feature.name()
<<" ata"<<feature.location().latitude()
<<feature.location().longitude() << std::end
}
Status status =reader->Finish();
if(status.ok()){
std::cout<<"ListFeatures rpc succeeded."<< std::endl;
}else {
ListFeatures rpc failed."<< std::endl;
}
  • 服务端流式代码
StatusRecordRoute(Servercontext context,const routeguide::Rectangle rectangle,ServerWrite<Feature>*write)override
{
for (const Feature& f:featurelist )
{
writer->Write(f);
}
return status::OK;//流结束
}

3.客户端流

在客户端流 RPC模式中,客户端会发送多个请求给服务器端,而不再是单个请求。服务器端则会发送一个响应给客户端。但是,服务器端不一定要等到从客户端接收到所有消息后才发送响应。基于这样的逻辑,我们可以在接收到流中的一条消息或几条消息之后就发送响应,也可以在读取完流中的所有消息之后再发送响应。

  • 在protoc文件中定义方式
    在这里插入图片描述
  • 客户端代码
std::unique ptr<clientWriter<Point>>writer(stub ->RecordRoute(&context,&stats);
for(int i=0;i< kPoints; i++){
//

业务处理
//
writer->Write(f.location()
)

writer->WritesDone();
Status status = writer->Finish():
  • 服务端代码
StatusRecordRoute(Servercontextcontext,ServerReader<Point>*reader,,RouteSummary*summary) override{

while(reader->Read(&point)){
处理业务
}
return status::OK;//流结束
}

4.双向流

在双向流 RPC 模式中,客户端以消息流的形式发送请求到服务器端,服务器端也以消息流的形式进行响应。调用必须由客户端发起,但在此之后,通信完全基于gRPC客户端和服务器端的应用程序逻辑。
需要一个接受线程和发送线程·

  • 在protoc文件中定义方式在这里插入图片描述
Status RouteChat(Servercontext* context,ServerReaderWriter<RouteNote,RouteNote>* stream)override
{
RouteNote note;
while(stream->Read(&note)){
//业务处理

sheam->Write(n);
}
return status::0K;
}

四.基本流程

在这里插入图片描述
基本流程代码以及一元模式看grpc的简单使用

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

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

相关文章

Lesson3 - 操作系统软件视角和系统调用

文章目录 硬件支持系统 系统管理硬件异步行为中断的分类 同步行为虚拟地址空间shell系统调用与软中断区分系统调用trace 命令 硬件支持系统 系统管理硬件 计算机硬件由三样东西组成&#xff1a;CPU、内存、I/O设备。为了更有效地管理这些硬件资源&#xff0c;系统设计者引入了…

ElasticSearch备考 -- Search template

一、题目 ### 基础版 Create a search template for the above query, so that the template (i) is named "with_response_and_tag", (ii) has a parameter "with_min_response" to represent the lower bound of the response field, (iii) has a parame…

分治算法(3)_快速选择_数组中的第K个最大元素

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(3)_快速排序_数组中的第K个最大元素 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#…

SSH -L 代理与反向代理转发详解

简介&#xff1a;SSH -L 选项用于设置本地端口转发&#xff0c;而反向代理转发则允许远程主机访问本地服务。本文将介绍如何使用 SSH -L 实现本地端口转发和反向代理转发&#xff0c;并提供示例以帮助您理解和应用这些技术。 历史攻略&#xff1a; Centos&#xff1a;设置代理…

国庆假期结束

&#x1f51a; 推迟几天返校 未提前和老师商量&#xff08;其实放假前我也说过的&#xff0c;但是我导可能忘记了&#xff09; 我的确有错&#xff0c;事情总自己觉得行了就觉得可以了 在老师看起来的确有点“不尊重” 下次一定要要要注意⚠️⚠️⚠️ 上次&#xff0c;国…

【Kubernetes】常见面试题汇总(五十九)

目录 129.问题&#xff1a;pod 使用 PV 后&#xff0c;无法访问其内容&#xff1f; 130.查看节点状态失败&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xf…

大语言模型 LLM 量化技术略解

什么是量化? 随着语言模型规模的不断增大,其训练的难度和成本已成为共识。而随着用户数量的增加,模型推理的成本也在不断攀升,甚至可能成为限制模型部署的首要因素。因此,我们需要对模型进行压缩以加速推理过程,而模型量化是其中一种有效的方法。 大语言模型的参数通常…

Python运行态 - 代码调试:掌握pdb

简介&#xff1a;pdb&#xff08;Python Debugger&#xff09;是 Python 标准库中的调试工具&#xff0c;旨在帮助开发者在代码中设置断点、检查变量值和逐行执行代码。这对于定位和修复程序中的问题至关重要。pdb 是 Python 的内置模块&#xff0c;因此不需要额外安装。 历史…

20款奔驰CLS300升级原厂抬头显示HUD 23P智能辅助驾驶 触摸屏人机交互系统

以下是为您生成的一份关于 18 款奔驰 CLS 老款改新款的改装文案&#xff1a; 18 款奔驰 CLS 老款改新款&#xff1a;科技升级&#xff0c;畅享极致驾驶体验 在汽车改装的世界里&#xff0c;每一次的升级都是对卓越的追求。今天&#xff0c;让我们一同探索 18 款奔驰 CLS 老款改…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

贪心算法c++

贪心算法C概述 一、贪心算法的基本概念 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&#xff0c;是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决…

基于yolov8的200鸟类智能检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的200种鸟类智能检测与识别系统是一款基于深度学习的目标检测系统&#xff0c;该系统利用YOLOv8框架&#xff0c;通过11788张图片训练出一个能够进行鸟类智能检测与识别的模型&#xff0c;可以识别200种不同的鸟类。 该系统采用Python与PyQt5开发&…

苹果电脑磁盘满了怎么清理内存?必看清理秘籍

对于很多Mac用户来说&#xff0c;随着时间的推移&#xff0c;电脑逐渐变慢并出现磁盘空间不足的提示是一件非常头疼的事情。正确理解内存和存储的区别&#xff0c;并采用有效的清理方法&#xff0c;对于保持Mac性能至关重要。本文将深入探讨如何有效清理Mac上的磁盘空间&#x…

一文看懂计算机中的大小端(Endianess)

文章目录 前言一、什么是大小端二、如何判断大小端三、大小端的转换3.1 使用标准库函数3.2 手动实现大小端转换 前言 本文主要探讨计算机中大小端的相关概念以及如何进行大小端的判断和转换等。 一、什么是大小端 大小端&#xff08;Endianess&#xff09;是指计算机系统在存…

CentOS7安装宝塔

第一步&#xff1a;安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh安装成功后会弹出这个页面 那么下次怎样再次打开这个页面呢&#xff1f; 输入这个&#xff1a; /etc/init.d/bt default…

YOLO v1详解解读

&#x1f680; 在此之前主要介绍了YOLO v5源码的安装和使用&#xff08;YOLO v5安装教程&#xff09;&#xff0c;接下来将探索YOLO的实现原理&#xff0c;作为一个金典的单阶段目标检测算法&#xff0c;应该深度的理解它的构建思想&#xff1b;所以本系列文章将从LOVO v1出发到…

JavaEE: 深入解析HTTP协议的奥秘(1)

文章目录 HTTPHTTP 是什么HTTP 协议抓包fiddle 用法 HTTP 请求响应基本格式 HTTP HTTP 是什么 HTTP 全称为"超文本传输协议". HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据. 因此它广泛应用在日常开发的各种场景中. HTTP 往往是基于传输层的…

PCIe配置篇(0)——地址空间

一、地址空间回顾 在最开始&#xff0c;我们先来回顾一下PCIe的一些基本概念&#xff0c;首先&#xff0c;PCIe是PCI的延伸&#xff0c;全名叫 Peripheral Component Interface Express。从名字就能看出&#xff0c;这是一种外设总线协议。在整个系统中&#xff0c;外设只是其中…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业&#xff0c;每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游&#xff0c;但是由于跳得比较慢&#xff0c;它们的愿望难以实现。这时&#xff0c;小C听说有一种叫做火车的交通工具&#xff0c;在铁路上跑得很快&#x…

C语言基础(10)之指针(2)

在上一篇文章中我们谈到了指针&#xff0c;并给老铁们讲解了什么是指针、指针类型、野指针以及指针运算等知识。在这篇文章中小编将继续带大家了解指针的相关知识点。 1. 指针和数组 指针和数组之间又能有什么联系呢&#xff1f;在谈这个之前&#xff0c;我们先来讲讲指针和数…