日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 3.0 使用gRPC

發(fā)布時(shí)間:2023/12/4 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 3.0 使用gRPC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.簡介

gRPC 是一個(gè)由Google開源的,跨語言的,高性能的遠(yuǎn)程過程調(diào)用(RPC)框架。gRPC使客戶端和服務(wù)端應(yīng)用程序可以透明地進(jìn)行通信,并簡化了連接系統(tǒng)的構(gòu)建。它使用HTTP/2作為通信協(xié)議,使用 Protocol Buffers 作為序列化協(xié)議。

它的主要優(yōu)點(diǎn):

  • 現(xiàn)代高性能輕量級(jí) RPC 框架。

  • 約定優(yōu)先的 API 開發(fā),默認(rèn)使用 Protocol Buffers 作為描述語言,允許與語言無關(guān)的實(shí)現(xiàn)。

  • 可用于多種語言的工具,以生成強(qiáng)類型的服務(wù)器和客戶端。

  • 支持客戶端,服務(wù)器雙向流調(diào)用。

  • 通過Protocol Buffers二進(jìn)制序列化減少網(wǎng)絡(luò)使用。

  • 使用 HTTP/2 進(jìn)行傳輸

這些優(yōu)點(diǎn)使gRPC非常適合:

  • 高性能輕量級(jí)微服務(wù) - gRPC設(shè)計(jì)為低延遲和高吞吐量通信,非常適合需要高性能的輕量級(jí)微服務(wù)。

  • 多語言混合開發(fā) - gRPC工具支持所有流行的開發(fā)語言,使gRPC成為多語言開發(fā)環(huán)境的理想選擇。

  • 點(diǎn)對點(diǎn)實(shí)時(shí)通信 - gRPC對雙向流調(diào)用提供出色的支持。gRPC服務(wù)可以實(shí)時(shí)推送消息而無需輪詢。

  • 網(wǎng)絡(luò)受限環(huán)境 - 使用 Protocol Buffers二進(jìn)制序列化消息,該序列化始終小于等效的JSON消息,對網(wǎng)絡(luò)帶寬需求比JSON小。

不建議使用gRPC的場景:

  • 瀏覽器可訪問的API - 瀏覽器不完全支持gRPC。雖然gRPC-Web可以提供瀏覽器支持,但是它有局限性,引入了服務(wù)器代理

  • 廣播實(shí)時(shí)通信 - gRPC支持通過流進(jìn)行實(shí)時(shí)通信,但不存在向已注冊連接廣播消息的概念

  • 進(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 上的實(shí)現(xiàn)的開源地址:https://github.com/grpc/grpc-dotnet?,它目前由微軟官方 ASP.NET 項(xiàng)目的人員進(jìn)行維護(hù),良好的接入 .NET Core 生態(tài)。

.NET Core 的 gRPC 功能如下:

  • Grpc.AspNetCore?一個(gè)用于在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 的配置,因?yàn)?gRPC 是基于 HTTP/2 來通信的

    ② PB協(xié)議文件?greet.proto?用于自動(dòng)生成服務(wù)、客戶端和消息(表示傳遞的數(shù)據(jù))的C# Class

    ③ 服務(wù)類?GreeterService?,服務(wù)類集成的?Greeter.GreeterBase?來自于根據(jù)proto文件自動(dòng)生成的,生成的類在?obj\Debug\netcoreapp3.0目錄下

    自動(dòng)生成的類:

    ④?Startup.cs類,將 gRPC服務(wù)添加到了終結(jié)點(diǎn)路由中

    ⑤ csproj 項(xiàng)目文件,包含了 proto 文件引用

    2.運(yùn)行

    第一次運(yùn)行會(huì)提示是否信任證書,點(diǎn)擊“是”

    這是因?yàn)镠TTP/2需要HTTPS,盡管HTTP/2協(xié)議沒有明確規(guī)定需要HTTPS,但是為了安全在瀏覽器實(shí)現(xiàn)上都要求了HTTPS,所以現(xiàn)在的HTTP/2和HTTPS基本都是一對。

    四. 創(chuàng)建 gRPC 客戶端

    1.添加一個(gè).NET Core 控制臺(tái)應(yīng)用程序

    2.通過nuget添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools

    3.將服務(wù)的 proto 文件復(fù)制到客戶端

    4.編輯客戶端項(xiàng)目文件,添加關(guān)于proto文件的描述

    <ItemGroup><Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>

    注意?GrpcServices="Client"?這里是Client和服務(wù)是不一樣的

    5.生成客戶端項(xiàng)目可以通過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ù)返回?cái)?shù)據(jù): " + reply.Message);Console.ReadKey(); }

    7.先啟動(dòng)服務(wù),然后運(yùn)行客戶端

    這里可以看到,客戶端成功調(diào)用了服務(wù),收到了返回的消息。

    五.自己動(dòng)手寫一個(gè)服務(wù)

    前面我們使用的 Greeter 服務(wù)是由模板自動(dòng)給我們創(chuàng)建的,現(xiàn)在我們來自己動(dòng)手寫一個(gè)服務(wù)。

    編寫一個(gè)“擼貓服務(wù)”

    1.定義 proto 文件?LuCat.proto,并在csproj項(xiàng)目文件中添加描述

    syntax = "proto3";option csharp_namespace = "AspNetCoregRpcService";import "google/protobuf/empty.proto"; package LuCat;service LuCat{rpc SuckingCat(google.protobuf.Empty) returns(SuckingCatResult); }message SuckingCatResult{string message=1; }

    2.實(shí)現(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é)點(diǎn)路由中注冊

    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.運(yùn)行測試

    六.實(shí)際使用中的技巧

    技巧1

    上面章節(jié)的操作步驟中,我們需要在服務(wù)和客戶端之間復(fù)制proto,這是一個(gè)可以省略掉的步驟。

    1.復(fù)制 Protos 文件夾到解決方案根目錄(sln文件所在目錄)

    2.刪除客戶端和服務(wù)項(xiàng)目中的 Protos 文件夾

    3.在客戶端項(xiàng)目文件csproj中添加關(guān)于proto文件的描述

    <ItemGroup><Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" /></ItemGroup>

    4.在服務(wù)項(xiàng)目文件csproj中添加關(guān)于proto文件的描述

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

    在實(shí)際項(xiàng)目中,請自己計(jì)算相對路徑

    5.這樣兩個(gè)項(xiàng)目都是使用的一個(gè)proto文件,只用維護(hù)這一個(gè)文件即可

    技巧2

    我們在實(shí)際項(xiàng)目中使用,肯定有多個(gè) proto 文件,難道我們每添加一個(gè) proto 文件都要去更新 csproj文件?

    我們可以使用MSBuild變量來幫我們完成,我們將 csproj 項(xiàng)目文件中引入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>

    示例:

    七.總結(jié)

    gRPC 現(xiàn)目前是一款非常成熟的高性能RPC框架,當(dāng)前的生態(tài)是非常好的,很多公司的產(chǎn)品或者開源項(xiàng)目都有在使用gRPC,有了它,相信可以讓我們更容易的構(gòu)建.NET Core 微服務(wù),可以讓 .NET Core 更好的接入 gRPC 生態(tài)。不得不說這是 .NET Core 3.0 帶來的最令人振奮的特性之一。

    參考資料:

    • proto3 說明文檔

    • 在ASP.NET Core中創(chuàng)建gRPC客戶端和服務(wù)

    • Demo 地址

    原文鏈接:https://www.cnblogs.com/stulzq/p/11581967.html


    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總?http://www.csharpkit.com?

    總結(jié)

    以上是生活随笔為你收集整理的ASP.NET Core 3.0 使用gRPC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。