← 記事一覧へ

GoList

Go と Kratos でタスク一覧のバックエンドを作り、設計と開発を記録します。

daily

Go-Kratos で実装した、ローカルのタスク一覧プロジェクトです。バックエンドのみです。

概要

小さなタスク一覧を作り、Kratos の主な機能を学んで試します。

操作は追加、取得、更新、削除で、主に練習のためのプロジェクトです。

リポジトリ:golist。

初期化

Kratos で初期化し、依存を取得します。

kratos new golist
go mod tidy 

API の定義とコード生成

protobuf で RPC と HTTP の API を定義し、コードを生成します。

注釈で HTTP/JSON と gRPC の対応を指定します。

生成ツールが必要とする Go のバージョンを確認します。

新しい API を追加する

kratos proto add で、指定した場所に proto を追加します。vx のディレクトリで API の版を区別し、この例は v1 です。

kratos proto add api/golist/v1/todo.proto

生成した proto は空ではなくひな型なので、自分のサービスに合わせて変更します。

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;
}

protobuf コードを生成する

kratos proto client api/golist/v1/todo.proto

サーバーのコードを生成する

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 を採用しています。執筆日は未確認です。