Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【C++】开源:grpc远程过程调用(RPC)配置与使用

【C++】开源:grpc远程过程调用(RPC)配置与使用

作者头像
DevFrank
发布于 2024-07-24 07:32:22
发布于 2024-07-24 07:32:22
41300
代码可运行
举报
运行总次数:0
代码可运行

😏1. 项目介绍

项目Github地址:https://github.com/grpc/grpc

官网:https://grpc.io/

中文文档:https://doc.oschina.net/grpc?t=57966

gRPC是一个高性能、开源的远程过程调用(RPC)框架,由Google开发并基于Protocol Buffers实现。它可以在客户端和服务器之间进行快速、有效的通信,并支持多种编程语言。gRPC的设计目标是让开发者能够像调用本地函数一样调用远程服务,从而简化分布式系统的开发。

以下是gRPC的主要特点和优势:

1.高效性能:gRPC使用基于HTTP/2的协议进行通信,支持双向流、流式处理和多路复用等特性,从而实现了更高效的数据传输和低延迟的通信。

2.强大的IDL(接口定义语言):gRPC使用Protocol Buffers作为其默认的IDL,它提供了简单、轻量级的数据交换格式,并通过代码生成工具生成符合各种编程语言的代码。这使得开发者可以轻松定义服务接口和数据结构,并自动生成相应的代码。

3.多语言支持:gRPC支持多种编程语言,包括但不限于Java、C++、Python、Go、Node.js等,这使得不同语言的应用程序可以无缝地进行通信和集成。

4.支持多种服务类型:gRPC支持四种服务类型:Unary、Server Streaming、Client Streaming和Bidirectional Streaming。这使得开发者可以根据实际需求选择最适合的服务类型,并实现灵活的数据传输方式。

5.可插拔的认证和流控制:gRPC提供了可插拔的认证机制,可以基于SSL/TLS进行安全通信。此外,还支持流控制、拦截器、错误处理等功能,使得开发者可以更好地控制和管理通信过程。

6.丰富的生态系统:gRPC拥有活跃的社区和广泛的应用场景,许多知名公司和项目都在使用gRPC。这意味着你可以从丰富的资源中获取支持、文档和示例代码,从而更好地学习和使用gRPC。

总结起来,gRPC是一个强大的远程过程调用框架,它具有高效性能、强大的IDL、多语言支持、多种服务类型和丰富的生态系统。通过使用gRPC,开发者可以轻松构建高性能、可扩展的分布式系统,并简化不同语言之间的通信和集成。

😊2. 环境配置

下面进行环境配置,包括apt安装和源码安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# apt安装
sudo apt install protobuf-compiler-grpc libgrpc++-dev
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 安装依赖
sudo apt install build-essential autoconf libtool pkg-config
# 源码安装
git clone --recurse-submodules -b v1.56.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
cd grpc
mkdir -p cmake/build
cd cmake/build
cmake -DgRPC_INSTALL=ON \
      -DgRPC_BUILD_TESTS=OFF \
      -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
      ../..
make -j4
sudo make install
sudo ldconfig

测试代码,验证版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <grpcpp/grpcpp.h>

int main() {
  std::cout << "gRPC version: " << grpc_version_string() << std::endl;
  return 0;
}

编译运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -o main main.cpp -lgrpc++ -lgrpc -lprotobuf -lpthread  && ./main

😆3. 使用说明

源码提供了一些案例,在example,可在此基础上扩充服务信息,即更改proto相关协议,用法跟protobuf类似。

example官方示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd examples/cpp/helloworld
mkdir -p cmake/build
cd cmake/build
cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../..
make -j4
# 运行
./greeter_server
./greeter_client
# 结果
Greeter received: Hello world
服务端和客户端调用示例:

因为grpc也是用protobuf作为数据序列化协议,所以先创建helloworld.proto

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package helloworld;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

使用protobuf-grpc编译器生成c++代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protoc -I=. --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto

服务端示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "helloworld.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;

class GreeterServiceImpl final : public Greeter::Service
{
    Status SayHello(ServerContext *context, const HelloRequest *request,
                    HelloReply *reply) override
    {
        std::string prefix("Hello, ");
        reply->set_message(prefix + request->name());
        return Status::OK;
    }
};

void RunServer()
{
    std::string server_address("0.0.0.0:50051");
    GreeterServiceImpl 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()
{
    RunServer();
    return 0;
}

客户端示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "helloworld.grpc.pb.h"

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;

class GreeterClient
{
public:
    GreeterClient(std::shared_ptr<Channel> channel)
        : stub_(Greeter::NewStub(channel)) {}

    std::string SayHello(const std::string &name)
    {
        HelloRequest request;
        request.set_name(name);

        HelloReply reply;
        ClientContext context;

        Status status = stub_->SayHello(&context, request, &reply);
        if (status.ok())
        {
            return reply.message();
        }
        else
        {
            return "RPC failed";
        }
    }

private:
    std::unique_ptr<Greeter::Stub> stub_;
};

int main()
{
    std::string server_address("localhost:50051");
    GreeterClient greeter(grpc::CreateChannel(
        server_address, grpc::InsecureChannelCredentials()));
    std::string user("World");

    std::string reply = greeter.SayHello(user);
    std::cout << "Server replied: " << reply << std::endl;

    return 0;
}

编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ server.cpp helloworld.grpc.pb.cc helloworld.pb.cc -lgrpc++ -lgrpc -lprotobuf -lpthread -o server
g++ client.cpp helloworld.grpc.pb.cc helloworld.pb.cc -lgrpc++ -lgrpc -lprotobuf -lpthread -o client
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
protoc -I=protos/ --grpc_out=protos/ --plugin=protoc-gen-grpc="C:\vcpkg\vcpkg\installed\x64-windows\tools\grpc\grpc_cpp_plugin.exe" protos/greet.proto生成greet.pb.h、greet.pb.cc、greet.grpc.pb.h、greet.grpc.pb.cc四个文件
码事漫谈
2025/02/15
880
基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
C++中gRPC:从小白入门到大神精通
在当今分布式系统盛行的时代,高效的通信机制是构建健壮、可扩展软件的关键。gRPC作为一个高性能、开源的远程过程调用(RPC)框架,在C++开发领域中扮演着重要角色。无论是开发微服务架构,还是构建大规模分布式系统,掌握gRPC都能让你的开发工作事半功倍。接下来,让我们一起开启从gRPC小白到大神的学习之旅。
码事漫谈
2025/02/07
3270
C++中gRPC:从小白入门到大神精通
gRPC cpp 框架快速上手
在gRPC框架中,运行在不同机器上的客户端应用可以直接调用服务器端上「提供的方法」,使得我们可以更容易的创建一个分布式系统。
Mculover666
2021/11/02
1.1K0
gRPC 基础概念详解
作者:jasonzxpan,腾讯 IEG 运营开发工程师 gRPC (gRPC Remote Procedure Calls) 是 Google 发起的一个开源远程过程调用系统,该系统基于 HTTP/2 协议传输,本文介绍 gRPC 的基础概念,首先通过关系图直观展示这些基础概念之间关联,介绍异步 gRPC 的 Server 和 Client 的逻辑;然后介绍 RPC 的类型,阅读和抓包分析 gRPC 的通信过程协议,gRPC 上下文;最后分析 grpc.pb.h 文件的内容,包括 Stub 的能力、
腾讯技术工程官方号
2021/07/12
4.2K0
Cpp(九) gRPC protobuf for C++ 基本使用
Mac: https://github.com/Coxhuang/FKCpp/tree/master/gRPCDemo/macOS
Autooooooo
2021/02/02
5.8K0
【每周一库】- Tonic 基于Rust的gRPC实现
gRPC的rust实现,高性能,开源,为移动设备与HTTP/2准备的通用RPC框架
MikeLoveRust
2020/07/28
1.6K0
Golang 语言 gRPC 怎么使用?
在之前的两篇文章中,我们已经介绍了使用 gRPC 创建 RPC 应用的前导知识。我们了解到 gRPC 支持多语言,本文我们介绍在 Golang 语言中怎么使用 gRPC。
frank.
2021/09/29
1.6K0
远程过程调用系统gRPC
在 gRPC-Go 中,RPC 以阻塞/同步模式运行,这意味着 RPC 调用等待服务器响应,并且将返回响应或错误。
Yuyy
2022/09/21
4720
远程过程调用系统gRPC
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.2K0
Rust使用gRPC
需要先安装protoc(Protocol Buffers Compiler),可据此Protobuf Compiler Installation[1]下载
fliter
2024/01/09
2490
Rust使用gRPC
基于内存通信的gRPC调用
Apache Dubbo 有injvm方式的通信,能够避免网络带来的延迟,同时也不占用本地端口,对测试、本地验证而言,是一种比较方便的RPC通信方式。
Robert Lu
2021/11/24
1.4K0
Golang笔记 6.3 RPC 编程之 gRPC
先了解几个基本概念,https://grpc.io/docs/guides/concepts/
twowinter
2020/04/17
1.5K0
gRPC学习笔记2 - 示例
两个微服务之间通过基于 HTTP 2.0 二进制数据帧通信,使用 gRPC 内置的 protobuf 协议,其 DSL 语法 可清晰定义服务间通信的数据结构
张云飞Vir
2020/04/09
6570
服务端测试实战之rpc协议(二)
在服务端测试(一)中详细了介绍了服务端测试中的策略和方法论,以及针对服务端测试中稳定性的测试,以及高并发下对服务的并发请求。不过在企业的应用中,除了REST API的接口,还有gRPC的协议,主要应用于金融以及货币交易等领域,当然不仅仅如此,gRPC协议是一个高性能,开源和通用的框架,主流的开发语言都提供了对应的API,如Java,Go,Python等语言。gRPC的协议是基于HTTP/2标准设计(REST API 基本是基于HTTP/1.1设计),可以处理双向流,单路复用等,这些特性在移动端的领域表现更加高效,而且更加节省空间,背后的技术团队是Google。
无涯WuYa
2021/05/06
8120
开发基于 gRPC 协议的 Node 服务【Node进阶】
在 Shopee 任职期间,我在开发 gRPC 协议的 node 微服务时有过不错的一些实践,配置中心、差分服务、官网服务等。因此我写下这篇文章,做一些些的总结,记录一下碰到的问题、解决的方法以及一些个人的小小见解。
coder_koala
2021/07/08
9830
开发基于 gRPC 协议的 Node 服务【Node进阶】
ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话,那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS2019,当然你也可以使用VS Code进行。
依乐祝
2019/04/09
1.7K0
ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
grpc官方文档实验与翻译(python
tensorflow分布式与tensorflow serving底层通信都是是用的grpc,所以就看了一下grpc的基本用法(python版)
py3study
2020/01/09
1K0
grpc官方文档实验与翻译(python
.NET gRPC核心功能初体验
gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。
有态度的马甲
2021/03/12
1.8K0
.NET gRPC核心功能初体验
和大象装冰箱一样:开发gRPC总共分三步 【掘金签约文章】
上一篇文章我们介绍了ProtoBuf的使用,不了解ProtoBuf的同学建议先读这篇文章:签约掘金:一文带你玩转ProtoBuf 【文末抽奖】,会用protobuf是学习gRPC的基础。
王中阳Go
2022/10/26
4100
和大象装冰箱一样:开发gRPC总共分三步 【掘金签约文章】
.NET领域最硬核的gRPC 核心能力一把梭
有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。
有态度的马甲
2024/01/19
3930
.NET领域最硬核的gRPC 核心能力一把梭
相关推荐
基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验