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

目录
  • 前言:
  • 一.FieldMask
  • 二、Demo
    • ​1.定义.proto文件​
    • ​2.实现服务端​
    • ​3.实现客户端​
    • ​4.修改服务端​

前言:

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

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

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

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

在实现 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 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;

​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,这里只需要 message2message4 字段。

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

​4.修改服务端​

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

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

return Task.FromResult(mergedReply);

结论:

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

到此这篇关于用 FieldMask 提高 C# gRpc 的服务性能的文章就介绍到这了,更多相关用 FieldMask 提高 C# gRpc 的服务性能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#实现服务器性能监控并发送邮件保存日志

    客户端代码 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.ServiceProcess;using System.Text;using System.Threading;using System.Management;using System.Configurat

  • C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能

    初识gRPC还是一位做JAVA的同事在项目中用到了它,为了C#的客户端程序和java的服务器程序进行通信和数据交换,当时还是对方编译成C#,我直接调用. 后来,自己下来做了C#版本gRPC编写,搜了很多资料,但许多都是从入门开始?调用说"Say Hi!"这种官方标准的入门示例,然后遇到各种问题-- 关于gRPC和Protobuf介绍,就不介绍了,网络上一搜一大把,随便一抓都是标准的官方,所以直接从使用说起. gPRC源代码:https://github.com/grpc/grpc: p

  • 用 FieldMask 提高 C# gRpc 的服务性能

    目录 前言: 一.FieldMask 二.Demo ​1.定义.proto文件​ ​2.实现服务端​ ​3.实现客户端​ ​4.修改服务端​ 前言: 想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数: ​比如商品列表服务返回商品的所有信息,而订单服务调用商品列表服务,但它其实只需要商品的编码和名称就够了.​ 当然,我们可以为这个需求单独创建一个服务,但是这样不太灵活,比如又需要商品的编码和分类的时候怎么办? 但是,大而全的服务方法会导致计算和传输成本可能很高,如果我

  • 推荐8项提高 ASP.NET Web API 性能的技术

    在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术. 1) 使用最快的 JSON 序列化工具 JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响.在我的一个项目里,我从JSON.NET 序列化工具转到了ServiceStack.Text有一年半了. 我测量过,Web API 的性能提升了20%左右.我强烈建议你去尝试一下这个序列化工具.这里有一些最近的流行序列化工具性能的比较数据. 来源:theburningmonk 更新: 似乎It seams

  • 使用gRPC微服务的内部通信优化

    目录 使用gRPC做微服务的内部通信 什么是gRPC? 服务之间如何使用gRPC通信? 为什么gRPC是高效的? 什么时候使用gRPC? 总结Conclusion 使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSON,来开发微服务内部的通信接口. 什么是gRPC? gRPC是一个高性能的.开源的.普遍通用的RPC框架.简单地说,它能够帮助我们建立透

  • 分享提高ASP.NET Web应用性能的技巧

    在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧.众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员. 那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置为「true」是非常有用多,但在应用程序发布部署时,需将其设置为「false」. <compilation defaultLang

  • 监控Linux系统节点和服务性能的方法

    1.获取信息 #!/bin/bash #描述: # 把top信息输入到一个文件内部 #作者:孤舟点点 #版本:1.0 #创建时间:2017-11-09 03:04:28 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH p=`pwd` Day=`date +"%Y%m%d"` HOST=`hostname` for((i=0; i<1440; i=i+1)) do

  • 一次 Java 服务性能优化实例详解

    背景 前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了. 在很低的 QPS 压力下服务器 load 就能达到 10-20,CPU 使用率 60% 以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架 Hystrix,但熔断后服务却迟迟不能恢复.每次变更上线更是提心吊胆,担心会成为压死骆驼的最后一根稻草,导致服务雪崩. 在需求终于缓下来后,leader 给我们定下目标,限我们在两周内把服务性能问题彻底解决.近两周的排查和梳理中,

  • 提高NodeJS中SSL服务的性能

    在浏览互联网时,我们都知道,通过SSL进行加密是非常重要的.在贝宝(PayPal),安全是我们的首要任务.我们使用端到端的加密,不仅只是我们的公共网站,对于我们的内部服务调用也同样如此.SSL加密技术将在很大程度上影响node.js的性能.我们已经花时间调整我们的对外服务,并充分地利用他们.下面是一些我们发现能显著地提高SSL对外性能的SSL配置调整清单. SSL密码 开箱即用,Node.js 的SSL使用一组非常强大的密码算法.特别是,迪菲赫尔曼密钥交换和椭圆曲线算法是极其昂贵的.而且当你在默

  • mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    此配置是老男孩生产线上使用的配置,在培训的时候,他给的,我在这里,对各参数添加了中文说明 这配置已经优化的不错了,如果你的mysql没有什么特殊情况的话,可以直接使用该配置参数 MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-rehash [mysqld] user = mysql port = 3306 socket = /data/3306/my

  • 全面提高WindowsFTP服务器的安全性能

    但使用IIS5.0 架设的FTP服务器真的安全吗?它的默认设置其实存在很多安全隐患,很容易成为黑客们的攻击目标.如何让FTP服务器更加安全,只要稍加改造,就能做到. 一 取消匿名访问功能 默认情况下,Windows2000系统的FTP服务器是允许匿名访问的,虽然匿名访问为用户上传.下载文件提供方便,但却存在极大的安全隐患.用户不需要申请合法的账号,就能访问FTP服务器,甚至还可以上传.下载文件,特别对于一些存储重要资料的FTP服务器,很容易出现泄密的情况,因此建议用户取消匿名访问功能. 在Win

  • 使用Grafana+Prometheus监控mysql服务性能

    Prometheus(也叫普罗米修斯)官网:https://prometheus.io/docs/introduction/overview/ Grafana官网:https://grafana.com/enterprise 特征 普罗米修斯的主要特点是: 具有由度量名称和键/值对标识的时间序列数据的多维数据模型 一个灵活的查询语言 来利用这一维度 不依赖分布式存储; 单个服务器节点是自治的 时间序列集合通过HTTP上的拉模型发生 推送时间序列通过中间网关支持 通过服务发现或静态配置发现目标 多

随机推荐