什么是gRPC?

gRPC(gRPC Remote Procedure Call)是一个高性能、开源、通用的远程过程调用(RPC)框架,最初由 Google 开发。gRPC 使用 HTTP/2 作为传输协议,并采用 Protocol Buffers(protobuf)作为接口描述语言(IDL)和数据序列化协议。

gRPC 的主要特点

  1. 高性能和高效:

    • gRPC 利用 HTTP/2 提供高效的二进制传输,流式传输,多路复用,以及优先级和头部压缩等功能。
    • 通过 Protocol Buffers 进行高效的序列化和反序列化,确保数据在传输过程中的紧凑性和速度。
  2. 多语言支持:

    • gRPC 支持多种编程语言,包括但不限于 C++, Java, Python, Go, Ruby, C#, Node.js 和 PHP。这样不同语言的服务可以方便地互相调用。
  3. 自动代码生成:

    • gRPC 使用 Protocol Buffers 描述服务接口和消息结构,通过工具链自动生成客户端和服务端的代码,这减少了手动编写重复代码的需要。
  4. 双向流式通信:

    • gRPC 支持双向流式通信,允许客户端和服务端之间进行实时数据交换,适用于需要实时通信的应用场景。
  5. 互操作性和扩展性:

    • gRPC 可以方便地在多种环境中部署,包括云计算环境、数据中心、移动设备等,并能与其他系统进行互操作。

典型应用场景

  • 微服务架构:
    gRPC 非常适合微服务架构中各个服务之间的高效通信。
  • 实时通信:
    适用于需要实时数据交换的应用,如视频流、实时聊天等。
  • 跨语言通信:
    在多语言环境中,gRPC 提供了统一的接口和高效的通信机制。

资源

  • gRPC 官方网站
  • Protocol Buffers 官方网站
  • gRPC GitHub 仓库

以下是使用C++实现一个简单的gRPC示例。这个示例同样是一个简单的计算器服务,提供加法运算。

1. 定义服务 (Proto文件)

首先,创建一个Proto文件(calculator.proto),定义服务和消息类型。

syntax = "proto3";package calculator;// 定义请求消息
message AddRequest {int32 a = 1;int32 b = 2;
}// 定义响应消息
message AddResponse {int32 result = 1;
}// 定义计算器服务
service Calculator {rpc Add(AddRequest) returns (AddResponse);
}

2. 生成代码

使用 protoc 工具生成C++代码。确保你已经安装了gRPC和Protobuf工具。运行以下命令生成代码:

protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` calculator.proto

这将生成 calculator.pb.h, calculator.pb.cc, calculator.grpc.pb.hcalculator.grpc.pb.cc 文件。

3. 实现服务器端

创建一个C++文件(server.cpp),实现服务器端代码。

#include <iostream>
#include <memory>
#include <string>#include <grpcpp/grpcpp.h>
#include "calculator.grpc.pb.h"using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using calculator::AddRequest;
using calculator::AddResponse;
using calculator::Calculator;// 实现服务定义
class CalculatorServiceImpl final : public Calculator::Service {
public:Status Add(ServerContext* context, const AddRequest* request, AddResponse* response) override {int a = request->a();int b = request->b();response->set_result(a + b);return Status::OK;}
};// 启动gRPC服务器
void RunServer() {std::string server_address("0.0.0.0:50051");CalculatorServiceImpl 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;
}

4. 实现客户端

创建另一个C++文件(client.cpp),实现客户端代码。

#include <iostream>
#include <memory>
#include <string>#include <grpcpp/grpcpp.h>
#include "calculator.grpc.pb.h"using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using calculator::AddRequest;
using calculator::AddResponse;
using calculator::Calculator;class CalculatorClient {
public:CalculatorClient(std::shared_ptr<Channel> channel): stub_(Calculator::NewStub(channel)) {}int Add(int a, int b) {AddRequest request;request.set_a(a);request.set_b(b);AddResponse response;ClientContext context;Status status = stub_->Add(&context, request, &response);if (status.ok()) {return response.result();} else {std::cerr << "RPC failed" << std::endl;return -1;}}private:std::unique_ptr<Calculator::Stub> stub_;
};int main(int argc, char** argv) {CalculatorClient client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));int result = client.Add(10, 20);std::cout << "Add result: " << result << std::endl;return 0;
}

5. 编译和运行

确保你已经安装了gRPC和Protobuf的开发库。可以使用以下命令编译和运行服务器和客户端。

编译
g++ -std=c++11 server.cpp calculator.pb.cc calculator.grpc.pb.cc -o server -lgrpc++ -lprotobuf -lpthread
g++ -std=c++11 client.cpp calculator.pb.cc calculator.grpc.pb.cc -o client -lgrpc++ -lprotobuf -lpthread
运行

首先运行服务器:

./server

然后在另一个终端窗口运行客户端:

./client

你应该会看到客户端输出:

Add result: 30

解释

  1. Proto文件:定义了服务和消息类型。
  2. 服务器端:实现了Calculator服务,并启动了gRPC服务器监听特定端口。
  3. 客户端:创建了一个gRPC通道,调用了远程的Add方法,并获取了结果。

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

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

相关文章

使用autodl服务器进行模型训练

1.注册并且选择一个服务器租用 2.点击jupyter lab进入服务器内部 3.把yolov5-master这个的压缩文件上传到jupyter的文件列表中 4.打开终端 (1)查看目录 ls (2)解压yolov5-master(1) unzip "yolov5-master (1).zip" 可以看到解压成功&#xff01; (3)进入yolov5-m…

【Ubuntu上安装mvn】

Installing Maven on Linux/Ubuntu 在 Linux 系统中安装 Maven。 Step 1: Download the Maven Binaries 下载解压 $ wget <https://mirrors.estointernet.in/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz> $ tar -xvf apache-maven-3.6.3-bin…

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的系统隔离属性

安全之安全(security)博客目录导读 目录 一、系统隔离属性 1、系统配置完整性 1.1、时间隔离 2、关键错误的报告 一、系统隔离属性 1、系统配置完整性 MSD必须确保任何可能危及其安全保证的系统寄存器的正确性和完整性。例如&#xff0c;MSD必须确认内存控制器配置是一致…

[数据集][目标检测]焊接处缺陷检测数据集VOC+YOLO格式3400张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3400 标注数量(xml文件个数)&#xff1a;3400 标注数量(txt文件个数)&#xff1a;3400 标注…

基于Chan-Vese算法的图像边缘提取matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 迭代更新水平集函数 err[]…

PLC编程与IT编程的区别:深入探索两者之间的奥秘

PLC编程与IT编程的区别&#xff1a;深入探索两者之间的奥秘 在科技日新月异的今天&#xff0c;编程已成为各个领域中不可或缺的技能。然而&#xff0c;在众多的编程领域中&#xff0c;PLC编程和IT编程因其各自独特的特点和应用领域而备受关注。那么&#xff0c;PLC编程和IT编程…

【Linux】GNU编译器基础

文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等&#xff0c;适用于C/C中&#xff0c;在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作&#xff0c;但在Linux系统中通常使用GNU编译器来进行&#xff0c;对于C/C等高级语言需要进行预编译、编…

亚马逊对IP的要求是什么?

IP的全称为Internet Protocol&#xff0c;是TCP/IP体系中的网际层协议&#xff0c;IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。IP规定网络上所有的设备都必须有一个独一无二的IP地址&#xff0c;就好比是邮件上都必须注明收件人地址&#xff0c;邮递员才能…

函数递归输出1~100的数字及递归的栈溢出问题

什么是递归&#xff1f; 递归就是函数⾃⼰调⽤⾃⼰递归中的递就是递推的意思&#xff0c;归就是回归的意思如果递归就像循环一样&#xff0c;打一个大的复杂问题转化一个小的问题&#xff0c;但是要与原问题相似&#xff0c;分解成规模较⼩的⼦问题来求解&#xff1b;直到⼦问…

Spark SQL数据源 - 基本操作

Spark SQL 提供了丰富的API来与各种数据源进行交互&#xff0c;包括Parquet、JSON、CSV、JDBC等。以下是一些使用Spark SQL与数据源进行基本操作的基本步骤和示例代码。 1. 初始化SparkSession 首先&#xff0c;你需要初始化一个SparkSession对象&#xff0c;这是Spark SQL的…

【scau大数据技术与原理2】综合性实验Spark集群的安装和使用——安装启动spark shell篇

实验内容简介&#xff1a; Spark是一个分布式计算框架&#xff0c;常用于大数据处理。本次实验中&#xff0c;首先设计一个包含主节点和从节点的Spark集群架构&#xff0c;并在CentOS的Linux环境下进行搭建。通过下载并解压Spark安装包&#xff0c;配置环境变量和集群参数&…

【Python Cookbook】S1E09 对切片命名

目录 问题解决方案讨论 问题 代码的可阅读性非常重要&#xff0c;如何增强切片中的可阅读性&#xff1f;本文将提供一种方案。 解决方案 假设有一些代码用来从字符串的固定位置取出具体的数据&#xff1a; record "...100...513.25..." cost int(record[3:6]) …

【显示方案IC-速显微】

最近偶然间接触到“速显微”的显示方案&#xff0c;个人体验了一把感觉还是挺顺手的&#xff0c;虽然手里没有板子没有上手测试一番。 这是他们的官网链接&#xff1a; https://www.thorsianway.com/product/chip 从官网可以看到有两颗个系列的IC已经量产&#xff1a;GC9005和G…

Docker部署pulsar独立集群消息队列服务器

1、下载Pulsar docker 镜像 docker pull apachepulsar/pulsar:latest 2、生成Pulsar容器&#xff0c;把容器的6650和8080端口映射到宿主机的6650和8080端口&#xff0c;standalone参数表示pulsar为独立集群模式&#xff0c;把容器中的conf目录映射到宿主机的/var/lib/docker/…

【QEMU中文文档】1.1 支持的构建平台

本文由 AI 翻译&#xff08;ChatGPT-4&#xff09;完成&#xff0c;并由作者进行人工校对。如有任何问题或建议&#xff0c;欢迎联系我。联系方式&#xff1a;jelin-shoutlook.com。 原文&#xff1a;Supported build platforms — QEMU documentation QEMU 旨在支持在多个主机…

Apache Calcite - 使用内置函数

前言 在上一篇文章中学习了如何适配来源数据&#xff0c;并使用sql查询数据。当我们获取数据后&#xff0c;通常还会进行各种计算、变换工作&#xff0c;这时使用内置函数可以极大提高我们的效率。 函数介绍 Apache Calcite 提供了广泛的 SQL 函数支持&#xff0c;包括但不限…

基础—SQL—DCL(数据控制语言)小结

一、总结 在SQL分类中的DCL语句部分&#xff0c;主要讲到了两个部分的知识。 1、用户管理 用户管理&#xff0c;主要是管理哪些用户可以访问当前 mysql 数据库。 包括&#xff1a;创建用户、修改用户密码以及删除用户 2、权限控制 权限管理&#xff0c;主要是控制我们当前用户…

vue前端Echars

<template><div :class"className" :style"{height:height,width:width}" /> </template><script> import * as echarts from echarts require(echarts/theme/macarons) // echarts theme 柱状图 import resize from ./mixins/re…

代码随想录算法训练营Day24|216.组合总和III、17.电话号码的字母组合

组合总和III 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 思路和昨日的组合题类似&#xff0c;但注意对回溯算法中&#xff0c;收获时的条件需要写对&#xff0c;path的长度要为k的同时&#xff0c;path中元素总和要为n。 class Solution { public:vector<…

禁用USB端口的办法,哪一种禁用USB端口的方法好

禁用USB端口的办法&#xff0c;哪一种禁用USB端口的方法好 禁用USB端口是保护公司数据安全的一种常见做法&#xff0c;旨在防止未经授权的数据传输和潜在的恶意软件传播。以下是几种常见的禁用USB端口方法及其效果评价。 1、硬件方法&#xff1a; BIOS设置&#xff1a;通过BIO…