Spring Cloud中能否通过编程方式获取Eureka注册的服务及Zuul网关的元数据、名称、URL?
Eureka服务元数据读取相关问题解答
1. 编程获取Eureka注册中心的服务名称与URL
完全可以,常用实现方式有两种:
- 若当前服务是已注册到目标Eureka的客户端:
直接在Spring容器中注入DiscoveryClient或EurekaClient实例,即可直接读取所有注册服务的元数据,参考代码如下:import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Component; @Component public class EurekaServiceReader { @Autowired private DiscoveryClient discoveryClient; public void printAllServiceInfo() { // 获取所有注册的服务名称 discoveryClient.getServices().forEach(serviceName -> { // 获取当前服务下的所有实例信息 discoveryClient.getInstances(serviceName).forEach(instance -> { String serviceUrl = instance.getUri().toString(); System.out.printf("服务名:%s,实例访问地址:%s%n", serviceName, serviceUrl); }); }); } } - 若当前服务未接入Eureka:
直接调用Eureka服务端自带的公开REST接口GET /{eureka服务地址}/eureka/apps,接口会返回所有服务实例的元数据,自行解析返回的XML/JSON格式内容即可得到服务名和对应URL。
2. 注册到Eureka的Zuul网关读取服务元数据的方法
同样可以实现,不需要额外配置:
- Zuul作为Spring Cloud生态的网关组件,只要完成了Eureka客户端的注册配置,Spring上下文会自动初始化
DiscoveryClient相关Bean,直接注入该实例即可按上述相同逻辑读取所有服务元数据。 - 你也可以直接从ApplicationContext中手动获取对应的Bean来读取数据,参考代码如下:
import org.springframework.context.ApplicationContext; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class ZuulServiceReader { @Autowired private ApplicationContext applicationContext; public void readServiceFromContext() { DiscoveryClient discoveryClient = applicationContext.getBean(DiscoveryClient.class); // 后续遍历获取服务信息的逻辑和普通Eureka客户端完全一致 } }
补充说明:Zuul底层实现动态路由的逻辑本身就依赖DiscoveryClient拉取Eureka的服务实例列表做本地缓存,所以这类元数据本来就存在于Zuul的上下文环境中,可以直接读取使用。
内容的提问来源于stack exchange,提问作者user15337753
相关产品推荐
相关产品推荐

