您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用FieldMask提高C#的gRpc服務(wù)性能”,在日常操作中,相信很多人在怎么用FieldMask提高C#的gRpc服務(wù)性能問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用FieldMask提高C#的gRpc服務(wù)性能”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
想象一下,有一個(gè)服務(wù)提供個(gè)多個(gè)客戶端調(diào)用,但不是所有客戶端都需要全部的返回參數(shù):
比如商品列表服務(wù)返回商品的所有信息,而訂單服務(wù)調(diào)用商品列表服務(wù),但它其實(shí)只需要商品的編碼和名稱就夠了。
當(dāng)然,我們可以為這個(gè)需求單獨(dú)創(chuàng)建一個(gè)服務(wù),但是這樣不太靈活,比如又需要商品的編碼和分類的時(shí)候怎么辦?
但是,大而全的服務(wù)方法會(huì)導(dǎo)致計(jì)算和傳輸成本可能很高,如果我們能夠了解響應(yīng)中哪些字段不需要提供給調(diào)用者,從而避免進(jìn)行不必要的計(jì)算和傳輸,這對提高服務(wù)性能通常是非常有益的。
在實(shí)現(xiàn) gRPC 服務(wù)時(shí),我們可以使用protobuf FieldMask
實(shí)現(xiàn)上述功能。
默認(rèn)情況下,gRPC 使用 protobuf
作為其接口定義語和數(shù)據(jù)序列化協(xié)議。
FieldMask 是一個(gè) protobuf
消息,包含一個(gè)名為 paths 的字段,用于指定用于指定讀取操作返回或更新操作修改的字段:
message FieldMask { repeated string paths = 1; }
下面,讓我們看一個(gè)例子,如何在C# gRpc
服務(wù)中使用它。
在 .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;
服務(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); } }
客戶端代碼如下:
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)有問題,還是返回了所有字段:
這其實(shí)是在服務(wù)端沒有判斷 fieldMask,修改服務(wù)端代碼:
var mergedReply = new HelloReply(); request.FieldMask.Merge(reply, mergedReply); return Task.FromResult(mergedReply);
到此,關(guān)于“怎么用FieldMask提高C#的gRpc服務(wù)性能”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。