網(wǎng)站首頁 編程語言 正文
前言:
想象一下,有一個(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ì)算和傳輸,這對(duì)提高服務(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"; //定義請(qǐng)求字段 google.protobuf.FieldMask field_mask = 2;
?2.實(shí)現(xiàn)服務(wù)端?
服務(wù)端代碼如下,返回了5個(gè)字段:
public class GreeterService : Greeter.GreeterBase { ? ? private readonly ILogger_logger; ? ? public GreeterService(ILogger logger) ? ? { ? ? ? ? _logger = logger; ? ? } ? ? public override Task 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)其他邏輯。
原文鏈接:https://blog.51cto.com/MyIO/5063206
相關(guān)推薦
- 2022-04-19 C#多線程系列之線程的創(chuàng)建和生命周期_C#教程
- 2022-06-06 微信小程序動(dòng)態(tài)綁定class
- 2022-07-28 Python網(wǎng)絡(luò)編程之socket與socketserver_python
- 2022-07-10 docker的安裝及常用命令
- 2022-10-11 CFS調(diào)度算法調(diào)度時(shí)機(jī)的理解
- 2022-06-04 Android自定義scrollview實(shí)現(xiàn)回彈效果_Android
- 2024-07-13 spring-cloud和spring-cloud-alibaba的關(guān)系
- 2022-09-29 解決react組件渲染兩次的問題_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支