C# 實現 gRPC高級通信框架簡單實現

1. 前言

gRPC(Google Remote Procedure Call)是一個高性能、開源和通用的RPC框架,由Google主導開發。它支持多種編程語言,并廣泛用于構建分布式應用程序和服務。gRPC基于HTTP/2協議,支持雙向流、請求-響應和多請求-多響應模式,這使得它在微服務架構中尤其有用。


2. gRPC的使用場景包括:

  • 微服務架構: 在微服務架構中,服務通過網絡進行通信。以高效、簡潔的方式通信,支持多種編程語言,便于構建跨語言的服務。
  • API開發: 開發RESTful API時,gRPC可以作為替代方案,提供更高效的數據傳輸和更強的類型安全性。
  • 內部服務通信: 在大型系統中,內部服務間的通信可以通過gRPC進行優化,減少網絡延遲和提升數據傳輸效率。
  • 實時應用: 對于需要實時數據交換的應用,如實時聊天應用、在線游戲等,gRPC的雙向流特性非常有用。
  • 物聯網(IoT)設備: 在物聯網項目中,設備間的通信可以通過gRPC簡化,尤其是在需要高效數據傳輸的場景中。
  • 跨平臺應用: 由于gRPC支持多種編程語言,它非常適合開發需要跨平臺支持的應用和服務。

3. gRPC的關鍵特性:

  • 高效的序列化: 使用Protocol Buffers(protobuf),這是一種輕便且高效的語言無關的數據序列化格式。

  • 跨語言支持: 支持多種編程語言,如C++, Java, Python, Go, Ruby, C#等。

  • 高性能: 基于HTTP/2協議,支持流的特性,可以高效地處理大量并發請求。

  • 安全性: 支持TLS/SSL加密,保護數據傳輸安全。

  • 易于使用: 通過自動生成客戶端和服務器端代碼,簡化了API的開發和調用。


4. 如何開始使用gRPC:

定義服務: 使用.proto文件定義服務接口和數據結構。

生成代碼: 使用protoc編譯器根據.proto文件生成客戶端和服務端代碼。

實現服務: 實現服務端的邏輯。

編寫客戶端: 編寫客戶端調用服務端的代碼。

測試和部署: 測試應用并部署到生產環境。


1. 環境準備

安裝 NuGet 包

在 ASP.NET Core 項目中,需安裝以下包:

dotnet add package Grpc.AspNetCore
dotnet add package Google.Protobuf
dotnet add package Grpc.Net.Client
Protocol Buffers 文件

gRPC 依賴 .proto 文件定義服務接口。創建一個 .proto 文件(例如 greeter.proto),并定義服務和消息類型。


2. 定義 .proto 文件

syntax = "proto3";// 定義消息類型
message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}// 定義服務接口
service Greeter {// 單向調用(Unary)rpc SayHello (HelloRequest) returns (HelloResponse);// 服務端流式調用(Server Streaming)rpc SayHellos (HelloRequest) returns (stream HelloResponse);// 客戶端流式調用(Client Streaming)rpc TotalGreetings (stream HelloRequest) returns (HelloResponse);// 雙向流式調用(Bidirectional Streaming)rpc Chat (stream HelloRequest) returns (stream HelloResponse);
}

3. 生成 C# 代碼

使用 protoc 編譯器

安裝 protoc 和 C# 插件,然后生成代碼:

protoc --csharp_out=. --grpc_out=. greeter.proto --plugin=protoc-gen-grpc=路徑/to/grpc_csharp_plugin
在 Visual Studio 中集成

通過 NuGet 安裝 Grpc.Tools 包,然后在項目文件中配置 .proto 文件的編譯:

<ItemGroup><Protobuf Include="Protos\greeter.proto" GrpcServices="Server" />
</ItemGroup>

4. 實現 gRPC 服務端(ASP.NET Core)

配置 ASP.NET Core

Startup.cs 中配置 gRPC 服務:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddGrpc();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGrpcService<GreeterService>(); // 注冊服務endpoints.MapGet("/", () => "gRPC Service is running.");});}
}
實現服務邏輯

繼承生成的抽象類并實現方法:

public class GreeterService : Greeter.GreeterBase
{// 單向調用(Unary)public override Task<HelloResponse> SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloResponse { Message = "Hello, " + request.Name });}// 服務端流式調用(Server Streaming)public override async Task SayHellos(HelloRequest request, IServerStreamWriter<HelloResponse> responseStream, ServerCallContext context){for (int i = 0; i < 3; i++){await responseStream.WriteAsync(new HelloResponse { Message = $"Hello {i + 1}: " + request.Name });await Task.Delay(1000);}}// 客戶端流式調用(Client Streaming)public override async Task<HelloResponse> TotalGreetings(IAsyncStreamReader<HelloRequest> requestStream, ServerCallContext context){int count = 0;while (await requestStream.MoveNext()){count++;}return new HelloResponse { Message = $"Received {count} greetings!" };}// 雙向流式調用(Bidirectional Streaming)public override async Task Chat(IAsyncStreamReader<HelloRequest> requestStream, IServerStreamWriter<HelloResponse> responseStream, ServerCallContext context){while (await requestStream.MoveNext()){var request = requestStream.Current;await responseStream.WriteAsync(new HelloResponse { Message = "Echo: " + request.Name });}}
}

5. 實現 gRPC 客戶端

創建客戶端
using Grpc.Core;
using Grpc.Net.Client;
using System.Threading.Tasks;public class GreeterClient
{private readonly Greeter.GreeterClient _client;public GreeterClient(){// 創建 gRPC 通道(使用 HTTP/2)var channel = GrpcChannel.ForAddress("https://localhost:5001");_client = new Greeter.GreeterClient(channel);}// 單向調用(Unary)public async Task UnaryCall(){var reply = await _client.SayHelloAsync(new HelloRequest { Name = "World" });Console.WriteLine($"Greeter client received: {reply.Message}");}// 服務端流式調用(Server Streaming)public async Task ServerStreamingCall(){using var call = _client.SayHellos(new HelloRequest { Name = "Streaming" });await foreach (var response in call.ResponseStream.ReadAllAsync()){Console.WriteLine($"Server streaming: {response.Message}");}}// 客戶端流式調用(Client Streaming)public async Task ClientStreamingCall(){var requestStream = _client.TotalGreetings();for (int i = 0; i < 3; i++){await requestStream.RequestStream.WriteAsync(new HelloRequest { Name = $"Request {i + 1}" });await Task.Delay(1000);}await requestStream.RequestStream.CompleteAsync();var response = await requestStream.ResponseAsync;Console.WriteLine($"Client streaming result: {response.Message}");}// 雙向流式調用(Bidirectional Streaming)public async Task BidirectionalStreamingCall(){var call = _client.Chat();var writerTask = Task.Run(async () =>{for (int i = 0; i < 3; i++){await call.RequestStream.WriteAsync(new HelloRequest { Name = $"Message {i + 1}" });await Task.Delay(1000);}await call.RequestStream.CompleteAsync();});await foreach (var response in call.ResponseStream.ReadAllAsync()){Console.WriteLine($"Bidirectional streaming response: {response.Message}");}}
}

6. 測試服務

啟動服務端

運行 ASP.NET Core 應用,服務端監聽在 https://localhost:5001

運行客戶端
public static async Task Main(string[] args)
{var client = new GreeterClient();await client.UnaryCall(); // 單向調用await client.ServerStreamingCall(); // 服務端流式await client.ClientStreamingCall(); // 客戶端流式await client.BidirectionalStreamingCall(); // 雙向流式
}

關鍵點總結

  1. 依賴安裝:確保 Grpc.AspNetCoreGrpc.Tools 包已安裝。
  2. .proto 文件:定義服務接口和消息類型,使用 protoc 生成 C# 代碼。
  3. 服務端配置:在 ASP.NET Core 中注冊 gRPC 服務。
  4. 流式通信
    • 服務端流式:通過 IServerStreamWriter 發送多條響應。
    • 客戶端流式:通過 IAsyncStreamReader 讀取多條請求。
    • 雙向流式:同時處理請求和響應流。
  5. 客戶端調用:使用 GrpcChannel 創建連接,調用生成的客戶端接口。

簡單實現完整的 gRPC 服務和客戶端,支持多種通信模式。這里就開了個頭,具體業務具體分析

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

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

相關文章

將項目推到Github

前提條件 需要安裝GIT需要注冊GitHub賬號 步驟 首先我們需要登錄我們的GITHUB賬號&#xff0c;然后點擊新建存儲庫 然后起一個名字&#xff0c;設置一些私有公開即可 創建完成之后&#xff0c;這里有可以遠程推送的命令 后面就直接輸出命令即可 之后推送即可 git push orig…

K8S 專欄 —— namespace和Label篇

文章目錄 namespace創建namespacenamespace使用默認namespaceLabel添加Label查詢Labelnamespace 命名空間是一種用于在 kubernetes 集群中劃分資源的虛擬化手段,每個資源都屬于一個命名空間,使得多個團隊或應用可以在同一個集群中獨立運行,避免資源沖突。 創建namespace y…

44.第二階段x64游戲實戰-封包-分析掉落物列表id存放位置

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;43.第二階段x64游戲實戰-封包-代碼實現獲取包裹物品 之前的內容找到了掉落物的…

匯編語言期末快速過手筆記

一、計算機系統組成 計算機系統組成&#xff1a;由硬件系統和軟件系統組成 硬件系統&#xff1a;CPU、存儲器、輸入/輸出設備等物理部件軟件系統&#xff1a;操作系統、各種語言、系統軟件和應用軟件 匯編語言分類 屬于低級語言&#xff08;直接面向硬件&#xff09;與高級語言…

C++相比于C語言增加了哪些概念?

C相比于C語言增加了哪些概念&#xff1f; 作者將狼才鯨創建日期2025-06-17 CSDN閱讀地址&#xff1a;C相比于C語言增加了哪些概念&#xff1f;Gitee源碼目錄&#xff1a;qemu/demo_代碼示例/02_C_Class 目標受眾&#xff1a;熟悉C語言&#xff0c;對C完全不了解&#xff0c;但…

HarmonyOS5 分布式測試:斷網情況支付場景異常恢復驗證

以下是針對HarmonyOS 5分布式事務在斷網支付場景下的異常恢復驗證全流程方案&#xff0c;綜合關鍵技術與測試策略&#xff1a; 一、核心事務機制驗證 ?兩階段提交&#xff08;2PC&#xff09;協議? 模擬支付流程中網絡中斷&#xff0c;驗證事務協調者能否正確處理預提交與回滾…

【狂飆AGI】第5課:前沿技術-文生圖(系列1)

目錄 &#xff08;一&#xff09;繪畫本質&#xff08;二&#xff09;國內外AI轉繪展&#xff08;三&#xff09;創作思路&#xff08;四&#xff09;美學理論&#xff08;1&#xff09;不可能美學&#xff08;2&#xff09;趨無限美學&#xff08;3&#xff09;反物理美學&…

發那科A06B-6290-H124 伺服驅動器

?FANUC A06B-6290-H124 伺服驅動器核心性能解析? ?一、核心控制能力? ?多模式精密控制? 位置控制?&#xff1a;支持高精度旋轉角度/直線位移調節&#xff08;分辨率達脈沖級&#xff09;&#xff0c;適用于數控機床定位&#xff08;誤差0.01mm級&#xff09;和機器人軌…

Spring Boot 項目啟動優化

Spring Boot 項目啟動優化是一個非常重要的話題&#xff0c;尤其是在微服務和云原生環境下&#xff0c;快速啟動意味著更快的部署、更高效的彈性伸縮和更好的開發體驗。 下面我將從分析診斷、優化策略和終極方案三個層面&#xff0c;為你提供一個全面、可操作的優化指南。 一、…

「爬取豆瓣Top250電影的中文名稱」數據采集、網絡爬蟲

- 第 108 篇 - Date: 2025 - 06 - 16 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文章目錄 **任務&#xff1a;爬取豆瓣Tap250電影的中文名稱****代碼****實現效果** 任務&#xff1a;爬取豆瓣Tap250電影的中文名稱 代碼 # 豆瓣前Tap 250 import requests from bs4 import…

MySQL 多表查詢、事務

1.多表查詢的分類 1.1 內連接 在 MySQL 中&#xff0c;內連接&#xff08;INNER JOIN&#xff09;返回的是兩個表中滿足連接條件的記錄的交集。這個“交集”不是指整個表&#xff0c;而是指符合連接條件的行組合&#xff0c;也就是A表和B表中滿足我們使用on指定條件的記錄。圖…

CSP-J 2020 入門級 第一輪(初賽) 答案及解析

CSP-J 2020 入門級 第一輪&#xff08;初賽&#xff09; 答案及解析 在內存儲器中每個存儲單元都被賦予一個唯一的序號&#xff0c;稱為&#xff08;&#xff09;。 A. 地址 B. 序號 C. 下標 D. 編號 答: A 計算機中每個存儲單元都是1字節&#xff0c;都有唯一的地址。 編譯器…

Flutter包管理與插件開發完全指南

Flutter作為Google推出的跨平臺移動應用開發框架&#xff0c;其強大的生態系統離不開完善的包管理機制和豐富的插件支持。本文將全面介紹Flutter中的包管理體系和插件開發實踐&#xff0c;幫助開發者高效管理項目依賴并擴展應用功能。 一、Flutter包管理基礎 1.1 包管理概述 …

【視頻直播出海】阿里云ApsaraVideo Live:從零搭建全球直播平臺的“星際航行”指南!

【視頻直播出海】阿里云ApsaraVideo Live&#xff1a;從零搭建全球直播平臺的“星際航行”指南&#xff01; 在全球化浪潮的推動下&#xff0c;視頻直播行業正以前所未有的速度跨越國界&#xff0c;成為連接世界的“數字新橋梁”。對于渴望拓展海外市場的企業而言&#xff0c;…

OAuth2中的Token

兩個不同的Token OAuth2 中主要有兩個不同的Token, 其中的區別為是否與用戶相關聯, 即與用戶相關的用戶Token, 和與客戶端相關的客戶端Token, 可以通過用戶Token, 查詢到用戶的相關信息, 客戶端Token與用戶無關, 一般只用于客戶端認證 用戶Token 獲取用戶Token一般有兩個方式…

使用 FastMCP 實現 Word 文檔與 JSON 數據互轉的 Python 服務

一、項目背景 本文分享一個基于 FastMCP 框架實現的文檔處理服務&#xff0c;可實現 Word 文檔&#xff08;.docx&#xff09;與 JSON 數據格式的雙向轉換。通過此服務&#xff0c;開發者可以輕松實現文檔內容提取、結構化數據填充、樣式模板復用等功能&#xff0c;適用于自動…

Vue3輪播圖組件,當前輪播區域有當前圖和左右兩邊圖,兩邊圖各顯示一半,支持點擊跳轉和手動滑動切換

功能&#xff1a; 自動循環播放&#xff08;到達末尾后回到第一張&#xff09;、可設置切換間隔時間&#xff08;interval屬性&#xff09; 左右導航按鈕&#xff08;可自定義顯示/隱藏&#xff09; 點擊底部指示器跳轉到指定幻燈片、且位置可調&#xff08;輪播圖內部/外部&…

350+交付案例,高質量低成本構建智慧園區數字孿生交付新范式

在智慧園區建設領域&#xff0c;數字孿生技術正成為推動園區智能化轉型的核心引擎。山東融谷信息憑借其全要素、全周期、全方位的數字孿生交付能力&#xff0c;已成功交付350余個項目&#xff0c;覆蓋產業園區、智慧樓宇、智慧社區等多元場景&#xff0c;低成本高質量交付&…

OpenCV 圖像像素類型轉換與歸一化

一、知識點 1、OpenCV支持多種數據類型&#xff0c;每種類型都對應著不同的取值范圍。 (1)、CV_8U取值范圍[0, 255]。 (2)、CV_16U取值范圍[0, 65535]。 (3)、CV_32F取值范圍[0, 1]。 2、OpenCV提供convertTo()函數來轉換數據類型&#xff0c;提供normalize()函數來改…

機器學習算法_支持向量機

一、支持向量機 支持向量機只能做二分類任務 SVM全稱支持向量機&#xff0c;即尋找到一個超平面使樣本分成兩類&#xff0c;且間隔最大 硬間隔&#xff1a;如果樣本線性可分&#xff0c;在所有樣本分類都正確的情況下&#xff0c;尋找最大間隔&#xff1b;如果出現異常值或樣…