准备
后端工具
命令 | 作用 | 当前版本 |
---|---|---|
bash go install google.golang.org/protobuf/cmd/protoc-gen-go@latest | 用于生成struct代码 | protoc-gen-go v1.30.0 |
bash go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest | 用于生成grpc服务代码 | |
bash go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest | 用于生成rest服务代码 | |
bash go install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest | 用于生成kratos的错误定义代码 | |
bash go install github.com/envoyproxy/protoc-gen-validate@latest | 用于生成消息验证器代码 | |
bash go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest | 用于生成OpenAPI V2文档 | |
bash go install github.com/google/gnostic/cmd/protoc-gen-openapi@latest | 用于生成OpenAPI V3文档 |
怎么做
初始化项目
创建项目
命令: kratos new 你的项目
项目编译和运行
命令行运行方式
cd 你的项目
make all
kratos run
Golang运行方式(推荐,支持断点调试)
定义API Protocolbuffers
新建PB文件
cd 你的项目
kratos proto add api/问题域/版本/领域对象.proto
名称解析
举个例子:
定义PB文件
初始化PB文件示例
生成的PB文件会有基本的curd的,示例如下
syntax = "proto3";
package api.metadata.v1;
option go_package = "test/api/metadata/v1;v1";
option java_multiple_files = true;
option java_package = "api.metadata.v1";
service Environment {
rpc CreateEnvironment (CreateEnvironmentRequest) returns (CreateEnvironmentReply);
rpc UpdateEnvironment (UpdateEnvironmentRequest) returns (UpdateEnvironmentReply);
rpc DeleteEnvironment (DeleteEnvironmentRequest) returns (DeleteEnvironmentReply);
rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply);
rpc ListEnvironment (ListEnvironmentRequest) returns (ListEnvironmentReply);
}
message CreateEnvironmentRequest {}
message CreateEnvironmentReply {}
message UpdateEnvironmentRequest {}
message UpdateEnvironmentReply {}
message DeleteEnvironmentRequest {}
message DeleteEnvironmentReply {}
message GetEnvironmentRequest {}
message GetEnvironmentReply {}
message ListEnvironmentRequest {}
message ListEnvironmentReply {}
添加HTTP支持
初始化文件中仅支持rpc调用,要添加HTTP可以在 service 里具体某个方法中添加以下option
option (google.api.http) = {
$HTTPMethod: "$URL"
};
举个例子
Get方法为
option (google.api.http) = {
get: "/api/v1/environment"
};
Post方法为
option (google.api.http) = {
post: "/api/v1/environment"
body: "*" # post 方法必须要的body
};
Put方法
option (google.api.http) = {
put: "/api/v1/environment/{id}"
body: "*"
};
Delete方法
option (google.api.http) = {
delete: "/api/v1/environment/{id}"
};
关于message的定义
在message可以定义你的请求参数体和返回体
message UpdateEnvironmentRequest {
int32 id = 1 [(validate.rules).int32 = {gt:0}];
string name = 2 [(validate.rules).string.min_len = 1];
string cnName = 3;
int32 product_id = 4;
string region_name = 5;
}
message UpdateEnvironmentReply {
int32 code = 1;
string message = 2;
}
关于参数验证
在使用 validate 之前首先需要安装 proto-gen-validate
命令:go get -d github.com/envoyproxy/protoc-gen-validate
需要在pb文件头部导入 validate.proto文件,既 import “validate/validate.proto”;
https://segmentfault.com/a/1190000040818600#item-1
https://xie.infoq.cn/article/bd41985d14ef2bcec04110a91