快速上手protobuf协议

Posted 跟派大星学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速上手protobuf协议相关的知识,希望对你有一定的参考价值。


通信方式

1.一个请求对象对应一个返回对象

 
   
   
 
  1. rpc Login(LoginRequest) returns (LoginResponse) {}

2.一个请求对象,服务器返回多个结果

 
   
   
 
  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. service UserService {

  2. rpc Login(LoginRequest) returns (LoginResponse);

  3. }

  • message 定义结构体

 
   
   
 
  1. message LoginRequest {

  2. string username=1;

  3. string password=2;

  4. }

数据类型


  • 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中已删除)

  • 默认值: stringcode=2[default=200]; (proto3中已删除)

  • 预留字段: reserved6to8;

其他类型

  1. 枚举定义

 
   
   
 
  1. //枚举类型,必须从0开始,序号可跨越。同一包下不能重名,所以加前缀来区别

  2. enum Role {

  3. Role_Admin=0;

  4. Role_Guest=1;

  5. Role_User=2;

  6. Role_Other=9;

  7. }

  1. Map类型

 
   
   
 
  1. map<key_type, value_type> map_field = N;

其中keytype可以是任意Integer或者string类型(所以,除了floating和bytes的任意标量类型都是可以的)valuetype可以是任意类型。

例如,如果你希望创建一个project的映射,每个Projecct使用一个string作为key

 
   
   
 
  1. map<string, Project> projects = 3;

示例

 
   
   
 
  1. syntax="proto3";

  2. package user;


  3. service UserService{

  4. // 注册

  5. rpc Signup(SignupRequest) returns (SignupResponse);

  6. }

  7. // 定义错误枚举,必须从0开始

  8. enum LoginError {

  9. //密码错误

  10. Error_Password=0;

  11. //用户名错误

  12. Error_UserName=1;

  13. //内部服务器错误

  14. Error_Server=9;

  15. }

  16. message ID {

  17. int32 id=1;

  18. }


  19. // 注册请求体

  20. message SignupRequest {

  21. string username=1;

  22. string password=2;

  23. int32 code=3;

  24. // 数组

  25. repeated string hobby=4;

  26. // map

  27. map<string,string> maps = 5;

  28. }

  29. //注册响应体

  30. message SignupResponse {

  31. ID id=1;

  32. int32 code=2 [default=200];

  33. string msg=3;

  34. }

Google中提供的特殊类型

待定。。。

数据校验

流的使用

 
   
   
 
  1. rpc GetStatus (GetReq) return (stream GetResp);

service实现

 
   
   
 
  1. func (HelloService) GetStatus(req *pb.GetReq,stream pb.HelloService_GetStatusServer) err {

  2. for i:=0;i<10;i++{

  3. stream.Send(&pb.GetResp{

  4. Status: i,

  5. })

  6. if err:=stream.Context().Err();err!=nil {

  7. fmt.Println("客户端关闭流...")

  8. return err

  9. }

  10. }

  11. return nil

  12. }

使用 grpc-web访问流:文档:https://github.com/grpc/grpc-web

 
   
   
 
  1. var helloService= new proto.mypackage.HelloServiceClient('http://localhost:8080');

  2. var getReq= new proto.mypackage.GetReq();

  3. getReq.setMessage(msg);

  4. var metadata = {'custom-header-1': 'value1'};

  5. var stream = helloService.getStatus(getReq, metadata);

  6. stream.on('data', function(response) {

  7. console.log(response.getStatus());

  8. });

  9. stream.on('status', function(status) {

  10. console.log(status.code);

  11. console.log(status.details);

  12. console.log(status.metadata);

  13. });

  14. stream.on('end', function(end) {

  15. // stream end signal

  16. });


快速上手protobuf协议
扫码关注
快速上手protobuf协议
更多精彩



以上是关于快速上手protobuf协议的主要内容,如果未能解决你的问题,请参考以下文章

微服务间的通信--Protobuf

IM通讯协议专题学习:金蝶随手记团队的Protobuf应用实践(原理篇)

TarsPHP发布新版,支持Protobuf协议

protobuf手册

Go语言使用protobuf快速入门

TarsPHP 新版本发布,支持 Protobuf 协议