mcpField
S
service-discovery

service-discovery

github.com/itallstartedwithaidea云与 DevOps4475 次安装28 周前更新
代码仓库

关于 service-discovery

service-discovery 是用于设计云原生和微服务服务发现的 Agent 技能,涵盖服务注册、健康检查和消费者侧实例选择,避免硬编码地址。

主要功能

  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确认已加载。

详细介绍

服务发现

Agent Skills™ 的一部分,由 googleadsagent.ai™ 提供

描述

服务发现实现了受 Nacos 启发的动态服务注册、健康检查监控和智能负载均衡模式,适用于云原生应用。服务在启动时自行注册,公布其能力和健康状态,消费者无需硬编码地址即可发现服务。注册中心由此成为服务拓扑的唯一事实来源。

在微服务和边缘分布式架构中,服务是短暂的。实例会扩容和缩容、跨区域部署,也会各自独立发生故障。硬编码的服务 URL 会造成脆弱的耦合,在任何拓扑变更时都可能失效。服务发现以动态注册中心取代静态配置,实时反映系统在任意时刻的实际状态。

此技能涵盖三种互补模式:自注册(服务公布自身)、健康检查(注册中心验证服务是否存活)和客户端发现(消费者查询注册中心并选择实例)。这些模式相结合,可实现零停机部署、自动故障转移和基于区域的路由,无需手动更改配置。

适用场景

  • 构建支持动态扩缩容的微服务架构
  • 实现由健康检查驱动的负载均衡
  • 用动态发现取代硬编码的服务 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

评论

支持 Markdown