nacos客户端主动注销实例和下线实例

479 阅读1分钟

由于开发本地启动服务后会影响环境的调用,所以我们本地启动服务后自动将本地实例从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);
    }
}