ASP.NET Core 3.0使用gRPC的具體方法

 更新時間:2020-01-25 00:02:22   作者:佚名   我要評論(0)

一.簡介
gRPC 是一個由Google開源的,跨語言的,高性能的遠程過程調用(RPC)框架。 gRPC使客戶端和服務端應用程序可以透明地進行通信,并簡化了連接系統的構建。它

一.簡介

gRPC 是一個由Google開源的,跨語言的,高性能的遠程過程調用(RPC)框架。 gRPC使客戶端和服務端應用程序可以透明地進行通信,并簡化了連接系統的構建。它使用HTTP/2作為通信協議,使用 Protocol Buffers 作為序列化協議。

它的主要優點:

  • 現代高性能輕量級 RPC 框架。
  • 約定優先的 API 開發,默認使用 Protocol Buffers 作為描述語言,允許與語言無關的實現。
  • 可用于多種語言的工具,以生成強類型的服務器和客戶端。
  • 支持客戶端,服務器雙向流調用。
  • 通過Protocol Buffers二進制序列化減少網絡使用。
  • 使用 HTTP/2 進行傳輸

這些優點使gRPC非常適合:

  • 高性能輕量級微服務 - gRPC設計為低延遲和高吞吐量通信,非常適合需要高性能的輕量級微服務。
  • 多語言混合開發 - gRPC工具支持所有流行的開發語言,使gRPC成為多語言開發環境的理想選擇。
  • 點對點實時通信 - gRPC對雙向流調用提供出色的支持。gRPC服務可以實時推送消息而無需輪詢。
  • 網絡受限環境 - 使用 Protocol Buffers二進制序列化消息,該序列化始終小于等效的JSON消息,對網絡帶寬需求比JSON小

不建議使用gRPC的場景:

  • 瀏覽器可訪問的API - 瀏覽器不完全支持gRPC。雖然gRPC-Web可以提供瀏覽器支持,但是它有局限性,引入了服務器代理
  • 廣播實時通信 - gRPC支持通過流進行實時通信,但不存在向已注冊連接廣播消息的概念
  • 進程間通信 - 進程必須承載HTTP/2才能接受傳入的gRPC調用,對于Windows,進程間通信管道是一種更快速的方法。

摘自微軟官方文檔

支持的語言如下:

二.gRPC on .NET Core

gRPC 現在可以非常簡單的在 .NET Core 和 ASP.NET Core 中使用,在 .NET Core 上的實現的開源地址:https://github.com/grpc/grpc-dotnet ,它目前由微軟官方 ASP.NET 項目的人員進行維護,良好的接入 .NET Core 生態。

.NET Core 的 gRPC 功能如下:

  • Grpc.AspNetCore 一個用于在ASP.NET Core承載gRPC服務的框架,將 gRPC和ASP.NET Core 功能集成在一起,如:日志、依賴注入、身份認證和授權。
  • Grpc.Net.Client 基于HttpClient (HttpClient現已支持HTTP/2)的 gRPC客戶端
  • Grpc.Net.ClientFactory 與gRPC客戶端集成的HttpClientFactory,允許對gRPC客戶端進行集中配置,并使用DI注入到應用程序中

三.使用 ASP.NET Core 創建 gRPC 服務

通過 Visual Studio 2019 (16.3.0)提供的模板,可以快速創建 gRPC 服務。

來扒拉一下默認源碼包含了什么東東。

① 配置文件 appsettings.json ,多了Kestrel 啟用 HTTP/2 的配置,因為 gRPC 是基于 HTTP/2 來通信的

② PB協議文件 greet.proto 用于自動生成服務、客戶端和消息(表示傳遞的數據)的C# Class

③ 服務類 GreeterService ,服務類集成的 Greeter.GreeterBase 來自于根據proto文件自動生成的,生成的類在 obj\Debug\netcoreapp3.0目錄下

自動生成的類:

Startup.cs類,將 gRPC服務添加到了終結點路由中

⑤ csproj 項目文件,包含了 proto 文件引用

2.運行

第一次運行會提示是否信任證書,點擊“是”

這是因為HTTP/2需要HTTPS,盡管HTTP/2協議沒有明確規定需要HTTPS,但是為了安全在瀏覽器實現上都要求了HTTPS,所以現在的HTTP/2和HTTPS基本都是一對。

四. 創建 gRPC 客戶端

1.添加一個.NET Core 控制臺應用程序

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

3.將服務的 proto 文件復制到客戶端

4.編輯客戶端項目文件,添加關于proto文件的描述

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

注意 GrpcServices="Client" 這里是Client和服務是不一樣的

5.生成客戶端項目可以通過proto文件生成類

6.添加客戶端調用代碼

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 服務返回數據: " + reply.Message);
 Console.ReadKey();
}

7.先啟動服務,然后運行客戶端

這里可以看到,客戶端成功調用了服務,收到了返回的消息。

五.自己動手寫一個服務

前面我們使用的 Greeter 服務是由模板自動給我們創建的,現在我們來自己動手寫一個服務。

1.定義 proto 文件 LuCat.proto,并在csproj項目文件中添加描述

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.實現服務 LuCatService.cs

public class LuCatService:LuCat.LuCatBase
{
 private static readonly List<string> Cats=new List<string>(){"英短銀漸層","英短金漸層","美短","藍貓","貍花貓","橘貓"};
 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終結點路由中注冊

endpoints.MapGrpcService<LuCatService>();

4.添加客戶端調用

var catClient = new LuCat.LuCatClient(channel);
var catReply = await catClient.SuckingCatAsync(new Empty());
Console.WriteLine("調用擼貓服務:"+ catReply.Message);

5.運行測試

六.實際使用中的技巧

技巧1

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

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

2.刪除客戶端和服務項目中的 Protos 文件夾

3.在客戶端項目文件csproj中添加關于proto文件的描述

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

4.在服務項目文件csproj中添加關于proto文件的描述

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

在實際項目中,請自己計算相對路徑

5.這樣兩個項目都是使用的一個proto文件,只用維護這一個文件即可

技巧2

我們在實際項目中使用,肯定有多個 proto 文件,難道我們每添加一個 proto 文件都要去更新 csproj文件?

我們可以使用MSBuild變量來幫我們完成,我們將 csproj 項目文件中引入proto文件信息進行修改。

服務端:

 <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>

示例:

七.總結

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

參考資料:

proto3 說明文檔

在ASP.NET Core中創建gRPC客戶端和服務

Demo 地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • Asp.Net Core Identity 隱私數據保護的實現
  • .Net Core3 用Windows 桌面應用開發Asp.Net Core網站
  • ASP.NET Core 3.0 gRPC攔截器的使用
  • 淺談ASP.NET Core的幾種托管方式
  • asp.net core 授權詳解

相關文章

  • ASP.NET Core 3.0使用gRPC的具體方法

    ASP.NET Core 3.0使用gRPC的具體方法

    一.簡介 gRPC 是一個由Google開源的,跨語言的,高性能的遠程過程調用(RPC)框架。 gRPC使客戶端和服務端應用程序可以透明地進行通信,并簡化了連接系統的構建。它
    2020-01-25
  • ASP.NET Core 3.0 gRPC攔截器的使用

    ASP.NET Core 3.0 gRPC攔截器的使用

    一. 前言 前面兩篇文章給大家介紹了使用gRPC的入門以及雙向流的使用,今天介紹的是gRPC中的攔截器。攔截器就像MVC的過濾器或者是ASP.NET Core middleware 一樣,具有
    2020-01-25
  • ASP.NET MVC中使用log4net的實現示例

    ASP.NET MVC中使用log4net的實現示例

    今天自己要弄一個日志記錄功能,以前也弄過 但是都忘了,今天又弄了一下 花了幾十分鐘,在此記錄一下 第一步:添加log4net.dll 第二步:配置 示例如下: 我是直接配
    2020-01-25
  • 3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    一.Cookie是什么? 我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對
    2020-01-25
  • ASP.Net Core3.0中使用JWT認證的實現

    ASP.Net Core3.0中使用JWT認證的實現

    JWT認證簡單介紹 關于Jwt的介紹網上很多,此處不在贅述,我們主要看看jwt的結構。 JWT主要由三部分組成,如下: HEADER.PAYLOAD.SIGNATURE HEADER 包含token的元
    2020-01-25
  • DataReader不能使用using的詳細示例

    DataReader不能使用using的詳細示例

    本文介紹了DataReader不能使用using的詳細示例,分享給大家,具有如下: public static MySqlDataReader ExecuteMySqlReader(string sqlStr) { MySqlConnection c
    2020-01-25
  • asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net mvc項目使用到驗證碼,為了讓以前的WebForm代碼能利用上代碼經過稍微的改動即可使用代碼如下: using System; using System.Collections.Generic; usin
    2020-01-25
  • 淺談.Net Core 認證系統源碼解析

    淺談.Net Core 認證系統源碼解析

    不知不覺.Net Core已經推出到3.1了,大多數以.Net為技術棧的公司也開始逐步的切換到了Core,從業也快3年多了,一直堅持著.不管環境怎么變,堅持自己的當初的選擇,堅持信
    2020-01-25
  • .NET連接池的問題詳解

    .NET連接池的問題詳解

    NET 連接池救生員 防止可淹沒應用程序的池溢出 William Vaughn 大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序
    2020-01-25
  • .Net獲取IP地址的方法

    .Net獲取IP地址的方法

    獲取本機IP 2.獲取網頁客戶端IP /// <summary> /// 獲取IPv4地址 /// </summary> /// <returns> </returns> public static string G
    2020-01-25

最新評論

买宝宝用品赚钱吗 我爱南京麻将群 捕鱼大师游戏送现金 河北20选五好运三 下载温州茶苑app 捕鱼大亨网络版现金 qq麻将安卓 16年nba总决赛 心悦吉林麻将官网 今天的股票大盘走势 北京赛车pk10稳赢 北京11选五开奖规则 网上软件赚钱 选四天天彩票开奖号(上海) 极速赛车正规网址 35选7近期开奖结果 韩国快乐8开奖查询