一、安装Nacos Server
安装之前请确保Java环境和maven环境正常:
- 64 bit JDK 1.8+;
- Maven 3.2.x+;
1、下载源码或者安装包
我选择直接下载安装包:https://github.com/alibaba/nacos/releases下的nacos-server-1.1.3.zip
2、启动服务
双击startup.cmd运行文件
出现以下界面说明运行成功了
如果启动失败有可能是外部数据库没配置好,执行一下下面的sql就行:
可以看到已经创建了nacos所需的数据库:

3、OPEN API配置管理测试
启动nacos成功后,可通过nacos提供的http api验证nacos服务运行是否正常。我使用的是Postman测试
3.1、发布配置
如下Post命令表示向nacos发布一个配置:



3.2、获取配置
GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=test_id &group=test_group "
通过测试发现,可以从nacos获取前边发布的配置:HelloWorld

3.3、关闭服务器
3.4、外部mysql数据库支持
二、配置入门基础
1、发布配置
除了使用open api外,一般都是在nacos控制台直接配置。浏览器访问http://127.0.0.1:8848/nacos,打开nacos控制台,并点击菜单配置管理->配置列表:
Data ID: hello-nacos.yamlGroup : DEFAULT_GROUP配置格式 : YAML配置内容: someconfig :config1: something
第一步:点击新增配置



2、nacos客户端获取配置
(1)新建一个名为nacos-demo的项目,使用的依赖如下:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
(2)编写Java类获取外部化配置
通过ConfigService这个类获取,完整代码如下:
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
String serverAddr = "127.0.0.1:8848"; //nacos地址
String dataId = "hello-nacos.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String dataId, String group, long timeoutMs
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
}
}

3、Nacos配置相关概念

Namespace :代表不同 环境 ,如开发、测试、生产环境。Group :代表某 项目 ,如 XX 医疗项目、 XX 电商项目DataId :每个项目下往往有若干个 工程 ,每个配置集 (DataId) 是一个工程的 主配置文件

1 、 nacos 服务地址,必须指定2 、 namespace ,如不指定默认 public3 、 group ,如不指定默认 DEFAULT_GROUP4 、 dataId ,必须指定

4、配置管理
4.1、 监听查询
public class SimpleDemoMainListener {
public static void main(String[] args) throws NacosException {
//nacos 地址
String serverAddr = "127.0.0.1:8848";
String dataId = "hello-nacos.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
//添加监听String dataId, String group, Listener listener
configService.addListener(dataId, group, new Listener() {
public Executor getExecutor() {
return null;
}
public void receiveConfigInfo(String s) {
//当配置发生变化时的响应
System.out.println(s);
}
});
// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。正式代码中无需下面代码
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当我们点击运行时和上面的获取配置效果是一样的,Java控制台输出:
然后我们在Nacos将hello-nacos.yaml修改(something修改为anything),此时可以看到Java控制台成功监听到我们的修改动作并且获取了最新的配置:
三、分布式应用配置管理

- 用户通过Nacos Server的控制台集中对多个服务的配置进行管理。
- 各服务统一从Nacos Server中获取各自的配置,并监听配置的变化。
1、发布配置
Namespace:9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境Data ID: service1.yamlGroup : TEST_GROUP配置格式 : YAML配置内容: common:name: service1 config

service2:
Namespace:9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2#开发环境
Data ID: service2.yamlGroup : TEST_GROUP配置格式 : YAML配置内容: common:name: service2 config

2、创建工程
2.1、创建父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>nacos-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>service1</module>
<module>quickstart</module>
</modules>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐alibaba‐dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐dependencies</artifactId>
<version>Greenwich.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐dependencies</artifactId>
<version>2.1.3.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐maven‐plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2、新建项目service1和service2
<parent>
<artifactId>nacos-demo</artifactId>
<groupId>com.xxx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service1</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
server:
port: 56010
spring:
cloud:
nacos:
config:
group: TEST_GROUP
server-addr: 127.0.0.1:8848
file‐extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
application:
name: service1
dataId: 默认是服务名+扩展名(service1.yml)
@SpringBootApplication
@RestController
public class Service1Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service1Bootstrap.class, args);
}
@Value("${common.name}")
private String config1;
@GetMapping("service1/config")
public String getConfig1(){
return config1;
}
}
启动service1通过浏览器查看(之前写成了service1 comfig):
server:
port: 56011
spring:
cloud:
nacos:
config:
group: TEST_GROUP
server-addr: 127.0.0.1:8848
file‐extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
application:
name: service2
编写启动类和service1类似,通过浏览器访问:

2.3、支持配置的动态更新
基于2.2的例子,若要实现配置的动态更新,只需要进行如下改造(注入配置文件上下文):
@SpringBootApplication
@RestController
public class Service2Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service2Bootstrap.class, args);
}
// @Value("${common.name}")
// private String config1;
//
// @GetMapping("service2/config")
// public String getConfig1(){
// return config1;
// }
// 注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("service2/config2")
public String getConfig2(){
return applicationContext.getEnvironment().getProperty("common.name");
}
}
Note可以通过配置spring.cloud.nacos.confifig.refresh.enabled=false来关闭动态刷新
2.4、自定义扩展的DataId配置
通过自定义扩展的Data Id配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
新建一个service3子工程,配置文件如下:
server:
port: 56012
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
ext-config[0]:
data-id: ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
ext-config[3]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true
application:
name: service3
上面的配置文件遵循:
- 通过spring.cloud.nacos.config.ext-config[n].data-id的配置方式来支持多个Data Id的配置。
- 通过spring.cloud.nacos.config.ext-config[n].group的配置方式自定义Data Id所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
- 通过spring.cloud.nacos.config.ext-config[n].refresh的配置方式来控制该Data Id在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
Note : spring.cloud.nacos.config.ext - config[n].data - id 的值必须带文件扩展名,文件扩展名既可支持properties,又可以支持 yaml/yml 。此时 spring.cloud.nacos.config.file - extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
上面用到的三个配置文件内容分别如下:
编写测试代码:
@SpringBootApplication
@RestController
public class Service3Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service3Bootstrap.class, args);
}
// 注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("service3/config3")
public String getConfig2(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String age = applicationContext.getEnvironment().getProperty("common.age");
String adderess = applicationContext.getEnvironment().getProperty("common.address");
return name + " " + age + " " + adderess;
}
}
访问结果表明可以读到三个不同的配置文件内容:
2.5、自定义共享Data Id配置
spring:
cloud:
nacos:
config:
shared‐dataids: ext-config-common01.properties,ext-config-common02.properties
refreshable‐dataids: ext-config-common01.properties
- 通过spring.cloud.nacos.config.shared-dataids来支持多个共享Data Id的配置,多个之间用逗号隔开。
- 通过spring.cloud.nacos.config.refreshable-dataids来支持哪些共享配置的Data Id在配置变化时,应用中是否可动态刷新, 感知到最新的配置值,多个 Data Id之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置的 Data Id都不支持动态刷新。
2.6、配置的优先级
- A:通过spring.cloud.nacos.config.shared-dataids支持多个共享DataId 的配置,按照配置出现的先后顺序,即后面的优先级要高于前面。
- B:通过spring.cloud.nacos.config.ext-config[n].data-id的方式支持多个扩展DataId的配置,多个DataId 同时配置时,他的优先级关系是spring.cloud.nacos.config.ext-config[n].data-id其中n的值越大,优先级越高。
- C:通过内部相关规则(应用名、扩展名)自动生成相关的Data Id配置
2.7、完全关闭配置
通过设置spring.cloud.nacos.confifig.enabled = false来完全关闭Spring Cloud Nacos Confifig
四、Nacos集群部署
1、集群部署


startup ‐m cluster


2、客户端配置

- 关掉127.0.0.1:8848 nacos Leader实例,发现Leader被成功选举至127.0.0.1:8850
- 紧接着重新启动 Provider ,这时马上请求 consumer 的 /service 出现错误,发现 consumer 与 provider 通信已经出现问题。但经过短暂的时间后,通信恢复。 通过测试,我们可以看到,通过以上的集群部署已经达到了高可用的效果。
3、生产环境部署建议

