背景
在使用nacos作为服务注册与发现时,我们可能需要手动控制服务注册到nacos中的时机,如系统启动好之后,需要预热一段时间,加载一些缓存数据之后才允许被其它微服务访问。
解决方案
1.配置文件中关闭nacos 自动注册
spring.cloud.nacos.discovery.register-enabled=false
2.在合适的时机调用nacos的注册方法
nacosRegistration.getNacosDiscoveryProperties().setRegisterEnabled(true);
nacosAutoServiceRegistration.start();
3.如果有必要的话,手动调用nacos下线方法
nacosAutoServiceRegistration.stop();
完整代码
import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
import org.springframework.beans.factory.annotation.Autowired;
import java.lang.reflect.Field;
public class NacosManualService {
@Autowired(required = false)
private NacosAutoServiceRegistration nacosAutoServiceRegistration;
/**
* nacos是否注册完成
*/
private volatile boolean nacosRegistFinish = false;
/**
* 启动nacos注册
*/
public void start() {
if (nacosAutoServiceRegistration == null || nacosRegistFinish) {
return;
}
try {
Field declaredField = nacosAutoServiceRegistration.getClass().getDeclaredField("registration");
declaredField.setAccessible(true);
NacosRegistration nacosRegistration = (NacosRegistration) declaredField.get(nacosAutoServiceRegistration);
declaredField.setAccessible(false);
// 如果开启了自动注册 那么就直接返回
if (nacosRegistration.isRegisterEnabled()) {
return;
}
nacosRegistration.getNacosDiscoveryProperties().setRegisterEnabled(true);
nacosAutoServiceRegistration.start();
nacosRegistFinish = true;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 停止nacos注册
*/
public void stop() {
if (nacosAutoServiceRegistration != null) {
nacosAutoServiceRegistration.stop();
}
nacosRegistFinish = false;
}
}