如何在.NET Core中为gRPC服务设计消息
使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然后管理服务的演变时,需要注意几件事。
创建gRPC服务的核心是.proto文件,该文件以与语言无关的格式描述了该服务。使用.proto文件,Visual Studio可以为您的服务生成基类(您只需编写特定于业务的代码),或者可以生成用于可靠访问服务的客户端类。
.proto文件必须符合Google的协议缓冲区规范(通常称为ProtoBuf)。原始文件的内容使您可以指定服务的接口。服务接口由两部分组成:
- 您的gRPC服务提供的方法
- 这些方法的参数和返回值的数据结构
您可以使用Protocol Buffers规范中[1]定义的标量类型来构建这些数据结构(在ProtoBuf中称为“消息”)。可用的类型包括布尔值,字符串,字节数组和各种数字类型(浮点型,整数型和长型)。没有日期或固定的十进制类型。在接下来的专栏中,我将向您展示如何添加时间戳类型。对于小数,您可以使用float …并伴随着float带来的精度损失。
如果您要开始一个新项目,则要使用自2016年以来的proto3语法。但是,您必须在.proto文件的第一行“非空”行上明确指定proto3标准。引用规范[2]),否则将使用proto2规范解析您的.proto文件。指定您的文件使用proto3看起来像这样:
syntax = "proto3";
消息和C#类
使用proto3规范,用于客户信息的消息格式可能如下所示:
message CustomerResponse { int32 custid = 1; string firstName = 2; string lastName = 3; int32 age = 4; fixed32 creditLimit = 5; }
等号后的数字指定消息中字段的位置,从位置1开始(在我的示例中,firstName将是消息中的第二个字段)。这些数字在消息中必须是唯一的(即,您不能在同一位置使用两个字段)。您不必按数字顺序列出字段,但是如果您这样做的话,则可以更轻松地发现重复的字段编号(尽管Visual Studio将发现任何重复的编号,并在构建应用程序时将其报告在“错误列表”中)。如果需要,您也可以跳过职位。此定义仅使用奇数,例如:
message CustomerResponse { int32 custid = 1; string firstName = 3; string lastName = 5; }
在.NET Core中,消息格式被转换为类,每个字段都成为与消息同名的类的属性。命名这些属性时,.NET Core还将字段名称的第一个字符转换为大写。因此,例如,我上一个示例中的custId字段将成为我代码中CustomerRe
本文来源gao!%daima.com搞$代*!码9网(
sponse类上的CustId属性。
在此过程中,还得删除字段名称中的所有下划线,并且将以下字母大写(即,Last_name字段名称变为LastName属性)。
该过程还涉及将.NET类型映射到ProtoBuf类型(例如,ProtoBuf int32变为.NET int,ProtoBuf的int64变为long,fixed32变为uint),这需要向.NET Core添加一些新类。例如,ProtoBuf支持字节数组,其类型为字节。名为ByteString的新.NET数据类型支持该字段类型。要加载ByteString,请使用ByteString类的静态CopyFrom方法,并传递一个字节数组,如下所示:
byte[] bytes = new byte[1000]; cr.Valid = ByteString.CopyFrom(bytes);
要从ByteString检索字节数组,请使用对象的CopyTo方法,并传递要将字节复制到的数组和起始位置:
cr.Valid.CopyTo(bytes,0);