
一個基於 Go-Kratos 實現的本地任務清單記錄專案(只有後端)
簡介
透過一個小清單工具的實現,完成 Kratos 主要功能的學習和實踐
小清單操作邏輯主要是增刪改查,主要是拿來練手用的。
專案地址:golist。
初始化
使用 Kratos 初始化專案並下載相關的依賴
kratos new golist
go mod tidy
定義API生成程式碼
透過定義 protobuf 實現 RPC API 和 Http API 的相關程式碼。
使用註釋指定 HTTP/JSON 到gRPC 的轉換
注意在生成程式碼的時候會有對 go版本的需求
在專案中增加新的 API
使用 kratos proto add指令,在指定位置增加新的 proto檔案,這裡使用 vx實現版本控制,目前是 v1 版本。
kratos proto add api/golist/v1/todo.proto
之後生成的 protobuf 檔案並不是空的,而是一個固定的模板,我們可以透過這個模板實現我們自己的服務設計
proto模板
syntax = "proto3";
package api.golist.v1;
option go_package = "golist/api/golist/v1;v1";
option java_multiple_files = true;
option java_package = "api.golist.v1";
service Todo {
rpc CreateTodo (CreateTodoRequest) returns (CreateTodoReply);
rpc UpdateTodo (UpdateTodoRequest) returns (UpdateTodoReply);
rpc DeleteTodo (DeleteTodoRequest) returns (DeleteTodoReply);
rpc GetTodo (GetTodoRequest) returns (GetTodoReply);
rpc ListTodo (ListTodoRequest) returns (ListTodoReply);
}
message CreateTodoRequest {}
message CreateTodoReply {}
message UpdateTodoRequest {}
message UpdateTodoReply {}
message DeleteTodoRequest {}
message DeleteTodoReply {}
message GetTodoRequest {}
message GetTodoReply {}
message ListTodoRequest {}
message ListTodoReply {}
實現 todo 的 proto
syntax = "proto3";
package api.golist.v1;
import "google/api/annotations.proto";
option go_package = "golist/api/golist/v1;v1";
option java_multiple_files = true;
option java_package = "api.golist.v1";
service Todo {
rpc CreateTodo (CreateTodoRequest) returns (CreateTodoReply) {
option (google.api.http) = {
post: "/v1/todo",
body: "*"
};
};
rpc UpdateTodo (UpdateTodoRequest) returns (UpdateTodoReply) {
option (google.api.http) = {
put: "/v1/todo/{id}",
body: "*"
};
};
rpc DeleteTodo (DeleteTodoRequest) returns (DeleteTodoReply) {
option (google.api.http) = {
delete: "/v1/todo/{id}"
};
};
rpc GetTodo (GetTodoRequest) returns (GetTodoReply) {
option (google.api.http) = {
get: "/v1/todo/{id}",
};
};
rpc ListTodo (ListTodoRequest) returns (ListTodoReply) {
option (google.api.http) = {
get: "/v1/todos",
};
};
}
message CreateTodoRequest {
string title = 1;
}
message CreateTodoReply {
int64 id = 1;
string title = 2;
bool status = 3;
}
message UpdateTodoRequest {
int64 id = 1;
string title = 2;
bool status = 3;
}
message UpdateTodoReply {}
message DeleteTodoRequest {
int64 id = 1;
}
message DeleteTodoReply {}
message GetTodoRequest {
int64 id = 1;
}
message GetTodoReply {
int64 id = 1;
string title = 2;
bool status = 3;
}
message ListTodoRequest {
}
message todo {
int64 id = 1;
string title = 2;
bool status = 3;
}
message ListTodoReply {
repeated todo data = 1;
}
生成proto程式碼
kratos proto client api/golist/v1/todo.proto
生成server 程式碼
kratos proto server api/golist/v1/todo.proto -t internal/service
修改專案結構
之前生成的基礎 kratos會有跟我們實際的業務程式碼不同的檔案,我們可以刪除之前的 helloworld程式碼,修改成我們自己的程式碼。
下面是一張圖,介紹了 Kratos 的專案結構,非常細緻清晰。

功能實現
具體程式碼見golist。
create


get


getAll

update



delete
