通信方式
一个请求对象对应一个返回对象
1
rpc Login(LoginRequest) returns (LoginResponse) {}
一个请求对象,服务器返回多个结果
1
rpc Login(LoginRequest) returns (stream LoginResponse) {}
3.多个请求对象,一个返回结果
1 | rpc Login(stream LoginRequest) returns (LoginResponse) {} |
4.多个请求对象,服务器返回多个结果
1 | rpc Login(stream LoginRequest) returns (stream LoginResponse) {} |
关键字 stream
表示多个值
Protobuf定义
syntax=”proto3”;
文件的第一行指定了你使用的是proto3的语法:如果你不指定,protocol buffer 编译器就会认为你使用的是proto2的语法。这个语句必须出现在.proto文件的非空非注释的第一行。
package user;
编译完成之后,包名为user
service 定义服务
1
2
3service UserService {
rpc Login(LoginRequest) returns (LoginResponse);
}message 定义结构体
1
2
3
4message LoginRequest {
string username=1;
string password=2;
}
数据类型
strings 默认值是空字符串
int32 默认是0(编译之后为go语言中的int类型)
int64 默认是0 (编译之后为go语言中的int64)
float 默认为0.0 (编译之后为go语言中的 float32)
double 默认为0.0 (编译之后为go语言中的 float64)
uint32 (编译之后为go语言中的 uint32)
uint64 (编译之后为go语言中的 uint64)
bytes 默认值是空bytes
bool 默认值是false
enum 默认值是第一个枚举值(value必须为0)
字段修饰符
repeated
:用来定义数组,一个字段可以重复出现一定次数(包括零次)required
:值不可为空 (proto3中已删除)optional
:可选字段 (proto3中已删除)singular
:符合语法规则的消息包含零个或者一个这样的字段 (proto3中已删除)默认值:
string code=2 [default=200];
(proto3中已删除)其他类型
- 枚举定义
1 | //枚举类型,必须从0开始,序号可跨越。同一包下不能重名,所以加前缀来区别 |
- Map类型
1
map<key_type, value_type> map_field = N;
其中key_type可以是任意Integer或者string类型(所以,除了floating和bytes的任意标量类型都是可以的)value_type可以是任意类型。
例如,如果你希望创建一个project的映射,每个Projecct使用一个string作为key
1 | map<string, Project> projects = 3; |
示例
1 | syntax="proto3"; |
Google中提供的特殊类型
待定。。。
数据校验
插件地址及文档:https://github.com/envoyproxy/protoc-gen-validate
流的使用
1 | rpc GetStatus (GetReq) return (stream GetResp); |
service实现
1 | func (HelloService) GetStatus(req *pb.GetReq,stream pb.HelloService_GetStatusServer) err { |
使用grpc-web
访问流:
文档:https://github.com/grpc/grpc-web
1 | var helloService= new proto.mypackage.HelloServiceClient('http://localhost:8080'); |