关于 service-discovery
service-discovery 是用于设计云原生和微服务服务发现的 Agent 技能,涵盖服务注册、健康检查和消费者侧实例选择,避免硬编码地址。
主要功能
- 01动态服务注册表模式
- 02服务自行注册与注销
- 03健康检查监控
- 04客户端发现与负载均衡
- 05按区域和元数据路由
适用场景
- 01替换硬编码的服务 URL
- 02在实例扩缩或故障时路由流量
- 03支持蓝绿或金丝雀部署
- 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