GoList

golang
kratos
demo
list
Published

January 11, 2025

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 文档