只是说明,可以跳过。我不太喜欢看视频,因为有的地方讲的罗里吧嗦的又臭又长。当然也有很多好的精简的。这里我就以文档的形式出现,很多地方由于篇幅的限制可能讲的不会太细致,但是我会尽可能的提供官网的解释和文档地址,希望大家能养成解决问题的方式。那就是有文档看文档,没文档分析源码。当然 AI
也是不错的选择。
微服务
(臭长概念可以跳过)
可以简单理解成将单体应用拆分成独立小服务,做到高内聚低耦合。降低复杂性、提高扩展性。服务拆分可以按照特征拆分、功能拆分、业务边界拆分等等。一般使用DDD
架构原则来对微服务业务进行边界划分。这里介绍的
GRPC
是一种高性能、跨语言、低延迟的RPC
框架,后边我们也会介绍Thirft
。 目前go-zero
、Kratos
使用的是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 | 单精度浮点数 |
int32 | 32位有符号整数 |
int64 | 64位有符号整数 |
uint32 | 32位无符号整数 |
uint64 | 64位无符号整数 |
sint32 | 32位变长编码有符号整数 |
sint64 | 64位变长编码有符号整数 |
fixed32 | 32位固定长度编码无符号整数 |
fixed64 | 64位固定长度编码无符号整数 |
sfixed32 | 32位固定长度编码有符号整数 |
sfixed64 | 64位固定长度编码有符号整数 |
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
protoc
和grpc
插件
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.go
和user_grpc.pb.go
两个文件。以及跟目录下的php
文件。
明天继续... demo地址 https://code.widuu.com/widuu/micro_service
发表评论 取消回复