encore-go-service について
Encore.go アプリケーションのサービスとパッケージ構成を扱う、Go 開発者向けガイドです。API を持つパッケージがサービスになる仕組み、サービス間呼び出し、共有ヘルパーパッケージの配置を説明します。
主な機能
- 01API エンドポイントを持つパッケージのサービス化
- 02単一・複数サービスの構成
- 03システム単位のサービス分類
- 04サービス間の直接呼び出し
- 05共有する非サービスパッケージ
活用シーン
- 01アプリケーションのサービス境界の決定
- 02複数サービスの Go プロジェクト構成
- 03再利用可能なヘルパーコードの整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ encoredev/ skills --skill encore-go-serviceインストール後、Claude Code で/encore-go-serviceを入力して読み込まれたか確認します。
詳細
Encore.go のサービス構造
手順
Encore.go では、API エンドポイントを持つ各パッケージが自動的にサービスになります。特別な設定は必要ありません。
サービスの作成
少なくとも 1 つの //encore:api エンドポイントを持つパッケージを作成するだけです:
// user/user.go
package user
import "context"
type User struct {
ID string `json:"id"`
Email string `json:"email"`
Name string `json:"name"`
}
//encore:api public method=GET path=/users/:id
func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {
// This makes "user" a service
}
最小限のサービス構造
user/
├── user.go # API endpoints
├── db.go # Database (if needed)
└── migrations/ # SQL migrations
└── 1_create_users.up.sql
アプリケーションのパターン
単一サービス
アプリケーションは、その API を 1 つのルートサービスパッケージで定義できます:
my-app/
├── encore.app
├── go.mod
├── api.go # All endpoints
├── db.go # Database
└── migrations/
└── 1_initial.up.sql
マルチサービス
各サービスはそれぞれ独自のパッケージに配置します:
my-app/
├── encore.app
├── go.mod
├── user/
│ ├── user.go
│ ├── db.go
│ └── migrations/
├── order/
│ ├── order.go
│ ├── db.go
│ └── migrations/
└── notification/
└── notification.go
大規模アプリケーション (システムベース)
関連するサービスをシステムにグループ化します:
my-app/
├── encore.app
├── go.mod
├── commerce/
│ ├── order/
│ │ └── order.go
│ ├── cart/
│ │ └── cart.go
│ └── payment/
│ └── payment.go
├── identity/
│ ├── user/
│ │ └── user.go
│ └── auth/
│ └── auth.go
└── comms/
├── email/
│ └── email.go
└── push/
└── push.go
サービス間呼び出し
関数をインポートして直接呼び出すだけです - Encore が RPC を処理します:
package order
import (
"context"
"encore.app/user" // Import the user service
)
//encore:api auth method=GET path=/orders/:id
func GetOrderWithUser(ctx context.Context, params *GetOrderParams) (*OrderWithUser, error) {
order, err := getOrder(ctx, params.ID)
if err != nil {
return nil, err
}
// This becomes an RPC call - Encore handles it
orderUser, err := user.GetUser(ctx, &user.GetUserParams{ID: order.UserID})
if err != nil {
return nil, err
}
return &OrderWithUser{Order: order, User: orderUser}, nil
}
内部ヘルパー (非サービスパッケージ)
共有コード用に、//encore:api エンドポイントを持たないパッケージを作成します:
my-app/
├── user/
│ └── user.go # Service (has API)
├── order/
│ └── order.go # Service (has API)
└── internal/
├── util/
│ └── util.go # Not a service (no API)
└── validation/
└── validate.go
ガイドライン
- パッケージは
//encore:apiエンドポイントを持つとサービスになります - サービスを他のサービス内に入れ子にすることはできません
- サービス間呼び出しは通常の関数呼び出しのように記述します
- 各サービスは独自のデータベースを持つことができます
- パッケージ名は小文字で、内容を表す名前にする必要があります
- コード整理のためだけにサービスを作成しないでください - 代わりにサブパッケージを使用してください
- サービスの境界が決まっていない場合は
encore-architectureを使用してください
コメント
Markdown 対応