mcpField
S
service-discovery

service-discovery

github.com/itallstartedwithaideaクラウド・DevOps4475 回インストール28 週間前に更新
リポジトリ

service-discovery について

service-discoveryは、クラウドネイティブやマイクロサービスのサービス検出を設計するエージェント向けスキルです。固定アドレスに頼らず、サービス登録、ヘルスチェック、利用側でのインスタンス選択を扱います。

主な機能

  1. 01動的サービスレジストリのパターン
  2. 02サービスの登録と登録解除
  3. 03ヘルスチェック監視
  4. 04クライアント側の検出と負荷分散
  5. 05リージョンやメタデータに応じたルーティング

活用シーン

  1. 01固定のサービス URLを置き換え
  2. 02インスタンスの増減や障害に応じて通信をルーティング
  3. 03ブルーグリーンやカナリアデプロイを支援
  4. 04リージョン間のサービスを接続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill service-discovery

インストール後、Claude Code で/service-discoveryを入力して読み込まれたか確認します。

詳細

サービスディスカバリー

googleadsagent.ai™によるAgent Skills™の一部です。

説明

サービスディスカバリーは、Nacos に着想を得た、動的なサービスレジストリ、ヘルスチェック監視、インテリジェントな負荷分散のパターンを、クラウドネイティブアプリケーション向けに実装します。サービスは起動時に自らを登録し、機能とヘルス状態を通知します。コンシューマーはハードコードされたアドレスを使わずにサービスを検出できます。レジストリが、サービスのトポロジーに関する唯一の信頼できる情報源になります。

マイクロサービスやエッジ分散アーキテクチャでは、サービスは一時的なものです。インスタンスは増減し、複数のリージョンにデプロイされ、それぞれ独立して障害が発生します。サービス URL をハードコードすると、トポロジーが変わるたびに破綻する脆弱な結合が生じます。サービスディスカバリーは、静的な設定を、システムの実際の状態を常に反映する動的なレジストリに置き換えます。

このスキルでは、互いに補完する3つのパターンを扱います。自己登録(サービスが自らを通知する)、ヘルスチェック(レジストリが稼働状態を検証する)、クライアント側ディスカバリー(コンシューマーがレジストリに問い合わせ、インスタンスを選択する)です。これらのパターンを組み合わせることで、手動で設定を変更せずに、ゼロダウンタイムデプロイ、自動フェイルオーバー、リージョンを考慮したルーティングを実現できます。

使用する場面

  • 動的スケーリングに対応するマイクロサービスアーキテクチャを構築する場合
  • ヘルスチェックに基づく負荷分散を実装する場合
  • ハードコードされたサービス URL を動的ディスカバリーに置き換える場合
  • ブルーグリーンデプロイやカナリアデプロイに対応する場合
  • リージョンを考慮したルーティングを行うマルチリージョンアプリケーションを構築する場合
  • 相互に検出する必要がある複数の Workers またはサービスを統合する場合

仕組み

sequenceDiagram
    participant S as Service Instance
    participant R as Service Registry
    participant C as Consumer
    participant H as Health Checker

    S->>R: Register(name, address, metadata)
    R->>R: Store in registry
    loop Every 10s
        H->>S: Health check (HTTP/TCP)
        S->>H: 200 OK / Healthy
        H->>R: Update health status
    end
    C->>R: Discover("payment-service")
    R->>C: [instance-1:8080, instance-2:8080]
    C->>C: Select instance (round-robin/weighted)
    C->>S: Send request to selected instance

サービスは起動時に登録し、シャットダウン時に登録解除します。ヘルスチェッカーは稼働状態を継続的に検証します。コンシューマーはレジストリに問い合わせ、負荷分散戦略を適用してインスタンスを選択します。

実装

interface ServiceInstance {
  id: string;
  name: string;
  address: string;
  port: number;
  metadata: Record<string, string>;
  health: "healthy" | "degraded" | "unhealthy";
  lastHeartbeat: number;
}

class ServiceRegistry {
  private instances = new Map<string, ServiceInstance[]>();

  register(instance: ServiceInstance): void {
    const existing = this.instances.get(instance.name) ?? [];
    existing.push({ ...instance, lastHeartbeat: Date.now() });
    this.instances.set(instance.name, existing);
  }

  deregister(serviceName: string, instanceId: string): void {
    const existing = this.instances.get(serviceName) ?? [];
    this.instances.set(
      serviceName,
      existing.filter(i => i.id !== instanceId)
    );
  }

  discover(serviceName: string): ServiceInstance[] {
    const instances = this.instances.get(serviceName) ?? [];
    return instances.filter(i => i.health === "healthy");
  }

  heartbeat(serviceName: string, instanceId: string): void {
    const instances = this.instances.get(serviceName) ?? [];
    const instance = instances.find(i => i.id === instanceId);
    if (instance) instance.lastHeartbeat = Date.now();
  }

  pruneStale(maxAgeMs: number = 30_000): void {
    const cutoff = Date.now() - maxAgeMs;
    for (const [name, instances] of this.instances) {
      this.instances.set(
        name,
        instances.filter(i => i.lastHeartbeat > cutoff)
      );
    }
  }
}

function loadBalance(instances: ServiceInstance[]): ServiceInstance {
  const weights = instances.map(i =>
    i.health === "healthy" ? 100 : i.health === "degraded" ? 25 : 0
  );
  const totalWeight = weights.reduce((sum, w) => sum + w, 0);
  let random = Math.random() * totalWeight;
  for (let i = 0; i < instances.length; i++) {
    random -= weights[i];
    if (random <= 0) return instances[i];
  }
  return instances[0];
}

ベストプラクティス

  • サービスのシャットダウンシグナル(SIGTERM)を受けた際に、適切に登録解除を実装します
  • ハートビート TTL(デフォルトは30s)を使用して、応答しないインスタンスを自動的に削除します
  • スマートルーティングに備え、登録情報にメタデータ(バージョン、リージョン、機能)を含めます
  • ディスカバリーの障害に対処できるよう、コンシューマー側にサーキットブレーカーを実装します
  • レジストリの負荷を軽減するため、ディスカバリーの結果を短い TTL でローカルにキャッシュします
  • インフラストラクチャのメトリクスとして、レジストリのサイズとヘルスチェックのレイテンシを監視します

プラットフォームの互換性

プラットフォームサポート備考
Cursor完全設定+コード生成
VS Code完全マイクロサービスツール
Windsurf完全クラウドネイティブ対応
Claude Code完全アーキテクチャのガイダンス
Cline完全サービスのスキャフォールディング
aider部分的コードレベルのサポートのみ

関連スキル

キーワード

service-discovery nacos health-check load-balancing microservices registry cloud-native dynamic-routing


© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License

コメント