无论如何,我可以生成一些元数据,以便在注册时添加到服务中。
我们正在从Eureka迁移到Consul,我需要在服务启动时向注册的元数据添加UUID值。因此,当我按名称检索服务实例时,我可以获得此元数据值。
一些背景知识:我们使用了来自https://github.com/VanRoy/spring-cloud-dashboard的优秀前端用户界面。它被设置为使用Eureka模型来获得具有名称的应用程序的服务。每个应用程序都有多个实例,每个实例都有一个实例ID。
因此,使用eureka模型有一个2级服务描述,而spring spring模型是一个平面模型,其中n个实例各有一个服务id。
平面模型不适用于我上面引用的UI,因为应用程序名称和实例id之间没有区别,弹簧模型是相同的。
因此,如果我生成自己的实例ID并通过元数据处理它,那么我可以保留一些行为而不重写ui。
答案 0 :(得分:1)
请参阅spring cloud consul中的documentation on metadata and tags。 Consul不支持服务发现的元数据,但Spring云有一个元数据抽象(只是一个字符串映射)。在consul中,使用key=value
样式创建的标记将被解析为该元数据映射。
例如,application.yml:
spring:
cloud:
consul:
discovery:
tags: foo=bar, baz
以上配置将生成一个带有foo→bar和baz→baz。
的地图答案 1 :(得分:0)
根据Spencer的回答,我在我的代码中添加了一个EnvironmentPostProcessor。
它可以工作,我能够以编程方式添加我想要的元数据标签,但它是“tags:foo = bar,baz”元素的补充,因此它会覆盖那个元素。我可能会在第二天左右找到解决方法,但是我想我会为其他看这个答案的人做些什么,然后说,那你做了什么?
首先按如下方式添加一个类:
@Slf4j
public class MetaDataEnvProcessor implements EnvironmentPostProcessor, Ordered {
// Before ConfigFileApplicationListener
private int order = ConfigFileApplicationListener.DEFAULT_ORDER - 1;
private UUID instanceId = UUID.randomUUID();
@Override
public int getOrder() {
return this.order;
}
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
SpringApplication application) {
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
map.put("spring.cloud.consul.discovery.tags", "instanceId="+instanceId.toString());
MapPropertySource propertySource = new MapPropertySource("springCloudConsulTags", map);
environment.getPropertySources().addLast(propertySource);
}
}
然后在资源/ META-INF中添加一个spring.factories,并使用以下行添加此处理器
org.springframework.boot.env.EnvironmentPostProcessor=com.example.consul.MetaDataEnvProcessor
除了覆盖标签
的application.yml文件中的内容之外,这样可以正常工作