2023 您所在的位置:网站首页 grpc服务端推送 2023

2023

2023-11-13 06:10| 来源: 网络整理| 查看: 265

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

💥💥💥欢迎来到🤞汤姆🤞的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协议可以分为以下几个步骤:

了解RPC(远程过程调用)的基本概念和工作原理。学习Protocol Buffers(protobuf)的语法,这是gRPC使用的序列化工具。熟悉gRPC的架构、通信模型、消息类型和服务定义。使用合适的编程语言和工具实现一个简单的gRPC应用程序。通过实践深入掌握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 #include #include #include #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(builder.BuildAndStart()); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有