SpringCloud Alibaba - Nacos配置中心

3,052 阅读3分钟

Nacos为用户提供包括动态服务发现,配置管理,服务管理等服务基础设施,帮助用户更灵活,更轻松地构建,交付和管理他们的微服务平台,基于Nacos, 用户可以更快速的构建以“服务”为中心的现代云原生应用。Nacos可以和Spring Cloud、Kubernetes/CNCF、Dubbo 等微服务生态无缝融合,为用户提供更卓越的体验。更多 Nacos 相关的信息,请参考 Nacos 项目

创建项目

新建cloud-nacos-config模块,添加spring-cloud-starter-alibaba-nacos-config依赖,pom.xml如下:

<?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>
    <parent>
        <artifactId>l-cloud-alibaba</artifactId>
        <groupId>com.codelong</groupId>
        <version>1.0.0</version>
    </parent>

    <artifactId>cloud-nacos-config</artifactId>
    <name>config-service</name>
    <description>nacos配置Demo</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

基本使用

resources目录下新建bootstrap.yml配置文件:

server:
  port: 8081  # 服务端口号
spring:
  application:
    name: config-service # 服务名称,默认也是在微服务中注册的微服务ID
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      config: # Nacos配置中心配置
        file-extension: yaml # 文件扩展名
        server-addr: 127.0.0.1:8848
        username: nacos # Nacos用户名
        password: nacos # Nacos密码

我们在Nacos控制台新建一个配置文件

image-20210420115813822

我们回到我们项目,新建一个ConfigController类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ConfigController {

    @Value("${message:null}")
    private String message;

    @GetMapping("message")
    public String getMessage() {
        return this.message;
    }

}

@RefreshScope注解用于自动刷新配置,即我们在Nacos控制台修改了相关配置点击发布后,我们的应用能够在不重启的情况下获取到最新的配置。

@Value("${message:null}") 注解是读取message配置,默认值为null。

我们启动项目,在浏览器中访问:http://localhost:8081/message:

image-20210420120359920

看到配置读取到了说明nacos读取成功了,我们接着去nacos控制台修改message为codelong再次访问:

image-20210420120732913

image-20210420120640208

获取配置规则

Nacos配置中心通过namespace、dataId和group来唯一确定一条配置。

  1. namespace,即命名空间。默认的命名空间为public,我们可以在Nacos控制台中新建命名空间;

  2. dataId,即配置文件名称,dataId的拼接格式如下:

    ${prefix}-${spring.profiles.active}.${file-extension}
    
    • prefix默认为pring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置;
    • spring.profiles.active即为当前环境对应的profile注意,当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
    • file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。
  3. group,即配置分组,默认为DEFAULT_GROUP,可以通过spring.cloud.nacos.config.group配置。

所以根据这些规则,上面示例中我们的应用名称spring.application.name为config-service,spring.cloud.nacos.config.file-extension的值为yaml,spring.profiles.active的值为dev,于是dataId为config-service-dev.yaml,分组为默认的DEFAULT_GROUP,命名空间为默认的public。这就是我们在Nacos控制台中新建配置时的根据。

配置划分实战

Nacos配置中心的namespace、dataId和group可以方便灵活地划分配置。比如,我们现在有一个项目需要开发,项目名称为codeblog,项目开发人员分为两个组:GROUP_A和GROUP_B,项目分为三个环境:开发环境dev、测试环境test和生产环境prod。

假如现在GROUP_A组的组长需要在Nacos中新建一个开发环境的codeblog项目配置,那么他可以这样做:

  1. 在Nacos控制台中新建一个名称为codeblog的命名空间:

    image-20210420125552654

    image-20210420125701290

    image-20210420125750121

    新建codeblog命名空间后,会生成一个唯一标识该命名空间的命名空间id 48b57993-706b-4caf-91a4-809dd18125fe。

  2. 在Nacos控制台中新建一个配置:

    image-20210420125943339

    image-20210420130323428

  3. 最后在codeblog项目的bootstrap.yml配置文件中添加如下配置即可:

    spring:
      profiles:
        active: dev # 环境
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
            file-extension: yaml # 后缀
            prefix: codeblog # 前缀
            namespace: '48b57993-706b-4caf-91a4-809dd18125fe' # 命名空间
            group: GROUP_A # 对应组
    

配置回滚

Nacos中,修改配置点击发布后会创建一个对应的历史版本快照,我们可以在Nacos控制台的历史版本列表中找到这些快照:

image-20210420130636436

点击回滚按钮即可将配置恢复到指定的版本。

获取多个配置

除了通过上面的方式指定一个唯一配置外,我们还可以同时获取多个配置文件的内容,比如,将项目的bootstrap.yml内容修改为:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        extension-configs:
          - dataId: ext-config-one.yaml
            group: DEFAULT_GROUP
            refresh: true
          - dataId: ext-config-two.yaml
            group: DEFAULT_GROUP
            refresh: false
  • spring.cloud.nacos.config.extension-configs[n].dataId,指定多个配置的dataId,必须包含文件格式,支持properties、yaml或yml;
  • spring.cloud.nacos.config.extension-configs[n].group,指定分组;
  • spring.cloud.nacos.config.extension-configs[n].refresh,是否支持刷新。

上面的配置中,我们分别从DEFAULT_GROUP中获取了ext-config-one.yamlext-config-two.yaml配置内容,并且ext-config-one.yaml支持刷新,ext-config-two.yaml不支持刷新。

没有namespace的配置,言外之意就是Nacos目前还不支持多个配置指定不同的命名空间。

我们在Nacos控制台中新建这两个配置:

image-20210420131229000

ext-config-one.yaml配置内容:

ext1: hello

ext-config-tow.yaml配置内容:

ext2: world

在项目的ConfigController中添加:

@RestController
@RefreshScope
public class TestController {

    @Value("${ext1:null}")
    private String ext1;
    @Value("${ext2:null}")
    private String ext2;

    @GetMapping("multi")
    public String multiConfig() {
        return String.format("ext1: %s ext2: %s", ext1, ext2);
    }

    ...
}

启动项目,浏览器访问:http://localhost:8081/multi:

image-20210420131559694

ext1的值修改为niceext2的值修改为job

image-20210420131705654

可以看到ext1的值更新了,ext2没有更新。

多配置共享

多配置共享其实和获取多个文件配置作用差不多,下面演示下多配置共享。

将bootstrap.yml配置修改为:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        shared-configs: ext-config-one.yaml,ext-config-two.yaml

spring.cloud.nacos.config.shared-configs指定了共享ext-config-one.yamlext-config-two.yaml的配置。

重启后请求也是能获取到配置打印的。

可以看到,无论是多配置共享还是获取多个配置,要完成的事情是一样的,不过它们都有各自的局限性。多配置共享无法指定命名空间;获取多个配置相对较为灵活。

常用配置

配置项key默认值说明
服务端地址spring.cloud.nacos.config.server-addr
DataId前缀spring.cloud.nacos.config.prefixspring.application.name
Groupspring.cloud.nacos.config.groupDEFAULT_GROUP
dataID后缀及内容文件格式spring.cloud.nacos.config.file-extensionpropertiesdataId的后缀,同时也是配置内容的文件格式,目前只支持 properties
配置内容的编码方式spring.cloud.nacos.config.encodeUTF-8配置的编码
获取配置的超时时间spring.cloud.nacos.config.timeout3000单位为 ms
配置的命名空间spring.cloud.nacos.config.namespace常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
AccessKeyspring.cloud.nacos.config.access-key
SecretKeyspring.cloud.nacos.config.secret-key
相对路径spring.cloud.nacos.config.context-path服务端 API 的相对路径
接入点spring.cloud.nacos.config.endpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否开启监听和自动刷新spring.cloud.nacos.config.refresh-enabledtrue

官方Example参考

github.com/alibaba/spr…

spring-cloud-alibaba-group.github.io/github-page…