Nacos - 增加Nacos元数据信息

2024/03/19 Nacos 共 4183 字,约 12 分钟
Bob.Zhu

在很多场景下,我们需要在Nacos的服务注册中心中增加一些额外的元数据信息,比如服务的版本号、服务的负责人等。 这些信息可以帮助我们更好的管理服务,也可以帮助我们更好的监控服务的状态。

1、启动 build-info 功能

spring-boot-maven-plugin 插件中增加 build-infogoal,那么运行 mvn clean package 时, 会生成包含项目的元数据信息 META-INF/build-info.properties 文件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.2.13.RELEASE</version>
    <executions>
        <execution>
            <goals>
                <goal>build-info</goal>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <additionalProperties>
                    <parent.groupId>${project.parent.groupId}</parent.groupId>
                    <parent.artifactId>${project.parent.artifactId}</parent.artifactId>
                    <parent.version>${project.parent.version}</parent.version>
                </additionalProperties>
            </configuration>
        </execution>
    </executions>
</plugin>

2、增加元数据信息

在nacos通过NacosDiscoveryAutoConfiguration.java上报元数据之前,我们手动构造元数据信息:

import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 增加Nacos元数据信息
 */
@Configuration
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({NacosDiscoveryAutoConfiguration.class})
public class NacosMetadataConfiguration {

    @Value("${spring.profiles.active:unknown}")
    private String profile;
    
    private final BuildProperties buildProperties;

    public NacosMetadataConfiguration(BuildProperties buildProperties) {
        this.buildProperties = buildProperties;
    }

    @Bean
    @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true)
    public NacosDiscoveryProperties nacosProperties() {
        NacosDiscoveryProperties nacosDiscoveryProperties = new NacosDiscoveryProperties();
        Map<String, String> metadata = nacosDiscoveryProperties.getMetadata();
        // 增加服务注册时间
        metadata.put("startup.time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        // 增加profile启动环境参数
        metadata.put("spring.profiles.active", profile);
        // 增加脚手架信息
        String parentGroupId = buildProperties.get("parent.groupId");
        String parentArtifactId = buildProperties.get("parent.artifactId");
        String parentVersion = buildProperties.get("parent.version");
        metadata.put("project.parent", parentGroupId + ":" + parentArtifactId + ":" + parentVersion);
        String group = buildProperties.getGroup();
        String artifact = buildProperties.getArtifact();
        String version = buildProperties.getVersion();
        metadata.put("project", group + ":" + artifact + ":" + version);
        return nacosDiscoveryProperties;
    }
}

3、本地开发问题

经过如上的两个改造配置,使用 mvn clean package 打包生成jar包之后,会包含 META-INF/build-info.properties 文件, 如果没有运行 package 操作,那么 build-info.properties 文件是不存在的, 为了避免使用idea本地启动的时候报错,需要添加一个补偿机制:


import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
@AutoConfigureAfter({ProjectInfoAutoConfiguration.class})
public class BuildPropertiesMissingBean {

  @Bean
  @ConditionalOnMissingBean
  public BuildProperties buildProperties() {
    Properties properties = new Properties();
    properties.put("parent.groupId", "com.adolphor.cloud");
    properties.put("parent.artifactId", "cloud-common");
    return new BuildProperties(properties);
  }

}

为了使其生效,还需要配置 spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.adolphor.functions.config.JavaConfig,\
com.adolphor.functions.controller.GlobalResponseHandler,\
com.adolphor.functions.config.NacosMetadataConfiguration,\
com.adolphor.functions.config.BuildPropertiesMissingBean

4、参考资料

文档信息

Search

    Table of Contents