Eureka 元数据:服务实例的扩展信息载体
在 Eureka 中,元数据(Metadata)是服务实例携带的额外信息,用于描述服务的属性或配置。元数据分为标准元数据和自定义元数据两类,在服务发现、负载均衡和服务调用中发挥重要作用。
元数据的核心作用
元数据是服务实例的 “身份标签”,主要用途包括:
- 辅助服务发现:消费者通过元数据筛选合适的服务实例(如按版本号选择服务);
- 传递配置信息:在服务间传递非业务参数(如权重、环境标识);
- 健康检查扩展:结合元数据实现自定义健康检查逻辑。
标准元数据
标准元数据是 Eureka 内置的、用于服务通信的基础信息,由 Eureka Client 自动采集并注册,无需手动配置。
包含的核心信息
元数据项 | 说明 | 对应配置参数(可选) |
---|---|---|
hostName |
服务实例的主机名 | eureka.instance.hostname |
ipAddress |
服务实例的 IP 地址 | eureka.instance.ip-address |
port |
服务端口(非 SSL) | server.port |
securePort |
SSL 端口(默认 443) | eureka.instance.secure-port |
statusPageUrl |
服务状态页地址(如/actuator/info ) |
eureka.instance.status-page-url |
healthCheckUrl |
健康检查页地址(如/actuator/health ) |
eureka.instance.health-check-url |
serviceId |
服务名称(即spring.application.name ) |
spring.application.name |
instanceId |
服务实例唯一标识 | eureka.instance.instance-id |
特点
- 自动注册:标准元数据由 Eureka Client 自动收集并发送到 Eureka Server,无需手动配置;
- 服务调用依赖:消费者调用服务时,Eureka 会基于标准元数据生成服务地址(如
http://ip:port
); - 不可修改:标准元数据的字段由 Eureka 定义,用户无法新增或删除,只能通过配置修改部分值(如
hostName
)。
自定义元数据
自定义元数据是用户根据业务需求添加的扩展信息,通过配置eureka.instance.metadata-map
定义,可灵活扩展服务属性。
配置方式
在服务提供者的application.yml
中配置:
1 | eureka: |
获取自定义元数据
服务消费者可通过DiscoveryClient
获取服务实例的自定义元数据:
1 |
|
应用场景
版本控制:通过
version
元数据区分服务版本(如v1
、v2
),实现灰度发布;1
2
3
4// 只调用v1版本的服务
List<ServiceInstance> candidates = instances.stream()
.filter(instance -> "v1".equals(instance.getMetadata().get("version")))
.collect(Collectors.toList());负载均衡权重:结合自定义负载均衡策略,按
weight
元数据分配请求比例;环境隔离:通过
env
元数据区分生产 / 测试环境,避免跨环境调用;集群路由:根据
cluster
元数据将请求路由到指定集群(如就近访问)。
元数据的传递与同步
- 注册阶段:服务启动时,Eureka Client 将标准元数据和自定义元数据一并发送到 Eureka Server;
- 存储与同步:Eureka Server 将元数据存储在服务注册表中,并同步到集群其他节点;
- 消费阶段:消费者拉取服务列表时,元数据随实例信息一起被缓存到本地。
注意:元数据仅用于描述服务,Eureka Server 不会基于元数据进行服务筛选或路由,需消费者自行实现逻辑。
注意事项
- 元数据大小限制:元数据不宜过大,避免增加网络传输和存储开销;
- 敏感信息安全:元数据会被所有服务消费者获取,禁止存储密码、密钥等敏感信息;
- 动态更新:元数据修改后需重启服务才能生效(Eureka 不支持元数据动态更新);
- 兼容性:自定义元数据的键名避免与标准元数据冲突(如
host
、port
)。
总结
Eureka 元数据是服务实例的重要补充信息,标准元数据保证服务基础通信,自定义元数据则为业务扩展提供灵活性。通过合理使用元数据,可实现服务版本控制、环境隔离、权重负载均衡等高级功能,提升微服务架构的可管理性和扩展性
v1.3.10