這篇文章給大家介紹gRPC如何在ASP.NET Core 3.0項目中使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
站在用戶的角度思考問題,與客戶深入溝通,找到章貢網(wǎng)站設(shè)計與章貢網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋章貢地區(qū)。一.簡介
gRPC 是一個由Google開源的,跨語言的,高性能的遠(yuǎn)程過程調(diào)用(RPC)框架。 gRPC使客戶端和服務(wù)端應(yīng)用程序可以透明地進(jìn)行通信,并簡化了連接系統(tǒng)的構(gòu)建。它使用HTTP/2作為通信協(xié)議,使用 Protocol Buffers 作為序列化協(xié)議。
它的主要優(yōu)點:
現(xiàn)代高性能輕量級 RPC 框架。
約定優(yōu)先的 API 開發(fā),默認(rèn)使用 Protocol Buffers 作為描述語言,允許與語言無關(guān)的實現(xiàn)。
可用于多種語言的工具,以生成強(qiáng)類型的服務(wù)器和客戶端。
支持客戶端,服務(wù)器雙向流調(diào)用。
通過Protocol Buffers二進(jìn)制序列化減少網(wǎng)絡(luò)使用。
使用 HTTP/2 進(jìn)行傳輸
這些優(yōu)點使gRPC非常適合:
高性能輕量級微服務(wù) - gRPC設(shè)計為低延遲和高吞吐量通信,非常適合需要高性能的輕量級微服務(wù)。
多語言混合開發(fā) - gRPC工具支持所有流行的開發(fā)語言,使gRPC成為多語言開發(fā)環(huán)境的理想選擇。
點對點實時通信 - gRPC對雙向流調(diào)用提供出色的支持。gRPC服務(wù)可以實時推送消息而無需輪詢。
網(wǎng)絡(luò)受限環(huán)境 - 使用 Protocol Buffers二進(jìn)制序列化消息,該序列化始終小于等效的JSON消息,對網(wǎng)絡(luò)帶寬需求比JSON小
不建議使用gRPC的場景:
瀏覽器可訪問的API - 瀏覽器不完全支持gRPC。雖然gRPC-Web可以提供瀏覽器支持,但是它有局限性,引入了服務(wù)器代理
廣播實時通信 - gRPC支持通過流進(jìn)行實時通信,但不存在向已注冊連接廣播消息的概念
進(jìn)程間通信 - 進(jìn)程必須承載HTTP/2才能接受傳入的gRPC調(diào)用,對于Windows,進(jìn)程間通信管道是一種更快速的方法。
摘自微軟官方文檔
支持的語言如下:
二.gRPC on .NET Core
gRPC 現(xiàn)在可以非常簡單的在 .NET Core 和 ASP.NET Core 中使用,在 .NET Core 上的實現(xiàn)的開源地址:https://github.com/grpc/grpc-dotnet ,它目前由微軟官方 ASP.NET 項目的人員進(jìn)行維護(hù),良好的接入 .NET Core 生態(tài)。
.NET Core 的 gRPC 功能如下:
Grpc.AspNetCore 一個用于在ASP.NET Core承載gRPC服務(wù)的框架,將 gRPC和ASP.NET Core 功能集成在一起,如:日志、依賴注入、身份認(rèn)證和授權(quán)。
Grpc.Net.Client 基于HttpClient (HttpClient現(xiàn)已支持HTTP/2)的 gRPC客戶端
Grpc.Net.ClientFactory 與gRPC客戶端集成的HttpClientFactory
,允許對gRPC客戶端進(jìn)行集中配置,并使用DI注入到應(yīng)用程序中
三.使用 ASP.NET Core 創(chuàng)建 gRPC 服務(wù)
通過 Visual Studio 2019 (16.3.0)提供的模板,可以快速創(chuàng)建 gRPC 服務(wù)。
來扒拉一下默認(rèn)源碼包含了什么東東。
① 配置文件appsettings.json
,多了Kestrel 啟用 HTTP/2 的配置,因為 gRPC 是基于 HTTP/2 來通信的
② PB協(xié)議文件greet.proto
用于自動生成服務(wù)、客戶端和消息(表示傳遞的數(shù)據(jù))的C# Class
③ 服務(wù)類GreeterService
,服務(wù)類集成的Greeter.GreeterBase
來自于根據(jù)proto文件自動生成的,生成的類在obj\Debug\netcoreapp3.0
目錄下
自動生成的類:
④Startup.cs
類,將 gRPC服務(wù)添加到了終結(jié)點路由中
⑤ csproj 項目文件,包含了 proto 文件引用
2.運行
第一次運行會提示是否信任證書,點擊“是”
這是因為HTTP/2需要HTTPS,盡管HTTP/2協(xié)議沒有明確規(guī)定需要HTTPS,但是為了安全在瀏覽器實現(xiàn)上都要求了HTTPS,所以現(xiàn)在的HTTP/2和HTTPS基本都是一對。
四. 創(chuàng)建 gRPC 客戶端
1.添加一個.NET Core 控制臺應(yīng)用程序
2.通過nuget添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools
3.將服務(wù)的 proto 文件復(fù)制到客戶端
4.編輯客戶端項目文件,添加關(guān)于proto文件的描述
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
注意GrpcServices="Client"
這里是Client和服務(wù)是不一樣的
5.生成客戶端項目可以通過proto文件生成類
6.添加客戶端調(diào)用代碼
static async Task Main(string[] args) { var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "曉晨" }); Console.WriteLine("Greeter 服務(wù)返回數(shù)據(jù): " + reply.Message); Console.ReadKey(); }
7.先啟動服務(wù),然后運行客戶端
這里可以看到,客戶端成功調(diào)用了服務(wù),收到了返回的消息。
五.自己動手寫一個服務(wù)
前面我們使用的 Greeter 服務(wù)是由模板自動給我們創(chuàng)建的,現(xiàn)在我們來自己動手寫一個服務(wù)。
1.定義 proto 文件LuCat.proto
,并在csproj項目文件中添加描述
syntax = "proto3"; option csharp_namespace = "AspNetCoregRpcService"; import "google/protobuf/empty.proto"; package LuCat; //定義包名 //定義服務(wù) service LuCat{ //定義吸貓方法 rpc SuckingCat(google.protobuf.Empty) returns(SuckingCatResult); } message SuckingCatResult{ string message=1; }
2.實現(xiàn)服務(wù)LuCatService.cs
public class LuCatService:LuCat.LuCatBase { private static readonly List<string> Cats=new List<string>(){"英短銀漸層","英短金漸層","美短","藍(lán)貓","貍花貓","橘貓"}; private static readonly Random Rand=new Random(DateTime.Now.Millisecond); public override Task<SuckingCatResult> SuckingCat(Empty request, ServerCallContext context) { return Task.FromResult(new SuckingCatResult() { Message = $"您吸了一只{Cats[Rand.Next(0, Cats.Count)]}" }); } }
3.在Startup
終結(jié)點路由中注冊
endpoints.MapGrpcService<LuCatService>();
4.添加客戶端調(diào)用
var catClient = new LuCat.LuCatClient(channel); var catReply = await catClient.SuckingCatAsync(new Empty()); Console.WriteLine("調(diào)用擼貓服務(wù):"+ catReply.Message);
5.運行測試
六.實際使用中的技巧
技巧1
上面章節(jié)的操作步驟中,我們需要在服務(wù)和客戶端之間復(fù)制proto,這是一個可以省略掉的步驟。
1.復(fù)制 Protos 文件夾到解決方案根目錄(sln文件所在目錄)
2.刪除客戶端和服務(wù)項目中的 Protos 文件夾
3.在客戶端項目文件csproj中添加關(guān)于proto文件的描述
<ItemGroup> <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" /> </ItemGroup>
4.在服務(wù)項目文件csproj中添加關(guān)于proto文件的描述
<ItemGroup> <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Server" Link="Protos\greet.proto" /> </ItemGroup>
在實際項目中,請自己計算相對路徑
5.這樣兩個項目都是使用的一個proto文件,只用維護(hù)這一個文件即可
技巧2
我們在實際項目中使用,肯定有多個 proto 文件,難道我們每添加一個 proto 文件都要去更新 csproj文件?
我們可以使用MSBuild變量來幫我們完成,我們將 csproj 項目文件中引入proto文件信息進(jìn)行修改。
服務(wù)端:
<ItemGroup> <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Server" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /> </ItemGroup>
客戶端:
<ItemGroup> <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /> </ItemGroup>
示例:
關(guān)于gRPC如何在ASP.NET Core 3.0項目中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
標(biāo)題名稱:gRPC如何在ASP.NETCore3.0項目中使用-創(chuàng)新互聯(lián)
地址分享:http://muchs.cn/article6/dppdog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、服務(wù)器托管、網(wǎng)站建設(shè)、定制網(wǎng)站、標(biāo)簽優(yōu)化、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容