JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
# 定义Protocol内容
syntax = "proto3";
package tuuorial;
option java_multiple_files = true;
option java_package = "com.example.tutorial.protos";
option java_outer_classname = "AddressBookProtos";
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
正如你所看到的这样,语法与C++或JAVA有一点相似。 这个.proto 文件开头处声明了package包名,可以根据包名区分不同的项目。如果你使用JAVA语言,这个包名可以用java_package关键字声明。即使你提供了java_package声明,你也应该定义一个package,可以避免在多语言环境下产生bug。
在包描述之后,你可以看到3个options选项,这是java独有的。分别为java_multiple_files、java_package、java_outer_classname.
- java_outer_classname 定义了生成java class类的类名。如果没有显示定义,它将根据你的文件名生成class类名(驼峰大小写)。例如你的文件名为my_proto.proto,生成的类名就是MyProto。
- java_multiple_files = true,当值为true时,会为生成多个独立的.java文件.如果是false,只会生成一个类文件(嵌套其中定义的meesage类)。原文如下: The java_multiple_files = true option enables generating a separate .java file for each generated class (instead of the legacy behavior of generating a single .java file for the wrapper class, using the wrapper class as an outer class, and nesting all the other classes inside the wrapper class).
接下来,你可以看到message定义。一个message体,就是一组类型的聚合。常见的类型包括bool、int32、float、double、string。你也可以自定义结构体,作为某个字段的类型。
上次更新: 2023/01/11