使用 FieldMask 提高 C# gRpc 服务性能

前言

想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数:

比如商品列表服务返回商品的所有信息,而订单服务调用商品列表服务,但它其实只需要商品的编码和名称就够了。

当然,我们可以为这个需求单独创建一个服务,但是这样不太灵活,比如又需要商品的编码和分类的时候怎么办?

但是,大而全的服务方法会导致计算和传输成本可能很高,如果我们能够了解响应中哪些字段不需要提供给调用者,从而避免进行不必要的计算和传输,这对提高服务性能通常是非常有益的。

在实现 gRPC 服务时,我们可以使用 protobuf FieldMask 实现上述功能。

FieldMask

默认情况下,gRPC 使用 protobuf 作为其接口定义语和数据序列化协议。

FieldMask 是一个 protobuf 消息,包含一个名为 paths 的字段,用于指定用于指定读取操作返回或更新操作修改的字段:

message FieldMask {repeated string paths = 1;
}

下面,让我们看一个例子,如何在 C# gRpc 服务中使用它。

Demo

1.定义 .proto 文件

在 .proto 文件中定义服务和消息:

syntax = "proto3";option csharp_namespace = "GrpcService2";
import "google/protobuf/field_mask.proto";package greet;// The greeting service definition.
service Greeter {// Sends a greetingrpc 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;

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);}
}

3.实现客户端

客户端代码如下:

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 字段。

运行程序,发现有问题,还是返回了所有字段:

ba4905499d26e714d3d619715117cf21.png

4.修改服务端

这其实是在服务端没有判断 fieldMask,修改服务端代码:

var mergedReply = new HelloReply();
request.FieldMask.Merge(reply, mergedReply);return Task.FromResult(mergedReply);

ff51fa86b0d7a29d00702bc16b5575a4.png

结论

在本文中,我们看到了如何使用 FieldMask ,这里仅仅是控制不返回字段,你可以自行实现其他逻辑。

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

java Split 用法

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2、如果用“|”作为分隔的话,必…

html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...

1.三列布局1三列布局body{padding: 0;margin: 0;}.left{width:33.3%;height: 500px;background-color: #ccc;float: left;}.middle{width:33.3%;height: 500px;background-color: #bbb;float: left;}.right{width:33.3%;height: 500px;background-color: #aaa;float: left;}33.…

nagios的搭建及配置----(中)

上篇文章写到了我们布置的nagios监控本机的状态&#xff0c;下面我们来看下nagios监控服务器状态的配置。至于为什么要这么配置&#xff0c;大家可以自行去百度下看看使用NRPE插件实现对remote server 进行监控&#xff0c;远程服务器配置1&#xff0c;编译安装nagios-plugin&a…

iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...

目 录1..... 概述... 12..... 升级的工程... 33..... 升级的代码差异... 44..... 系统运行... 51. 概述我们团队一直在工业领域从事实时系统和业务系统的开发与集成工作&#xff0c;开发语言使用过C51/C/VB/VC/C#(Net Framework)/C#(Netcore3.1)/C#(NET6)。前几天微软发…

鲜为人知的编程真相

2019独角兽企业重金招聘Python工程师标准>>> 当程序员的经历让我知道了一些关于软件编程的事情。下面的这些事情可能会让朋友们对软件开发感到惊讶&#xff1a; 一个程序员用在写程序上的时间大概占他的工作时间的10-20%&#xff0c;大部分的程序员每天大约能写出10…

2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml

1. 前言入门篇我们已经成功运行hello.benchmarks.yml并输出测试结果&#xff0c;本篇我们就hello.benchmarks.yml、以及运行的shell脚本详细解读下其中的含义2. 剖析hello.benchmarks.yml2.1. job在hello.benchmarks.yml中我们定义了一个新的job: server&#xff0c;并指定了仓…

计算机应用问题,计算机应用的现状与发展的问题

计算机应用的现状与发展的问题来源&#xff1a;职称阁时间&#xff1a;2018-07-27 11:59热度&#xff1a;这篇论文主要介绍的是计算机应用的现状与发展的问题的相关内容&#xff0c;本文作者就是通过对计算机的应用现状等内容做出详细的阐述与介绍&#xff0c;特推荐这篇优秀的…

(2)从实际项目谈起,基于MEF的插件框架之总体设计

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.MEF框架简介 MEF的全称是Managed Extensibility Framework&#xff08;MEF&#xff09;&#xff0c;其是.net4.0的组成部分&#xff0c;在3.5上也可以…

Avalonia跨平台入门第四篇之Popup在uos下问题

上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报:明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效:开启神奇的特效,果然神奇:来看看最终实现的效果:最终简单的效果先这样吧;以后有时…

C++之用std::nothrow分配内存失败不抛异常

1、std::nothrow介绍 1&#xff09;.malloc分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;会直接返回NULL&#xff1b; 2.&#xff09;早期C版本&#xff0c;new分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;也会直接返回NULL&#xff1b; 我们可以使用关键…

理科都要学大学计算机吗,女生不适合学理科专业?报考这些理科专业,一毕业就会遭到疯抢!...

男学理&#xff0c;女学文&#xff0c;似乎一直以来都是考生们报考专业时所“遵循”的一个主流&#xff0c;因为无论是专业学习知识理论的侧重点&#xff0c;还是未来就业的偏向性&#xff0c;文理科专业都呈现出非常大的差异。女生们或许更适合文科类专业的学习和就业&#xf…

8个使用JavaScript展示图片解决方案

1. JonDesign’s SmoothGallery 2.0 SmoothGallery demo 2. (E)2 Photo Gallery (E)2 Photo Gallery demo 3. jQuery Gallery 4. MooPix 5. Highslide JS Highslide JS demo 6. Flickrshow 7. Galleria Galleria demo 1 - Galleria demo 2 8. LightWindow v2.0

Avalonia跨平台入门第三篇之Popup

前面已经分享了二篇关于Avalonia入门的文章,今天接着去摸索关于Popup的知识点;你还别说一上来就遇到坑了(后台定义的Popup直接黑框):然而在WPF中没有出现这个Bug:最后只能默默的再前台进行定义了:来看看最终实现的效果:后台打开无非就是Open方法就行,最后先来预告下一篇的效果滑…

Swift和Objective-C混编

Swift中调用Objective-C文件 1.新建Swift文件SwiftViewController.swift 2.因为工程为OC编写,第一次创建会提示需要创建"桥接文件" 3.此时的工程会有SwiftViewController.swift文件和HelloWorld-Bridging-Header.h桥接文件 4.检查桥接文件HelloWorld-Bridging-Header…