← 返回文章列表

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 整理。实际创作日期尚无法确认。