gRPC開發指南:Visual Studio 2022 + Vcpkg + Windows全流程配置

前言

? ? ? gRPC作為Google開源的高性能RPC框架,在微服務架構中扮演著重要角色。本文將詳細介紹在Windows平臺下,使用Visual Studio 2022和Vcpkg進行gRPC開發的完整流程,包括環境配置、項目搭建、常見問題解決等實用內容。

環境準備

1. 安裝必要組件

首先確保已安裝以下軟件:

  • Visual Studio 2022(需勾選"C++桌面開發"工作負載)

  • Git(用于Vcpkg管理)

2. 配置Vcpkg(具體可以參考這個C ++第三方庫安裝工具)

# 克隆Vcpkg倉庫
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg# 安裝Vcpkg
.\bootstrap-vcpkg.bat# 集成到全局(需要管理員權限)
.\vcpkg integrate install

二、安裝gRPC依賴

在vcpkg的根目錄下打開cmd

# 安裝gRPC和Protobuf
vcpkg install grpc:x64-windows protobuf:x64-windows# 可選:安裝測試工具
vcpkg install grpc:x64-windows protobuf:x64-windows gtest:x64-windows

三、使用?protoc?編譯?.proto?文件

1.在任意位置新建文件夾,并新建.proto?文件,如HelloWorld.proto,并編輯文件類容。

syntax = "proto3";
package HelloWorld;
service Greeter{rpc SayHello (HelloRequest)  returns (HelloReply){
}
}message HelloRequest {string name = 1;
}message HelloReply{string message =1;}
2.在相應的當前目錄下打開cmd,編譯此 .proto 文件(生成 .pb.h 和 .pb.cc)
protoc --proto_path=你的proto文件目錄 --cpp_out=輸出目錄 HelloWorld.proto

比如我的位置

protoc --proto_path=. --cpp_out=. HelloWorld.protoprotoc --proto_path=. --grpc_out=. --plugin=protoc-gen-grpc="E:\Vcpkg\vcpkg\installed\x64-windows\tools\grpc\grpc_cpp_plugin.exe" HelloWorld.proto    

2.1如果protoc -- 編譯失敗,可能是編譯路徑不對,可以將protoc 編譯環境變量配置到全局變量中。

3.再編譯完成之后,會在你的測試文件夾下生成相應的編譯文件

三、在vs2022中創建客戶端與服務端項目進行測試

設置項目結構如下,服務端和客戶端工程目錄結構一樣。

(1)客戶端代碼如下

#include <grpcpp/grpcpp.h>#include "../HelloWorld.pb.h"   // 確保路徑正確
#include "../HelloWorld.grpc.pb.h"using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using HelloWorld::HelloRequest;
using HelloWorld::HelloReply;
using HelloWorld::Greeter;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;// 發起RPC調用Status status = stub_->SayHello(&context, request, &reply);if (status.ok()) {return reply.message();}else {std::cerr << "RPC failed: " << status.error_message() << std::endl;return "RPC Error";}}private:std::unique_ptr<Greeter::Stub> stub_;
};int main() {// 連接到服務端(地址需與服務端一致)std::string server_address("localhost:50059");GreeterClient client(grpc::CreateChannel(server_address,grpc::InsecureChannelCredentials()  // 測試用非安全連接));// 發起請求std::string name("World");std::string response = client.SayHello(name);std::cout << "Server responded: " << response << std::endl;return 0;
}

(2)服務端代碼如下

HelloWorldService.h

#pragma once
#include <grpcpp/grpcpp.h>
#include "../HelloWorld.pb.h"
#include "../HelloWorld.grpc.pb.h"using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using HelloWorld::HelloRequest;
using HelloWorld::HelloReply;
using HelloWorld::Greeter;// 添加RunServer函數聲明
void RunServer();  //class GreeterServiceImpl final : public Greeter::Service {
public:Status SayHello(ServerContext* context,const HelloRequest* request,HelloReply* reply) override;
};

HelloWorldService.cpp

#include "HelloWorldService.h"Status GreeterServiceImpl::SayHello(ServerContext* context,const HelloRequest* request,HelloReply* reply) {std::string prefix("Hello ");reply->set_message(prefix + request->name());return Status::OK;
}void RunServer() {std::string server_address("0.0.0.0:50059");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();
}

main.cpp

// 只包含頭文件,不要包含.cpp文件!
#include "HelloWorldService.h" int main() {RunServer();return 0;
}

同時啟動項目,結果如下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83912.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#控制流

&#x1f9e9; 一、控制流概述 C# 中的控制流語句用于根據條件或循環執行代碼塊。它們是程序邏輯的核心部分。 ? 二、1. if、else if、else int score 85;if (score > 90) {Console.WriteLine("優秀"); } else if (score > 60) {Console.WriteLine("及…

你知道mysql的索引下推么?

在此之前&#xff0c;需要先明白mysql內部的一個大致結構&#xff0c;mysql內部大概是劃分為3處&#xff0c;client客戶端連接&#xff0c;server層&#xff0c;存儲引擎層 索引下推是mysql5.6之后內部的一種索引優化手段。 比如現在我有一張表student表&#xff0c;字段有id&…

mysql的基礎命令

1.SQL的基本概念 SQL 是用于管理和操作關系型數據庫的標準編程語言。是所有關系型數據庫&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的通用語言。 SQL語句分類 DDL: Data Defination Language 數據定義語言 CREATE&#xff0c;DROP&#xff0c;ALTER DML: Da…

Python爬蟲實戰:研究加密參數的定位方法,實現逆向解密

一、引言 在數字化信息時代,網絡數據成為重要的戰略資源。Python 以其簡潔的語法和豐富的庫生態,成為網絡爬蟲開發的首選語言。然而,隨著互聯網安全防護意識的增強,網站普遍采用加密技術保護數據接口,如請求參數加密、會話驗證、動態令牌等,這使得傳統爬蟲技術面臨巨大挑…

軸承表面缺陷檢測數據集VOC+YOLO格式3945張3類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;3945 標注數量(xml文件個數)&#xff1a;3945 標注數量(txt文件個數)&#xff1a;3945 標注…

【51單片機中斷】

目錄 配置流程 1.在IE寄存器中開啟總中斷通道和需要的某中斷通道 2.在TCON寄存器開啟所用中斷的觸發方式 3.使用中斷函數完成中斷 4.若需要中斷嵌套則在IP寄存器中配置 5.若需要使用串口的中斷&#xff0c;則配置SCON寄存器 6.代碼示例 配置流程 1.在IE寄存器中開啟總…

【機器學習】Anaconda安裝后打不開jupyter notebook(網頁不自動跳出)

文章目錄 一、遇到的問題&#xff1a;jupyter notebook網頁不自動跳出&#xff08;一&#xff09;輸入jupyter notebook命令&#xff08;二&#xff09;手動打開網頁 二、解決辦法&#xff1a;指定瀏覽器&#xff08;一&#xff09;找文件 jupyter_notebook_config.py&#xff…

數字格式化庫 accounting.js的使用說明

accounting.js 是一個用于格式化數字、貨幣和金額的輕量級庫&#xff0c;特別適合財務和會計應用。以下是其詳細使用說明&#xff1a; 安裝與引入 通過 npm 安裝&#xff1a; bash 復制 下載 npm install accounting 引入&#xff1a; javascript 復制 下載 const accounting …

DeepSpeed簡介及加速模型訓練

DeepSpeed是由微軟開發的開源深度學習優化框架&#xff0c;專注于大規模模型的高效訓練與推理。其核心目標是通過系統級優化技術降低顯存占用、提升計算效率&#xff0c;并支持千億級參數的模型訓練。 官網鏈接&#xff1a;deepspeed 訓練代碼下載&#xff1a;git代碼 一、De…

集星獺 | 重塑集成體驗:新版編排重構仿真電商訂單數據入庫

概要介紹 新版服務編排以可視化模式驅動電商訂單入庫流程升級&#xff0c;實現訂單、客戶、庫存、發票、發貨等環節的自動化處理。流程中通過循環節點、判斷邏輯與數據查詢的編排&#xff0c;完成了低代碼構建業務邏輯&#xff0c;極大提升訂單處理效率與業務響應速度。 背景…

AMO——下層RL與上層模仿相結合的自適應運動優化:讓人形行走操作(loco-manipulation)兼顧可行性和動力學約束

前言 自從去年24年Q4&#xff0c;我司「七月在線」側重具身智能的場景落地與定制開發之后 去年Q4&#xff0c;每個月都會進來新的具身需求今年Q1&#xff0c;則每周都會進來新的具身需求Q2的本月起&#xff0c;一周不止一個需求 特別是本周&#xff0c;幾乎每天都有國企、央企…

MATLAB中進行語音信號分析

在MATLAB中進行語音信號分析是一個涉及多個步驟的過程&#xff0c;包括時域和頻域分析、加窗、降噪濾波、端點檢測以及特征提取等。 1. 加載和預覽語音信號 首先&#xff0c;你需要加載一個語音信號文件。MATLAB支持多種音頻文件格式&#xff0c;如.wav。 [y, fs] audiorea…

JWT令牌驗證

一、JWT 驗證方式詳解 JWT&#xff08;JSON Web Token&#xff09;的驗證核心是確保令牌未被篡改且符合業務規則&#xff0c;主要分為以下步驟&#xff1a; 1. 令牌解析與基礎校驗 收到客戶端傳遞的 JWT 后&#xff0c;首先按 . 分割為三部分&#xff1a;Header、Payload、S…

一文講清python、anaconda的安裝以及pycharm創建工程

軟件下載 Pycharm下載地址&#xff1a; Other Versions - PyCharm anaconda下載地址&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Windows-x86_64.exe 安裝步驟 一、 Python 解釋器的安裝步驟 安裝目錄介紹&#xff1a; 二、 Anaconda 安裝 2.1 安裝步…

Mac如何允許安裝任何來源軟件?

打開系統偏好設置-安全性與隱私&#xff0c;點擊右下角的解鎖按鈕&#xff0c;選擇允許從任何來源。 如果沒有這一選項&#xff0c;請到打開終端&#xff0c;輸入命令行&#xff1a;sudo spctl --master-disable, 輸入命令后回車&#xff0c;輸入電腦的開機密碼后回車。 返回“…

React Flow 中 Minimap 與 Controls 組件使用指南:交互式小地圖與視口控制定制(含代碼示例)

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

Windows Ubuntu 目錄映射關系

情況一&#xff1a;你是通過 WSL (Windows Subsystem for Linux) 安裝 Ubuntu 這是最常見的情況。如果你在 Microsoft Store 安裝了 “Ubuntu”&#xff0c;默認就是 WSL。 &#x1f4c1; 目錄映射關系如下&#xff1a; 從 Ubuntu&#xff08;WSL&#xff09;訪問 Windows&…

雙指針法高效解決「移除元素」問題

雙指針法高效解決「移除元素」問題 雙指針法高效解決「移除元素」問題一、問題描述二、解法解析&#xff1a;雙指針法1. 核心思想2. 算法步驟3. 執行過程示例 三、關鍵點分析四、復雜度分析五、與其他解法的比較1. 快慢指針法2. 本解法的優勢 六、實際應用場景七、總結 雙指針法…

知識圖譜構架

目錄 知識圖譜構架 一、StanfordNLP 和 spaCy 工具介紹 &#xff08;一&#xff09;StanfordNLP 主要功能 使用示例 &#xff08;二&#xff09;spaCy 主要功能 使用示例 二、CRF 和 BERT 的基本原理和入門 &#xff08;一&#xff09;CRF&#xff08;條件隨機場&…

激光三角測量標定與應用

文章目錄 1&#xff0c;介紹。2&#xff0c;技術原理3&#xff0c;類型。3.1&#xff0c;直射式3.2&#xff0c;斜射式3.3&#xff0c;兩種三角位移傳感器特性的比較 4&#xff0c;什么是光片&#xff1f;5&#xff0c;主要的算子。1&#xff0c;create_sheet_of_light_model2&…