2023-5-15-gRpc框架学习



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

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





🍬本文摘要

在这里插入图片描述




😉一、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
下一篇
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值