C#中使用gRPC(一)

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

在使用gRpc之前,需要先了解一点底子知识。
1. Protocol Buffers 详细参考https://protobuf.dev/ :
简答来说就是Google开发的一种数据描述的格式。和详细的开发语言无关,根据这个东西,你能定义你方法的参数,返回值类型。
起首 创建一个 xxx.proto 文件 .例如 sayHello.proto
  1. syntax = "proto3"; //必须是第一行 制定使用哪个版本的协议,可以选择 proto2/proto3
  2. //定义一个 消息 ,相当于C#里面的一个类  至于这个类怎么用,一会说
  3. message SearchRequest {
  4.   string query = 1;
  5.   int32 page_number = 2;
  6.   int32 results_per_page = 3;
  7. }
复制代码
SearchRequest 相当于C#类名字。string ,int32 ,int32  是proto内里的数据类型。query ,page_number ,results_per_page 是类的属性名,后面又给了数字,这个是proto的语法要求。在给字段编号时遵循以下规则

  • 你必须给你的字段一个1-536,870,911的编号
  • 每个字段的编号必须唯一
  • 19,000 to 19,999是 Protocol Buffers 预留的,你要是用了 编译器就报警。(最好别用省得有麻烦)
  • 不能使用保留字段名字和保留字段编号
举例子:
  1. message SearchRequest {
  2.   reserved    15, 9 to 11;
  3.   reserved "foo", "bar";
  4.   string query = 1;
  5.   int32 page_number = 2;
  6.   int32 results_per_page = 3;
  7.    string foo =4;
  8.    string bar=10;
  9. }
  10. //在这个消息里面 定义了2个保留字段 分别是 foo 和 bar 以及15 ,9,10,11这四个保留的编号,如果你在消息中用了6个中的一个,就会报错。
复制代码
文档中有一段写了 字段可以是单数或者复数。
单数就用optional修饰和C#中普通的字段没区别 如: string query = 1和optional string query = 1
复数就用repeated修饰,C#对于repeated修饰的字段会生成一个RepeatedField的泛型字段,相当于是list聚集 如: repeated string emails= 4; 他末了生成C#类,就简单当作list
定义枚举

在.proto文件中是可以定义枚举的 ,如:
  1. enum Corpus {
  2.   CORPUS_UNSPECIFIED = 0;
  3.   CORPUS_UNIVERSAL = 1;
  4.   CORPUS_WEB = 2;
  5.   CORPUS_IMAGES = 3;
  6.   CORPUS_LOCAL = 4;
  7.   CORPUS_NEWS = 5;
  8.   CORPUS_PRODUCTS = 6;
  9.   CORPUS_VIDEO = 7;
  10. }
  11. message SearchRequest {
  12.   string query = 1;
  13.   int32 page_number = 2;
  14.   int32 results_per_page = 3;
  15.   Corpus corpus = 4;
  16. }
  17. //与C#不同,在.proto(proto3)文件中定义枚举,第一个枚举值必须是0,而且名字是必须是 枚举类型 ENUM_TYPE_NAME_UNSPECIFIED 或者ENUM_TYPE_NAME_UNKNOWN 。(举例,你的枚举叫Colors 那么第一个值就是Colors_UNSPECIFIED=0 )
  18. //这里我自己测试出来,如果NUM_TYPE_NAME_UNSPECIFIED 或者ENUM_TYPE_NAME_UNKNOWN不写,直接把 red=0 ,也不报错。但是如果你传值,那么默认值就是0 也就是red
复制代码
package
  1. syntax = "proto3";
  2. option csharp_namespace = "gRPCDemo.demo";
  3. package requestUser;//pacgage 名字
  4. message UserItem{
  5.     string name = 1;
  6.     int32 age = 2;
  7.     string address = 3;
  8.     repeated string phones = 4 ;
  9.   
  10. }
  11. //这个文件我保存在Protos/userPackage.proto。然后别的 地方可以引用他
复制代码
  1. syntax = "proto3";
  2. option csharp_namespace = "gRPCDemo.demo";
  3. import  "Protos/userPackage.proto"; //导入文件路径
  4. package greet;
  5. // 使用的是 requestUser这个包下面的 userItem. requestUser包对应的物理文件是Protos/userPackage.proto
  6. message HelloRequest {
  7.   requestUser.UserItem user = 1;
  8. }
  9. // The response message containing the greetings.
  10. message HelloReply {
  11.   string message = 1;
  12. }
复制代码
重点来了。定义服务Defining Services

如果你想让别人调用你的服务(就是别人调用你的方法),就要定义服务
  1. service SearchService {
  2.   rpc Search(SearchRequest) returns (SearchResponse);//这里就是我们对外暴露了一个叫做search的方法,这个方法参数是SearchRequest类型,返回值是SearchResponse类型
  3. }
  4. service Greeter {
  5.   rpc SayHello (HelloRequest) returns (HelloReply);// 再比如我们定义一个sayhello的方法,参数是HelloRequest返回值是HelloReply
  6.   //你要是调用无参的方法 参考这个文档:https://stackoverflow.com/questions/31768665/can-i-define-a-grpc-call-with-a-null-request-or-response/31772973
  7. }
复制代码
有这些底子后,我们下一节来测试一下。

https://www.cnblogs.com/baiyunpiaopiao/p/18628560

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表