spring cloud程序化元数据生成

时间:2016-08-25 11:14:16

标签: spring-cloud

无论如何,我可以生成一些元数据,以便在注册时添加到服务中。

我们正在从Eureka迁移到Consul,我需要在服务启动时向注册的元数据添加UUID值。因此,当我按名称检索服务实例时,我可以获得此元数据值。

一些背景知识:我们使用了来自https://github.com/VanRoy/spring-cloud-dashboard的优秀前端用户界面。它被设置为使用Eureka模型来获得具有名称的应用程序的服务。每个应用程序都有多个实例,每个实例都有一个实例ID。

因此,使用eureka模型有一个2级服务描述,而spring spring模型是一个平面模型,其中n个实例各有一个服务id。

平面模型不适用于我上面引用的UI,因为应用程序名称和实例id之间没有区别,弹簧模型是相同的。

因此,如果我生成自己的实例ID并通过元数据处理它,那么我可以保留一些行为而不重写ui。

2 个答案:

答案 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文件中的内容之外,这样可以正常工作