1.控制一:可以依据环境判断是否需要注册;
2.控制二:可以依据命令行参数判断是否需要注册;
代码示例:
package com.xxx.pay.common;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class NacosDiscoveryPropertiesPostProcessor implements BeanPostProcessor {
private final ApplicationArguments args;
@Autowired
private Environment environment;
public NacosDiscoveryPropertiesPostProcessor(ApplicationArguments args) {
this.args = args;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//获取Spring Boot应用程序启动时传递的命令行参数
//如:java -jar myapp.jar --server.port=8080 --debug 可以获取到:--server.port=8080、--debug
//idea设置命令行参数:Run -> Edit Configurations -> Modify options -> Program arquments
String[] sourceArgs = args.getSourceArgs();
if (bean instanceof NacosDiscoveryProperties) {
NacosDiscoveryProperties properties = (NacosDiscoveryProperties) bean;
//因程序启动加载顺序的问题,a1和a2获取不到
String a1 = System.getProperty("spring.cloud.nacos.config.namespace");
String a2 = System.getenv().get("spring.cloud.nacos.config.namespace");
//a3可以获取到
String a3 = environment.getProperty("spring.cloud.nacos.config.namespace");
//可以通过命令行参数或bootstrap.yml配置来控制Nacos的注册
//这里需要兼容将来的环境变量,不能让以环境变量的时候注册不了
if ("dev".equals(a3) || sourceArgs.length <= 0) {
log.info("环境判断为本地不注册");
//不注册上nacos
properties.setRegisterEnabled(false);
} else {
//注册上nacos
log.info("环境判断为非本地注册");
}
}
return bean;
}
}
idea设置命令行参数: