用?FieldMask?提高?C#?gRpc?的服務(wù)性能
前言:
想象一下,有一個(gè)服務(wù)提供個(gè)多個(gè)客戶端調(diào)用,但不是所有客戶端都需要全部的返回參數(shù):
?比如商品列表服務(wù)返回商品的所有信息,而訂單服務(wù)調(diào)用商品列表服務(wù),但它其實(shí)只需要商品的編碼和名稱就夠了。?
當(dāng)然,我們可以為這個(gè)需求單獨(dú)創(chuàng)建一個(gè)服務(wù),但是這樣不太靈活,比如又需要商品的編碼和分類的時(shí)候怎么辦?
但是,大而全的服務(wù)方法會導(dǎo)致計(jì)算和傳輸成本可能很高,如果我們能夠了解響應(yīng)中哪些字段不需要提供給調(diào)用者,從而避免進(jìn)行不必要的計(jì)算和傳輸,這對提高服務(wù)性能通常是非常有益的。
在實(shí)現(xiàn) gRPC 服務(wù)時(shí),我們可以使用?protobuf FieldMask
?實(shí)現(xiàn)上述功能。
一.FieldMask
默認(rèn)情況下,gRPC 使用 protobuf
作為其接口定義語和數(shù)據(jù)序列化協(xié)議。
FieldMask 是一個(gè) protobuf
消息,包含一個(gè)名為 paths 的字段,用于指定用于指定讀取操作返回或更新操作修改的字段:
message FieldMask { ? repeated string paths = 1; }
下面,讓我們看一個(gè)例子,如何在C# gRpc
服務(wù)中使用它。
二、Demo
?1.定義 .proto 文件?
在 .proto 文件中定義服務(wù)和消息:
syntax = "proto3"; option csharp_namespace = "GrpcService2"; import "google/protobuf/field_mask.proto"; package greet; // The greeting service definition. service Greeter { ? // Sends a greeting ? rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { ? string name = 1; ? google.protobuf.FieldMask field_mask = 2; } // The response message containing the greetings. message HelloReply { ? string message1 = 1; ? string message2 = 2; ? string message3 = 3; ? string message4 = 4; ? string message5 = 5; }
關(guān)鍵點(diǎn)是下面2句:
// 引用 field_mask 消息 import "google/protobuf/field_mask.proto"; //定義請求字段 google.protobuf.FieldMask field_mask = 2;
?2.實(shí)現(xiàn)服務(wù)端?
服務(wù)端代碼如下,返回了5個(gè)字段:
public class GreeterService : Greeter.GreeterBase { ? ? private readonly ILogger<GreeterService> _logger; ? ? public GreeterService(ILogger<GreeterService> logger) ? ? { ? ? ? ? _logger = logger; ? ? } ? ? public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) ? ? { ? ? ? ? var reply = new HelloReply ? ? ? ? { ? ? ? ? ? ? Message1 = "Hello " + request.Name + ",這是第1條消息", ? ? ? ? ? ? Message2 = "Hello " + request.Name + ",這是第2條消息", ? ? ? ? ? ? Message3 = "Hello " + request.Name + ",這是第3條消息", ? ? ? ? ? ? Message4 = "Hello " + request.Name + ",這是第4條消息", ? ? ? ? ? ? Message5 = "Hello " + request.Name + ",這是第5條消息" ? ? ? ? }; ? ? ? ? return Task.FromResult(reply); ? ? } }
?3.實(shí)現(xiàn)客戶端?
客戶端代碼如下:
using var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); FieldMask fieldMask = new FieldMask(); fieldMask.Paths.AddRange(new string[] { "message2", "message4" }); var request = new HelloRequest { Name = "My IO" }; request.FieldMask = fieldMask; var reply = await client.SayHelloAsync(request); ? ? ? ? ? ? Console.WriteLine($@"Greeting:? {reply.Message1} {reply.Message2} {reply.Message3} {reply.Message4} {reply.Message5} " );
傳入了 FieldMask
,這里只需要 message2
、message4
字段。
運(yùn)行程序,發(fā)現(xiàn)有問題,還是返回了所有字段:
?4.修改服務(wù)端?
這其實(shí)是在服務(wù)端沒有判斷 fieldMask,修改服務(wù)端代碼:
var mergedReply = new HelloReply(); request.FieldMask.Merge(reply, mergedReply); return Task.FromResult(mergedReply);
結(jié)論:
在本文中,我們看到了如何使用 FieldMask ,這里僅僅是控制不返回字段,大家可以自行實(shí)現(xiàn)其他邏輯。
到此這篇關(guān)于用 FieldMask 提高 C# gRpc 的服務(wù)性能的文章就介紹到這了,更多相關(guān)用 FieldMask 提高 C# gRpc 的服務(wù)性能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#控制臺程序如何發(fā)布到服務(wù)器Linux上運(yùn)行
這篇文章主要給大家介紹了關(guān)于C#控制臺程序如何發(fā)布到服務(wù)器Linux上運(yùn)行的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器
這篇文章主要介紹了C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器,本文先是采集號碼入庫,同時(shí)給出了篩選各類靚號的SQL語句,需要的朋友可以參考下2014-10-10C#中FormClosing與FormClosed的區(qū)別詳細(xì)解析
本文是對C#中FormClosing與FormClosed的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10C#設(shè)計(jì)模式之觀察者模式實(shí)例講解
這篇文章主要介紹了C#設(shè)計(jì)模式之觀察者模式實(shí)例講解,本文詳細(xì)講解了觀察者模式的定義、優(yōu)缺點(diǎn)、代碼實(shí)例等,需要的朋友可以參考下2014-10-10C# 中屬性PropertyInfo的setvalue用法說明
這篇文章主要介紹了C# 中屬性PropertyInfo的setvalue用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01C#中枚舉類型和radiobox關(guān)聯(lián)操作的方法
這篇文章主要介紹了C#中枚舉類型和radiobox關(guān)聯(lián)操作的方法,實(shí)例分析了C#中枚舉類型及與控件關(guān)聯(lián)操作的相關(guān)技巧,需要的朋友可以參考下2015-04-04c#實(shí)現(xiàn)無標(biāo)題欄窗口的拖動
本篇文章是對c#中實(shí)現(xiàn)無標(biāo)題欄窗口拖動的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06