只是说明,可以跳过。我不太喜欢看视频,因为有的地方讲的罗里吧嗦的又臭又长。当然也有很多好的精简的。这里我就以文档的形式出现,很多地方由于篇幅的限制可能讲的不会太细致,但是我会尽可能的提供官网的解释和文档地址,希望大家能养成解决问题的方式。那就是有文档看文档,没文档分析源码。当然 AI 也是不错的选择。

微服务

(臭长概念可以跳过) 可以简单理解成将单体应用拆分成独立小服务,做到高内聚低耦合。降低复杂性、提高扩展性。服务拆分可以按照特征拆分、功能拆分、业务边界拆分等等。一般使用 DDD 架构原则来对微服务业务进行边界划分。

这里介绍的 GRPC 是一种高性能、跨语言、低延迟的 RPC 框架,后边我们也会介绍 Thirft 。 目前 go-zeroKratos 使用的是 GRPC

ProtoBuf

【臭且长可跳过】 Protocol Buffers 作为数据序列化格式,这是一种高效的二进制格式,比 JSON 和 XML 更小更快。是 GRPC 接口定义语言 (IDL)

1 - 3 都是概念可以跳过,也可以官网查看 https://protobuf.dev/programming-guides/proto3/

1. 复合类型

  • message: 定义一个消息,类似于类 或者 go 里边的结构体。消息是可以嵌套的。
  • enum: 枚举类型
  • map: 字典类型,对于 go 来说就是 map ,不能使用 repeated, optional 来修饰。
  • oneof: 许你在消息中定义一组字段,但这些字段中最多只有一个可以被设置。类似于 C 语言中的 union 的概念。

2. 消息类型

  • 字段:每个字段都有一个名称和类型。
  • 标签:每个字段都有一个唯一的标签号(1, 2, 3...),用于在二进制编码中标识字段。
  • 修饰符:可以使用 optional, required, repeated 修饰符来指定字段的出现次数。在 proto3 中,所有字段都是隐式可选的,并且默认值为零值

3. 数据类型

以下是一些常用的数据类型:

类型描述
double双精度浮点数
float单精度浮点数
int3232位有符号整数
int6464位有符号整数
uint3232位无符号整数
uint6464位无符号整数
sint3232位变长编码有符号整数
sint6464位变长编码有符号整数
fixed3232位固定长度编码无符号整数
fixed6464位固定长度编码无符号整数
sfixed3232位固定长度编码有符号整数
sfixed6464位固定长度编码有符号整数
bool布尔值
string字符串
bytes字节序列

4. 安装

https://github.com/protocolbuffers/protobuf/releases 下载对应系统的版本,然后放到可执行目录。打开命令行执行 protoc 验证安装。

php 需要自行安装 protobuf 扩展,使用 grpc 也要安装 grpc 扩展。一般 pecl<222> 可以安装也可以对应的 github 下载安装。

5. 实例

syntax = "proto3"; // 语法版本 proto3

package proto; // 包名字

// 定义 Go 包名为 demo1, 生成的 Go 代码包名为 demo1
// import_path;package_name 格式,导入路径或者模块+包名;包名
option go_package = "demo1/proto;proto";
// 导入 empty 和 any 两个外部的 proto
import "google/protobuf/empty.proto";
import "google/protobuf/any.proto";

// 枚举类型
enum Sex {
    Male = 0;
    Female = 1;
    Unknown = 2;
}

// 定义一个结构体,在测试 any 时候传参和解析使用
message Code {
    string code = 1;
}

// 定义 LoginRequest 消息, 包含 username, password 两个字段
// any 实例化是 proto.Message 类型也就是必须是消息类型,所以
// 上边我们定义了一个 Code 消息体测试使用
message LoginRequest {
    string username = 1;
    string password = 2;
    google.protobuf.Any other = 3;
}

// 定义 RegisterRequest 消息
message RegisterRequest {
    string username = 1;
    string password = 2;
    string email    = 3;
    string mobile   = 4;
    Sex sex = 5;
    // 数组类型 golang
    repeated string hobbies = 6;
    // 以下字段为预留字段, 不参与序列化和反序列化
    reserved "city", "money";
}

// 定义 Response 消息, 包含 code, msg, data 三个字段
// 其中 data 字段使用 oneof 关键字, 表示 data 字段只能有一个字段被赋值
message Response {
    int32  code = 1;
    string msg  = 2;
    // oneof 不是token 就是 message
    oneof data {
        string token   = 3;
        string message = 4;
    }
    // map 类型
    map<string, string> info = 5;
}

// 定义 User 服务
service User {
    // 登录服务
    rpc Login(LoginRequest) returns (Response);
    // 注册服务
    rpc Register(RegisterRequest) returns (Response);
    // 获取用户信息服务, 输入为空消息体,测试用例
    rpc GetUserInfo(google.protobuf.Empty) returns (Response);
}
安装 golang protocgrpc 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc 简单参数使用说明
protoc 
    -I 搜索路径
    # protoc-gen-go插件代码生成路径
    --go_out=. 
    # paths=import导入路径 paths=source_relative 相对路径 module=xxxx 模块路径
    --go_opt=paths=import
    # 同理 protoc-gen-go 插件 go_out
    --go-grpc_out=.
    # 同理 protoc-gen-go 插件的 go_opt
    --go-grpc_opt=paths=import
demo 如下
protoc \
    --go_out=. \
    --go_opt=paths=import \
    --go-grpc_out=. \
    --go-grpc_opt=paths=import \
    --php_out=./php \
    --grpc_out=./php \
    --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin \
    ./demo1/proto/user.proto
然后查看目录下就会生成了 user.pb.gouser_grpc.pb.go 两个文件。以及跟目录下的 php 文件。

效果图

明天继续... demo地址 https://code.widuu.com/widuu/micro_service

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部