2023-5-15-gRpc框架学习

news2025/4/28 4:08:28


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述


目录

  • 🍬本文摘要
  • 😉一、gRpc是什么
  • 🐱‍🐉二、Http/2 协议是什么
  • 🎉三、什么是高性能远程过程调用 (rpc) 框架
  • 🎂四、学习gRpc可以分为哪几步
  • 🥩五、学习Protocol Buffers(protobuf)的语法
  • 🍚六、gRPC的架构、通信模型、消息类型和服务定义
  • 🥠七、使用合适的编程语言和工具实现一个简单的gRPC应用程序
  • 🐱‍🚀八、对于高性能RPC框架有没有优化策略
  • 🧊文章总结



😉一、gRpc是什么

gRPC是一个基于现代网络技术的高性能远程过程调用 (RPC) 框架。它使用 Google 开源的 Protocol Buffers 作为默认的序列化协议,支持多种编程语言(如 C++, Java, Python, Go 等),并使用 HTTP/2 协议进行传输。与传统的 RPC 方式不同,gRPC 使用了流式数据处理、双向流等先进的网络技术来提供更加高效的服务通信方式。同时,gRPC 还支持服务发现、负载均衡、错误处理等常见的微服务功能。

在 gRPC 中,客户端可以像调用本地函数一样调用远程函数,而这些远程函数可以部署在不同的物理机器上,以实现分布式系统中的服务通信。由于 gRPC 基于 HTTP/2 协议,它充分利用了 HTTP/2 的优势,如头压缩、多路复用、服务器推送等,从而实现了更快、更可靠、更节省资源的服务通信。此外,gRPC 还支持 TLS 加密和认证,确保通信安全。

因为 gRPC 具有跨语言、跨平台、高性能、易用性等优点,它被广泛应用于云原生微服务大规模分布式系统等场景。


🐱‍🐉二、Http/2 协议是什么

HTTP/2是一种用于传输超文本传输协议(HTTP)消息的网络协议。相比于以前版本的HTTP协议,HTTP/2旨在提高Web性能和安全性,并解决HTTP/1.1存在的某些限制。

HTTP/2主要通过以下技术来优化网络通信:

  • 多路复用:HTTP/2允许同时发送多个请求和响应,而无需按顺序等待一个请求完成再发送另一个请求,从而大大减少了延迟时间。
  • 头部压缩:HTTP/2使用专门的算法对请求和响应头部进行压缩,减少了数据传输量,进一步提升了性能。
  • 服务器推送:HTTP/2支持服务器主动向客户端推送资源,这意味着网页加载速度更快,因为客户端不必等待服务器响应之后才开始请求其他资源。
  • 流控制:HTTP/2引入了流控制机制,可以控制每个请求和响应之间的数据流量,减少了网络拥塞的风险。
    总的来说,HTTP/2的目标是使网络通信更快、更高效,并提供更好的用户体验。

🎉三、什么是高性能远程过程调用 (rpc) 框架

RPC(Remote Procedure Call)是一种远程通信协议,它允许在不同的计算机之间进行进程间通信。高性能远程过程调用(high-performance RPC framework)是一种能够快速、可靠地实现RPC通信的框架。
具体来说,高性能RPC框架通常包括以下组件:

  • 通信协议:定义了RPC通信的规范,如数据传输格式、编码解码方式等。
  • 序列化/反序列化:将程序中的对象转换成可以在网络中传输的二进制数据,并在接收端将其还原为原始对象。
  • 网络传输:负责在客户端和服务器之间传递二进制数据。
  • 远程调用处理:在服务器端接收到请求后,根据请求中的信息定位到对应的函数或方法,执行相应的操作,并将结果返回给客户端。
  • 客户端代理:封装了远程调用的细节,使得客户端可以像调用本地函数一样调用远程函数。

🎂四、学习gRpc可以分为哪几步

学习gRPC协议可以分为以下几个步骤:

  1. 了解RPC(远程过程调用)的基本概念和工作原理。
  2. 学习Protocol Buffers(protobuf)的语法,这是gRPC使用的序列化工具。
  3. 熟悉gRPC的架构、通信模型、消息类型和服务定义。
  4. 使用合适的编程语言和工具实现一个简单的gRPC应用程序。
  5. 通过实践深入掌握gRPC的高级功能和性能优化技巧。

对于第一步上面已经讲解过了,接下来直接从第二步开始


🥩五、学习Protocol Buffers(protobuf)的语法

protocol buffers(protobuf)的语法包括以下几个方面:

  • 定义消息类型:使用message关键字定义消息类型,可以在消息中定义各种数据类型,比如int32、string等。
  • 定义枚举类型:使用enum关键字定义枚举类型,可以在枚举中定义一组有限的常量值。
  • 定义服务类型:使用service关键字定义服务类型,可以在服务中定义一组RPC方法。
  • 定义RPC方法:使用rpc关键字定义RPC方法,可以指定输入参数和返回结果的消息类型。
  • 定义包:使用package关键字定义当前文件所属的包名称。
  • 定义字段规则:使用optional、required或者repeated关键字来指定字段的规则,以及是否必须存在和可重复出现。
  • 定义扩展字段:使用extensions关键字来扩展已有的消息类型,同时也需要指定该扩展字段的规则。
  • 定义注释:使用//或者/* */来添加单行或多行注释。

除此之外,protobuf还提供了一些高级功能,比如自定义选项、导入其他文件、嵌套类型等。


🍚六、gRPC的架构、通信模型、消息类型和服务定义

gRPC 是一个高性能、开源的远程过程调用(RPC)框架,使用 Protocol Buffers 作为数据序列化协议。

以下是 gRPC 的架构、通信模型、消息类型和服务定义的详细信息:

架构:

  • 基于 HTTP/2 协议实现
  • 使用 Protocol Buffers 进行数据序列化
  • 支持多种编程语言(如 C++, Java, Python, Go 等)
  • 提供了客户端和服务器端的代码生成器
    通信模型:
  • 采用双向流模式进行数据传输
  • 基于 HTTP/2 的多路复用机制,可以在一个连接上同时处理多个请求和响应
  • 支持四种不同类型的 API 调用方法:Unary RPCs、Server-side streaming RPCs、Client-side streaming RPCs 和 Bidirectional streaming RPCs
    消息类型:
  • Request/Response Messages: 客户端发送请求消息并等待响应消息
  • Streaming Request Messages: 客户端通过流式方式发送一系列请求消息,并等待响应消息
  • Streaming Response Messages: 客户端通过请求消息获取一个流式响应消息
  • Streaming Request and Response Messages: 客户端和服务器通过流式方式交换消息以达到高效数据传输
    服务定义:
  • 使用 Protocol Buffers 中的 .proto 文件定义服务接口和消息类型
  • 定义服务接口时需要指定请求和响应消息类型以及调用方法类型
  • 通过代码生成器生成服务器和客户端的 stub 文件,使得开发人员可以轻松地调用服务。

🥠七、使用合适的编程语言和工具实现一个简单的gRPC应用程序

使用C++编写的简单gRPC应用程序,其中客户端向服务器发送请求,并接收服务器响应:

编写.proto文件,例如my_service.proto:

syntax = "proto3"; // 指定使用的语法版本

package myservice;
// 定义一个服务类型
service MyService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}// 定义 RPC 方法,该方法接受一个 HelloRequest消息,并返回一个HelloResponse消息。
}
// 定义一个消息类型
message HelloRequest {
  string name = 1; // 字段 1,名称为 name,类型为 string
}

message HelloResponse {
  string message = 1; // 字段 1,名称为 message ,类型为 string
}

使用protobuf编译器生成代码:

protoc -I=./ --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` my_service.proto
protoc -I=./ --cpp_out=. my_service.proto

编写服务器代码,例如server.cpp:

#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>
#include "my_service.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using myservice::HelloRequest;
using myservice::HelloResponse;
using myservice::MyService;
// 实现服务
class MyServiceImpl final : public MyService::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloResponse* response) override {
    std::string prefix("Hello ");
    response->set_message(prefix + request->name());
    return Status::OK;
  }
};

void RunServer() {
 // 创建gRPC服务器
  std::string server_address("0.0.0.0:50051");
  MyServiceImpl service;

  ServerBuilder builder;
  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  builder.RegisterService(&service);
  // 启动服务器
  std::unique_ptr<Server> server(builder.BuildAndStart());
  std::cout << "Server listening on " << server_address << std::endl;
  // 启动服务器
  server->Wait();
}

int main(int argc, char** argv) {
  RunServer();
  return 0;
}


🐱‍🚀八、对于高性能RPC框架有没有优化策略

为了实现快速、低延迟的远程调用,高性能RPC框架还会采用以下优化策略:

  • 异步I/O:使用异步I/O可以避免线程阻塞等待I/O操作完成,从而提高并发性和吞吐量。
  • 零拷贝:通过直接内存访问和数据传输技术,避免数据在不同层之间的复制,从而减少CPU和内存的开销,提高性能。
  • 内存池:使用内存池可以避免频繁的内存分配和释放,提高内存利用率和性能。
  • 序列化协议优化:选择高效的序列化协议(如protobuf、thrift等),或者对已有的协议进行定制化优化,减小序列化和反序列化的开销。
  • 负载均衡和故障转移:实现负载均衡和故障转移机制,保证服务的高可用性和可靠性。
  • 安全认证和授权:提供安全认证和授权机制,保障服务的安全性和可信度。

🧊文章总结

提示:这里对文章进行总结:

读到这里相信很多朋友有所收获,接下来继续的深入学习吧






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

前端魔力赏盲盒小程序 UI原生盲盒微信小程序源码下载

前端魔力赏盲盒小程序 UI原生盲盒微信小程序源码下载 亲测可用 前端是小程序原生源码。 很不错的一款盲盒小程序。 完全没有毛病&#xff0c;非常适合研究学习。

【Linux】匿名管道

目录 匿名管道管道特点父子进程通过匿名管道通信匿名管道通信案例 橙色 匿名管道 管道也叫无名&#xff08;匿名&#xff09;管道&#xff0c;是 UNIX 系统 IPC&#xff08;进程间通信&#xff09; 的最古老的形式。 统计一个目录中文件的数目命令 ls | wc -l &#xff0c;为…

会自动化就能拿20K?想多了,你这顶多算是会点皮毛···

现在招个会自动化测试的人是真难呀~ 前一段时间公司计划要招2个自动化测试到岗&#xff0c;同事面试了十几个来应聘的人&#xff0c;发现一个很奇怪的现象&#xff0c;在面试的时候&#xff0c;如果问的是框架API、脚本编写这些问题&#xff0c;基本上所有人都能对答如流&…

湖北省智能科教研究会走进璞华,调研璞公英教学平台个性化教学新模式

2023年5月9日&#xff0c;热烈祝贺湖北省智能科教研究会红5月智能科教走进璞华集团活动圆满成功。会议上&#xff0c;大家畅所欲言&#xff0c;对教育体制改革与教育信息化产品创新&#xff0c;科技成果转化、产教融合、资源互补、学生能力培养等方面展开充分沟通和探讨。 5月9…

解密 Android IPC 机制

在我们使用 Android 手机的时候&#xff0c;有时我们使用的软件会需要消耗比较大的内存&#xff0c;也经常会需要同时打开多个软件。这些时候&#xff0c;我们都会需要使用到多进程技术。作为 Android 开发者&#xff0c;相信我们都知道如何去开启应用的单个多进程&#xff0c;…

【Linux常见指令以及权限理解】权限理解(4)

写在前面 这篇文章&#xff0c;我们来聊一聊Linux下权限相关的知识&#xff0c;我打算从这几个方面展开&#xff1a; 1. 认识Linux下用户的分类 2. 什么叫做权限 3. 没有权限会是什么样子 4. 如何修改权限 5. 其它重要的问题 那么废话不多说&#xff0c;我们现在开始。 …

PDF怎么转换成Word?将PDF转换为Word的三种方法!

在我们需要将PDF文件转换为Word文件时&#xff0c;有几种方法可以选择。通常&#xff0c;我们在文件传输过程中使用的文件格式是PDF&#xff0c;但如果我们需要对文件进行编辑&#xff0c;就需要将其转换为可编辑的Word格式。下面是几种转换方法的介绍&#xff0c;让我们一起来…

【Python从入门到进阶】Python异常处理

接上篇《18、文件内容序列化和反序列化操作》 上一篇我们学习了文件读取及写入数据序列化和反序列化的操作。本篇我们来学习Python中有关异常&#xff08;捕获异常、处理异常等&#xff09;的知识。 一、异常的定义 在编写代码时&#xff0c;我们无法完全掌控程序运行过程中会…

原神服务端建模修改模型贴图(SpecialK)教程

原神服务端建模修改模型贴图(SpecialK)教程 我是艾西&#xff0c;今天跟大家闲聊一下原神建模修改模型等。在一个游戏里开发者会按照自己这个游戏的大方向去运营&#xff0c;而总是有一些小伙伴有不一样的需求&#xff0c;如果是建模拥有独一无二的角色或者是外观装扮等那么艾…

多系统启动U盘Ventory下载、安装、使用

官网链接 Ventoy Ventoy 简介 简单来说&#xff0c;Ventoy是一个制作可启动U盘的开源工具。 有了Ventoy你就无需反复地格式化U盘&#xff0c;你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。 你可以一次性拷贝很多个…

OpenCL编程指南-4.4矢量操作符

矢量操作符 如下描述了可用于矢量数据类型或矢量和标量数据类型组合的各类操作符。 算术操作符 算术操作符&#xff08;加&#xff08;)、减&#xff08;–)、乘&#xff08;*&#xff09;和除&#xff08;/)&#xff09;&#xff0c;可以作用于内置整数、浮点标量和矢量数…

次郎家书——第一天关于数值计算方法考试后——的一些思考和反思

考试的复盘&#xff1a;传送门&#xff1a;数值计算方法考试复盘 对此次考试的看法&#xff1a; 这次考试考试内容虽然有没复习到的如复合辛普森和复合梯形公式还有最小二乘的推广(这里上课的时候听懂了但是复习的时候嫌麻烦没看原来&#xff0c;结果大题是真的写错了&#…

nuxt 一直报错 http://localhost:24678/_nuxt/

解决&#xff1a; 这个错误可能是由于Nuxt.js应用程序无法正确加载/_nuxt/路径下的资源而导致的。解决这个问题的方法有以下几种&#xff1a; 1.检查nuxt.config.js文件 在nuxt.config.js文件中&#xff0c;检查build.publicPath属性是否设置为正确的公共路径。例如&#xff1a…

UART驱动情景分析-read

一、源码框架回顾 shell读数据&#xff0c;一开始的时候没有就休眠。数据从串口发送到驱动&#xff0c;驱动接收到中断&#xff0c;驱动读取串口数据&#xff0c;这个数据会传给行规程。 行规程获取到数据后&#xff0c;会回显。按下删除就删除一个字符&#xff0c;按下回车&am…

pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

文章目录 1. 测量时间的方式2. model.eval(), model.train(), torch.no_grad()方法介绍2.1 model.train()和model.eval()2.2 model.eval()和torch.no_grad() 3. 模型推理时间方式4. 一个完整的测试模型推理时间的代码5. 参考&#xff1a; 1. 测量时间的方式 time.time() time.…

使用qt creator编译zlib

zlib被设计为一个免费的&#xff0c;通用的&#xff0c;法律上不受限制的-即不受任何专利保护的无损数据压缩库&#xff0c;几乎可以在任何计算机硬件和操作系统上使用。 官网&#xff1a;http://www.zlib.net/ 下载zlib源码:http://www.zlib.net/zlib1213.zip 备用地址&#x…

关于使用API接口获取商品数据的那些事

随着电商行业的不断发展&#xff0c;越来越多的企业和个人需要获取各大电商平台上的商品数据。而最常用的方法是使用API接口获取商品数据。本文将为您介绍使用API接口获取商品数据的步骤和注意事项。 一、选择API接口 首先需要了解各大电商平台提供的API接口&#xff0c;目前…

由浅入深理解java集合(一)——集合框架 Collection、Map

Java 提供了一套完整的集合类&#xff08;也可以叫做容器类&#xff09;来管理一组长度可变的对象&#xff08;也就是集合的元素&#xff09;&#xff0c;其中常见的类型包括 List、Set、Queue 和 Map。从我个人的编程经验来看&#xff0c;List 的实现类 ArrayList 和 Map 的实…

华为OD机试 - 查找树中元素(Python)

题目描述 已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依次类推;y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依次类推; 举例:…

手把手教你用代码画架构图 | 京东云技术团队

作者&#xff1a;京东物流 覃玉杰 1. 前言 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型&#xff0c;并手把手教大家如何使用代码绘制出精美的C4架构图。 阅读本文之后&#xff0c;读者画的架构图将会是这样的&#xff1a; 注&#xff1a;该图例仅作绘图示例使…