Proto基础入门 | 豆包MarsCode AI刷题

270 阅读3分钟

在学习go商场小项目时大量的用到了thrift和proto这两种IDL接口定义语言来生成代码,对该语言的语法规则以及生成的文件夹等感到十分的困惑,在一番仔细的研究之后,将学习到的知识记录在此,希望能对大家有所帮助


IDL (Interface Definition Language,接口定义语言)

是一种用于描述软件组件之间通信接口的语言。它独立于编程语言,通过定义接口及其数据类型,使不同系统、不同语言的程序能够相互通信。IDL 通常用于分布式系统和中间件框架,例如 CORBAgRPCThrift 等。

一、Proto 基本概念

1. Proto 文件(.proto

  • Proto 文件用于定义数据结构和服务接口。
  • 包含消息类型、枚举、服务和方法等定义。

2. 核心元素:

  • 消息(message): 定义数据结构。
  • 枚举(enum): 定义一组常量值。
  • 服务(service): 定义 RPC 接口及方法。

二、基本语法结构

一个简单的 .proto 文件示例:

syntax = "proto3";  // 指定语法版本,proto3 是最新版本

package myapp;      // 定义包名,避免命名冲突

// 定义一个消息类型
message User {          // 每个字段必须设定一个编号
  int32 id = 1;         // 定义字段,类型为 int32
  string name = 2;      // 字符串类型
  bool is_active = 3;   // 布尔类型
}

// 定义一个枚举类型
enum Status {
  UNKNOWN = 0;
  ACTIVE = 1;
  INACTIVE = 2;
}

// 定义请求和响应消息
message UserRequest {
  int32 user_id = 1;
}

message UserResponse {
  User user = 1;
}

// 定义服务接口
service UserService {
  rpc GetUserById (UserRequest) returns (UserResponse);  // 定义 RPC 方法
}

三、Proto 文件的核心元素

1. Syntax 声明

  • 使用 syntax = "proto2";syntax = "proto3"; 指定版本。
  • proto3 是最新版本,提供了更简洁的语法和更好的支持。

2. Package(包)

  • 通过 package 定义命名空间,避免不同文件中的类型冲突。

3. Message(消息)

  • 消息是 Proto 中的核心部分,用于定义数据结构。
  • 每个字段需要指定类型字段编号(唯一的整数)。
message Example {
  int32 id = 1;
  string name = 2;
}

4. 字段类型

Protobuf 支持多种基本类型,如: (proto类型与go语言变量类型的对应关系,可以在cloudwego官方文档查看)

  • 整型: int32, int64, uint32, uint64, sint32, sint64
  • 浮点型: float, double
  • 布尔型: bool
  • 字符串: string
  • 字节数组: bytes

5. 枚举(Enum)

定义一组命名常量:

enum Color {
  RED = 0;
  GREEN = 1;
  BLUE = 2;
}

6. Service(服务)

定义 RPC 接口和方法:

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

四、Proto 的使用

  1. 定义 .proto 文件: 编写数据结构和接口。

  2. 生成代码: 使用 protoc 编译器生成对应语言的代码(支持 Go、Java、Python、C++ 等)。 下面是使用cwgo代码生成工具来生成一个rpc服务

    cwgo server -I ../../idl --type HTTP  --service frontend --module github.com/cloudwego/biz-demo/gomall/app/frontend --idl  ../../idl/frontend/auth_page.proto  
    
  3. 使用生成的代码: 在应用程序中序列化和反序列化数据。


五、Proto 的特点与优势

  1. 高效的序列化格式:
    Protobuf 使用二进制格式,数据传输效率高,占用空间小。
  2. 跨语言支持:
    支持多种编程语言,方便不同平台之间的通信。
  3. 向后兼容:
    新版本的消息可以添加字段,不会影响旧版本的数据解析。
  4. 自动生成代码:
    通过 .proto 文件,自动生成数据结构和 RPC 代码,减少手工编写工作量。

总结

经过本次学习对IDL的使用以及微服务框架和RPC的概念理解更加深刻,此后我会进一步将proto结合hertz以及kitex来生成代码,以极大的提升我的开发效率和学习hertz和kitex的使用。