2023-5-15-gRpc框架学习

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 2023-5-15-gRpc框架学习

😉一、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等),或者对已有的协议进行定制化优化,减小序列化和反序列化的开销。
  • 负载均衡和故障转移:实现负载均衡和故障转移机制,保证服务的高可用性和可靠性。
  • 安全认证和授权:提供安全认证和授权机制,保障服务的安全性和可信度。

🧊文章总结

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

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



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
存储 负载均衡 Cloud Native
gRPC的原理和实践
gRPC的原理和实践
556 1
gRPC的原理和实践
|
7月前
|
网络协议 编译器 Go
玩转gRPC—深入概念与原理
玩转gRPC—深入概念与原理
145 0
|
2月前
|
网络协议 安全 Go
|
7月前
|
XML Go 开发工具
RPC简介和grpc的使用
RPC简介和grpc的使用
104 0
|
编解码 网络协议 Go
golang如何使用原生RPC及微服务简述
golang如何使用原生RPC及微服务简述
|
负载均衡
gRPC源码分析(二):从官网文档看gRPC的特性
在第一部分,我们学习了gRPC的基本调用过程,这样我们对全局层面有了一定了解。接下来,我们将结合官方文档,继续深入学习、探索下去。
88 0
|
JSON Cloud Native 网络协议
gRPC简介: Google的高性能RPC框架
gRPC简介: Google的高性能RPC框架
273 0
|
XML JSON 自然语言处理
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
1734 0
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
|
存储 中间件 Java
开源 Golang 微服务入门一: HTTP 框架 Hertz
Hertz 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点
644 0
开源 Golang 微服务入门一: HTTP 框架 Hertz
|
Cloud Native 物联网 编译器
gRPC(三)基础:gRPC快速入门
Protobuf 是 Google 的序列化/反序列化协议,可以轻松定义服务和自动生成客户端库。gRPC 使用此协议作为其接口定义语言 (IDL) 和序列化工具集。
403 0
gRPC(三)基础:gRPC快速入门