在很多场景下,我们需要在Nacos的服务注册中心中增加一些额外的元数据信息,比如服务的版本号、服务的负责人等。 这些信息可以帮助我们更好的管理服务,也可以帮助我们更好的监控服务的状态。
1、启动 build-info 功能
在 spring-boot-maven-plugin 插件中增加 build-info 的 goal,那么运行 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、参考资料
文档信息
- 本文作者:Bob.Zhu
- 本文链接:https://home.mytool.group/2024/03/19/01-nacos-metadata-configuration/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
