安装
下载nacos-server-2.2.0版本并安装,启动后默认使用的8848端口。
nacos客户端升级为2.x版本后,新增了gRPC的通信方式,新增了两个端口。
这两个端口在nacos原先的端口上(默认8848),进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
启动成功后浏览器输入:http://ip:8848/nacos
相关概念
命名空间(Namespace) 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group
或Data ID
的配置。
Namespace
的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
配置集(Data ID) 类似于配置文件的名称。
配置分组(Group) Nacos 中的一组配置集,是组织配置的维度之一。
通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分Data ID
相同的配置集。
当您在Nacos
上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP
。
配置分组的常见场景:不同的组件使用了相同的配置类型,如database_url
配置和MQ_topic
配置。
Java中使用
引入依赖
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
配置相关
/**
* Java中使用nacos配置相关用法
*/
public class ConfigExample {
public static void main(String[] args) throws NacosException, InterruptedException, IOException {
String serverAddr = "127.0.0.1:8848";
// 新建配置时填入的 Data ID
String dataId = "userapp.properties";
// 指定配置分组, 默认分组为DEFAULT_GROUP, 新建配置时填入的 Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
// 配置nacos地址
properties.put("serverAddr", serverAddr);
// 指定命名空间, 默认为public, 这里填的是命名空间的id而不是名称
properties.put("namespace", "dev");
ConfigService configService = NacosFactory.createConfigService(properties);
// 获取配置内容
String content = configService.getConfig(dataId, group, 5000);
System.out.println("原始配置内容:\n" + content);
// 新增监听器 当配置内容有变化时会收到通知
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("配置内容有变化:\n" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
System.in.read();
}
}
注册应用
public class App {
public static void main(String[] args) throws NacosException, IOException, InterruptedException {
Properties properties = new Properties();
// 多个地址使用逗号隔开
properties.setProperty("serverAddr", "127.0.0.1:8848");
properties.setProperty("namespace", "public");
NamingService naming = NamingFactory.createNamingService(properties);
// 注册到注册中心, 默认groupName=DEFAULT_GROUP
naming.registerInstance("app1", "11.11.11.11", 8888);
naming.registerInstance("app2", "2.2.2.2", 9999);
Thread.sleep(1000);
System.out.println(naming.getAllInstances("app1"));
System.out.println(naming.getAllInstances("app2"));
System.in.read();
}
}
订阅应用
public class NamingExample {
public static void main(String[] args) throws NacosException, InterruptedException, IOException {
Properties properties = new Properties();
properties.setProperty("serverAddr", System.getProperty("serverAddr", "121.37.196.254:8848"));
properties.setProperty("namespace", System.getProperty("namespace", "public"));
NamingService naming = NamingFactory.createNamingService(properties);
naming.registerInstance("app3", "55.55.55.55", 8080);
System.out.println("instances after register: " + naming.getAllInstances("app1"));
Executor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
runnable -> {
Thread thread = new Thread(runnable);
thread.setName("test-thread");
return thread;
});
// 订阅服务名为app1, 当app1的实例数量发生变化, 会收到回调
naming.subscribe("app1", new AbstractEventListener() {
@Override
public Executor getExecutor() {
return executor;
}
@Override
public void onEvent(Event event) {
System.out.println("serviceName: " + ((NamingEvent) event).getServiceName());
System.out.println("instances from event: " + ((NamingEvent) event).getInstances());
}
});
System.in.read();
}
}