nacos(二):原生java调用配置与服务实例

本文主要介绍原生java连接nacos,操作nacos的共享配置与服务实例。

1、引入依赖

<dependencies>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.16</version>
        </dependency>
</dependencies>

注意:一定要引入slf4j

 

2、操作配置

package code;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;

public class OperConfig {
    public static void main(String[] args) throws NacosException, InterruptedException {
        String serverAddr = "localhost";
        String dataId = "hello";
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        properties.put(PropertyKeyConst.USERNAME,"nacos");    //上一篇中开启了nacos的鉴权,并设置密码为nacos
        properties.put(PropertyKeyConst.PASSWORD,"nacos");
        ConfigService configService = NacosFactory.createConfigService(properties);

        String content = configService.getConfig(dataId, group, 5000);    //通过dataId和group获取对应的配置值;5000为超时时间,单位ms
        System.out.println(content);

        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("receive:" + configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        });

        boolean isPublishOk = configService.publishConfig(dataId, group, "content");    //发布配置
        System.out.println(isPublishOk);

        Thread.sleep(3000);

        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);

        boolean isRemoveOk = configService.removeConfig(dataId, group);    //删除配置
        System.out.println(isRemoveOk);
        Thread.sleep(3000);

        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        Thread.sleep(3000);
    }
}

 

3、操作服务实例

public class OperService {
    public static void main(String[] args) throws NacosException, InterruptedException {
        String serverAddr = "localhost";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        properties.put(PropertyKeyConst.USERNAME,"nacos");
        properties.put(PropertyKeyConst.PASSWORD,"nacos");

        NamingService naming = NamingFactory.createNamingService(properties);
        naming.registerInstance("test", "11.11.11.11", 8888, "DEFAULT");    //注册test实例,分组为DEFAULT
        Thread.sleep(2000);
        naming.registerInstance("test", "127.0.0.1", 9999, "DEFAULT");    //第二次注册test实例,同样分组为DEFAULT
        Thread.sleep(2000);
        System.out.println(naming.getAllInstances("test"));    //这边只能拿到127.0.0.1,因为第二次注册会被覆盖第一次

        Thread.sleep(2000);
        naming.subscribe("test", new EventListener() {
            @Override
            public void onEvent(Event event) {
                System.out.println(((NamingEvent)event).getServiceName());
                System.out.println(((NamingEvent)event).getInstances());
            }
        });

        naming.deregisterInstance("test", "127.0.0.1", 9999, "DEFAULT");    //注销服务实例
        Thread.sleep(2000);
        System.out.println("dereg 127.0.0.1");
        System.out.println(naming.getAllInstances("test"));
    }
}

官方文档明确指出,同一个Nacos Client实例,仅能向一个服务注册一个实例;若同一个Nacos Client实例多次向同一个服务注册实例,后注册的实例将会覆盖先注册的实例。 如果确定需要实现多个实例同时注册,则使用批量添加服务实例。

各位使用的小伙伴需注意:根据博主的测试,getAllInstances()函数在获取实例会偶尔失败,但没有异常抛出。

 

4、批量添加服务实例

package code;

import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class BatchOperService {
    public static void main(String[] args) throws NacosException {
        String serverAddr = "localhost";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        properties.put(PropertyKeyConst.USERNAME,"nacos");
        properties.put(PropertyKeyConst.PASSWORD,"nacos");

        NamingService naming = NamingFactory.createNamingService(properties);

        Instance instance1 = new Instance();
        instance1.setIp("127.0.0.1");
        instance1.setPort(8848);
        instance1.setClusterName("DEFAULT");

        Instance instance2 = new Instance();
        instance2.setIp("127.0.0.1");
        instance2.setPort(9848);
        instance2.setClusterName("DEFAULT");

        List<Instance> instances = new ArrayList<>(2);
        instances.add(instance1);
        instances.add(instance2);

        naming.batchRegisterInstance("nacos.test.service", "DEFAULT_GROUP", instances);    //批量注册实例
        System.out.println(naming.getAllInstances("nacos.test.service"));
    }
}

 

本文到这里就结束了,对于配置与实例还有侦听配置、获取健康实例等更细致的操作,大家可以查看官网文档(点击进入)。下一篇我们将一起了解springboot整合nacos的过程:)

 

posted on 2025-02-07 11:14  咚..咚  阅读(326)  评论(0)    收藏  举报

导航