# Nacos

万世威 2020-10-16

  • 动态服务发现、动态配置管理、服务管理平台

# Nacos 安装

1、docker 安装

docker pull nacos/nacos-server
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
1
2
  • 参考文档:https://github.com/nacos-group/nacos-docker/blob/master/README_ZH.md

2、本地安装

# 下载地址
https://github.com/alibaba/nacos/releases
1
2

运行 bin 目录下 startup.sh 或 startup.cmd

sh startup.sh -m standalone 不加参数,默认使用集群模式

3、使用

  • 访问路径:http://127.0.0.1:8848/nacos
  • 账号&密码:nacos/nacos

4、测试

# 发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld&namespace=7daffe6f-e9c1-4986-a059-601c6d53d70d"

# 获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

# 详细配置
https://nacos.io/zh-cn/docs/open-api.html
1
2
3
4
5
6
7
8

# 配置中心

0、配置模型

​ 通过 namespace、group、dataId 唯一确定一个配置

nacos

1、命名空间

namespace

  • public:默认的命名空间,默认新建配置在此命名空间下
  • 可新建不同命名空间。如:dev、test、release 等

namespace-prod

  • 新建命名空间后,生成唯一的 ID,在 yml 等配置文件中使用 id 标识

2、新建配置

properties

  • 可选命名空间,不同配置文件使用不同命名空间

create-properties

  • 默认 Group:DEFAULT_GROUP

properties-test

3、导出、导入配置

4、历史版本

  • 修改配置后,在历史版本中可查看之前版本,可进行回滚操作

5、配置修改监听

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.3</version>
</dependency>
1
2
3
4
5
import com.alibaba.nacos.api.NacosFactory;
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 SimpleDemoMain {

    public static void main(String[] args) throws NacosException {
        String server = "127.0.0.1:8848";
        String dataId = "com.dist";
        String group = "test";
        String namespace = "7daffe6f-e9c1-4986-a059-601c6d53d70d";

        Properties properties = new Properties();
        properties.setProperty("serverAddr", server);
        properties.setProperty("namespace", namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String config = configService.getConfig(dataId, group, 5000L);
        System.out.println(config);

      // 监听修改配置
      configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println(configInfo);
            }
        });

        while (true) {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
/** 输出
server:
    port: 8085
server:
		port: 8088
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# SpringBoot 版

1、Pom 配置

<!-- parent pom.xml -->
<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.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

2、配置文件

spring:
  application:
    name: service0
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: 127.0.0.1:8848
        namespace: 7daffe6f-e9c1-4986-a059-601c6d53d70d # 可选
        group: dist
1
2
3
4
5
6
7
8
9
10
  • ==新建 bootstrap.yml,名称固定,该配置文件最先被加载==
  • file-extension:默认值 properties
  • server-addr:端口号不能省略
  • namespace:默认值 public
  • group:默认值 DEFAULT_GROUP
  • ==dataId:由 application.name + file-extension 构成==

3、实例

nacos-springboot

@RestController
public class NacosController {

    @Value("${dist.name}")
    private String config;

    @Autowired
    private ConfigurableApplicationContext configContext;

    @GetMapping("/config")
    public String getConfig() {
        return config;
    }

    @GetMapping("/config2")
    public String getConfig2() {
        return configContext.getEnvironment().getProperty("dist.name");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • 使用 @Value 注入值,在值发生变动时不会更新
  • 参考 config2,修改配置时自动更新
  • spring.cloud.nacos.config.refresh.enabled=false ==来关闭动态刷新==

4、支持 profile 粒度的配置

​ Nacos Config 在加载配置的时候,不仅仅加载了以 DataId 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了 DataId 为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项来配置

spring.profiles.active=develop
1

${spring.profiles.active} 当通过配置文件来指定时放在 bootstrap.properties|yml 文件中

spring.profiles.active 优先级比 spring.application.name.file-extension 优先级高

5、自定义扩展的 Data Id 配置

  • 多个微服务共用一部分配置信息(如数据库连接信息)
  • 多配置文件加载问题
# 获取配置从上述配置的 namespace 中获取,默认(public)
# 顺序优先级参考 第 7 条
ext-config[0]:
	data-id: ext-config-common01.properties
ext-config[1]:
	data-id: ext-config-common02.properties
	group: GLOBALE_GROUP
ext-config[2]:
	data-id: ext-config-common03.properties
	group: GLOBALE_GROUP
	refresh: true
1
2
3
4
5
6
7
8
9
10
11

6、共享 Data Id 配置

  • 只认识 DEFAULT_GROUP 下配置
# 只能获取  DEFAULT_GROUP 下配置,不常用
# 获取的是 上面配置的 namespace 下的配置(没有配置 namespace 默认是 public)
# common1、common2 有相同配置,以后面的为主
# 具体优先级看 第 7 条
shared-dataids: ext-config-common01.properties,ext-config-common02.properties
refreshable-dataids: ext-config-common03.properties
1
2
3
4
5
6

7、配置的优先级

Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置

  • A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

其中 n 的值越大,优先级越高

ext-config[n].data-id 必须带上文件扩展名(common.properties)

# 详细配置说明

https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc

# 服务中心

# SpringBoot+Dubbo+Nacos 版

  • 参照压缩包
# nacos 中 application.yaml(dataid) -- dist(group)配置
dist:
  name: wanshw
dubbo:
  scan:
    base-packages: com.dist.nacos.web
  application:
    name: consumer
  registry:
    address: nacos://127.0.0.1:8848
  provider:
    version: 1.0.0
  consumer:
    version: 1.0.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# nacos 中 application-service.yaml(dataid) -- dist(group)配置
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
  consumer:
    version: 1.0.0
  provider:
    version: 1.0.0
  scan:
    base-packages: com.dist.service
  application:
    name: service
  protocol:
    name: dubbo
server:
  port: 8090
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 详细说明

https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc

# 配置说明

1、取消登录验证

nacos-login

2、外部持久化配置

docker pull mysql:5.7
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
# 连接上此数据库
# 默认账号密码: root/123456
# 创建一个数据库
create database nacos_config;
# 执行 conf/nacos-mysql.sql
1
2
3
4
5
6
7
# 在 conf/application.properties 下新增以下配置
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8
db.user=root
db.password=123456
1
2
3
4
5

3、集群部署

集群模式下需要配置数据库,目前只支持 mysql, 版本要求:5.6.5+

  • 检查 conf/application.properties 端口号是不是冲突

  • 修改 conf 目录下 cluster.conf.example -> cluster.conf

  • 添加 主机 IP + 端口号, 复制到其它机器上

ip 不能使用 127.0.0.1,改成真实 IP 即可

# 参考

  • https://nacos.io/zh-cn/index.html

  • https://github.com/alibaba/nacos

  • https://nacos.io/zh-cn/docs/what-is-nacos.html