<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
想象一下,有一個服務提供個多個使用者端呼叫,但不是所有使用者端都需要全部的返回引數:
比如商品列表服務返回商品的所有資訊,而訂單服務呼叫商品列表服務,但它其實只需要商品的編碼和名稱就夠了。
當然,我們可以為這個需求單獨建立一個服務,但是這樣不太靈活,比如又需要商品的編碼和分類的時候怎麼辦?
但是,大而全的服務方法會導致計算和傳輸成本可能很高,如果我們能夠了解響應中哪些欄位不需要提供給呼叫者,從而避免進行不必要的計算和傳輸,這對提高服務效能通常是非常有益的。
在實現 gRPC 服務時,我們可以使用protobuf FieldMask
實現上述功能。
預設情況下,gRPC 使用 protobuf
作為其介面定義語和資料序列化協定。
FieldMask 是一個 protobuf
訊息,包含一個名為 paths 的欄位,用於指定用於指定讀取操作返回或更新操作修改的欄位:
message FieldMask { repeated string paths = 1; }
下面,讓我們看一個例子,如何在C# gRpc
服務中使用它。
在 .proto 檔案中定義服務和訊息:
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; }
關鍵點是下面2句:
// 參照 field_mask 訊息 import "google/protobuf/field_mask.proto"; //定義請求欄位 google.protobuf.FieldMask field_mask = 2;
伺服器端程式碼如下,返回了5個欄位:
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); } }
使用者端程式碼如下:
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
欄位。
執行程式,發現有問題,還是返回了所有欄位:
這其實是在伺服器端沒有判斷 fieldMask,修改伺服器端程式碼:
var mergedReply = new HelloReply(); request.FieldMask.Merge(reply, mergedReply); return Task.FromResult(mergedReply);
結論:
在本文中,我們看到了如何使用 FieldMask ,這裡僅僅是控制不返回欄位,大家可以自行實現其他邏輯。
到此這篇關於用 FieldMask 提高 C# gRpc 的服務效能的文章就介紹到這了,更多相關用 FieldMask 提高 C# gRpc 的服務效能內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45