← 返回文章列表

GoList

使用 Go 與 Kratos 實踐清單應用,記錄服務設計與開發過程。

daily

一個基於 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 的專案結構,非常細緻清晰。

daily

功能實現

具體程式碼見golist。

create

daily

daily

get

daily

daily

getAll

daily

update

daily

daily

daily

delete

daily

參考資料

七米老師課程

Kratos

Kratos 文件

關於這篇文章的日期

舊日期 2025-01-11 與文章發布記錄不符,現按舊站可確認的首次發布日 2026-02-13 整理。實際創作日期尚無法確認。

原始日期: 2025-01-11 09:58:39 +0800