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

这篇具有很好参考价值的文章主要介绍了【C++】开源:grpc远程过程调用(RPC)配置与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍grpc远程过程调用(RPC)配置与使用。
无专精则不能成,无涉猎则不能通。。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

😏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安装和源码安装:

# apt安装
sudo apt install protobuf-compiler-grpc libgrpc++-dev
# 安装依赖
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

测试代码,验证版本:

#include <iostream>
#include <grpcpp/grpcpp.h>

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

编译运行:

g++ -o main main.cpp -lgrpc++ -lgrpc -lprotobuf -lpthread  && ./main

😆3. 使用说明

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

example官方示例:

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

syntax = "proto3";

package helloworld;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

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

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

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

服务端示例:

#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;
}

客户端示例:

#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;
}

编译:

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

【C++】开源:grpc远程过程调用(RPC)配置与使用,# c++开源项目学习,c++,开源,rpc

以上。文章来源地址https://www.toymoban.com/news/detail-609043.html

到了这里,关于【C++】开源:grpc远程过程调用(RPC)配置与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rpc、gRPC快速入门,python调用,protobuf协议

    远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据 举例:在 a服务内

    2024年02月13日
    浏览(44)
  • 使用C++和OpenCV进行人脸识别,包含模型训练与调用过程

    人脸识别是计算机视觉领域的一个重要应用,可以用于安全系统、人脸解锁和人脸表情分析等方面。本教程将向您展示如何使用C++和OpenCV库实现基本的人脸识别功能。我们将分为两部分,首先是模型训练过程,然后是调用过程。 安装OpenCV和C++开发环境: 在开始之前,请确保

    2024年02月09日
    浏览(32)
  • 深入剖析gRPC:Google开源的高性能RPC框架

    在本篇文章中,我们将深入剖析gRPC,Google开源的高性能RPC框架。gRPC是一种基于HTTP/2的高性能、可扩展的RPC框架,它使用Protocol Buffers作为接口定义语言,可以在多种编程语言之间实现无缝通信。 gRPC的核心设计理念是:通过使用HTTP/2作为传输协议,实现高效、可扩展的RPC通信

    2024年02月19日
    浏览(38)
  • 【C++】开源:MQTT安装与配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MQTT安装与配置使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 官网: https://mqtt.org/ MQTT 是一个基于 客户端-服务器 的 消息发布/订阅传

    2024年02月05日
    浏览(34)
  • 【C++】开源:CGAL计算几何库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/CGAL/cgal CGAL(Computational G

    2024年02月13日
    浏览(30)
  • 【C++】开源:Boost库常用组件配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/boostorg/boost Boost库在线书籍

    2024年02月15日
    浏览(39)
  • 【C++】开源:Muduo网络库配置与使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Muduo网络库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/chenshuo/muduo Muduo 是一个基于

    2024年02月15日
    浏览(26)
  • 【C++】开源:事件驱动网络库libevent配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/libevent/libevent 官网:

    2024年02月14日
    浏览(32)
  • 【C++】开源:Redis数据库配置与使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Redis数据库配置与使用。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/redis/redis Redis(Remote Dict

    2024年02月15日
    浏览(34)
  • 【C++】开源:MQTT安装与配置使用(mosquitto)

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MQTT安装与配置使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 官网: https://mqtt.org/ MQTT 是一个基于 客户端-服务器 的 消息发布/订阅传

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包