由于开发本地启动服务后会影响环境的调用,所以我们本地启动服务后自动将本地实例从nacos下线。
首先我们通过NacosRegistration 获取到我们本机的原数据信息。
如果要注销实例
通过NacosServiceManager获取getNamingService获取服务实例NamingService。然后调用deregisterInstance方法进行实例注销。
//注销实例
NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
namingService.deregisterInstance(nacosDiscoveryProperties.getService(),nacosDiscoveryProperties.getIp(),nacosDiscoveryProperties.getPort());
如果要下线实例
通过NacosServiceManager获取getNamingMaintainService获取服务实例维护的NamingMaintainService,然后调用updateInstance更新实例信息,将实例的enabled设置为false。
//下线实例
Instance instance = new Instance();
instance.setIp(nacosDiscoveryProperties.getIp());
instance.setPort(nacosDiscoveryProperties.getPort());
instance.setClusterName(nacosDiscoveryProperties.getClusterName());
instance.setServiceName(nacosDiscoveryProperties.getService());
instance.setEnabled(false);
log.info("当前环境本地debug,进行下线处理:{}", instance);
NamingMaintainService namingMaintainService = nacosServiceManager.getNamingMaintainService(nacosDiscoveryProperties.getNacosProperties());
namingMaintainService.updateInstance(nacosDiscoveryProperties.getService(), instance);
完整代码
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingMaintainService;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
public class NacosClientListener implements ApplicationRunner {
@Autowired
private NacosRegistration nacosRegistration;
@Autowired
private NacosServiceManager nacosServiceManager;
@Override
public void run(ApplicationArguments args) throws Exception {
// 获取当前实例信息
String os = System.getProperty("os.name");
//默认 windows & mac 为本地开发环境
if (os != null && (!os.toLowerCase().startsWith("win")
&& !os.toLowerCase().startsWith("mac"))) {
return;
}
NacosDiscoveryProperties nacosDiscoveryProperties = nacosRegistration.getNacosDiscoveryProperties();
CompletableFuture.runAsync(() -> {
try {
// 启动后自动下线服务
Thread.sleep(1000L);
offlineInstance(nacosDiscoveryProperties);
Thread.sleep(3000L);
offlineInstance(nacosDiscoveryProperties);
Thread.sleep(5000L);
offlineInstance(nacosDiscoveryProperties);
} catch (Exception e) {
e.printStackTrace();
}
});
}
/**
* 下线服务
* @param nacosDiscoveryProperties
* @throws NacosException
*/
public void offlineInstance(NacosDiscoveryProperties nacosDiscoveryProperties) throws NacosException {
//注销实例
NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
namingService.deregisterInstance(nacosDiscoveryProperties.getService(),nacosDiscoveryProperties.getIp(),nacosDiscoveryProperties.getPort());
//下线实例
Instance instance = new Instance();
instance.setIp(nacosDiscoveryProperties.getIp());
instance.setPort(nacosDiscoveryProperties.getPort());
instance.setClusterName(nacosDiscoveryProperties.getClusterName());
instance.setServiceName(nacosDiscoveryProperties.getService());
instance.setEnabled(false);
log.info("当前环境本地debug,进行下线处理:{}", instance);
NamingMaintainService namingMaintainService = nacosServiceManager.getNamingMaintainService(nacosDiscoveryProperties.getNacosProperties());
namingMaintainService.updateInstance(nacosDiscoveryProperties.getService(), instance);
}
}