Spring Cloud Alibaba Nacos配置中心 ,Nacos不仅可以作为服务注册和发现,还可以作为配置中心,之前关于配置中心我学习过Spring Cloud Config分布式配置中心,虽然说可以完成配置的读取以及配合Bus完成动态刷新,但是Nacos更好的实现了配置中心,并且系统耦合度更低。

1. 基础配置客户端

下面新建一个基础配置客户端 cloud-alibaba-nacos-config-client3377

1.1 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">
    <parent>
        <artifactId>live.yremp.springcloud</artifactId>
        <groupId>live.yremp</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-alibaba-nacos-config-client3377</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

</project>

1.2 配置文件

这里需要两个配置 bootstrap.yml 和application.yml ,其中bootstra.yml的优先级高于application.yml.

boostrap.yml内容如下:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 39.105.173.178:8848  # Nacos作为服务注册中心
      config:
        server-addr: 39.105.173.178:8848  # Nacos作为配置中心
        file-extension: yaml # 指定配置文件格式为yaml

application.yml内容如下:

spring:
  profiles:
    active: dev # 表示开发环境

1.3 主启动类

package live.yremp.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigMain3377.class,args);
    }
}

1.4 业务代码

主要就一个Controller,如下

package live.yremp.springcloud.alibaba.controller;

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 //支持Nacos的动态刷新
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

1.5 新增配置

nacos对配置文件名称有严格的要求,下面部分官方文档中的内容

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

我个人总结的格式如下,更加容易理解

${spring.application.name}-${spring.profile.active}.${file-extension}

按照我们上面项目中两个配置文件的配置,我们要读取的配置文件完完整名称应该是 nacos-config-client-dev.yaml

注意:Nacos到1.3.1为止不能使用简写yml必须些全称的yaml,否则会报错:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"

下面去Nacos后台新建上述名称的配置文件

配置文件内容为:

config:
  info: nacos config center,version=1

最后点击发布,即可看到我们的配置文

1.6 启动测试

完成上面的步骤之后,启动项目,访问接口进行测试,看看配置读取是否正常

Web接口访问测试

可以看到读取时完全正常的

1.7 动态刷新配置

此时我们去Nacos修改配置文件的版本号为2,修改后内容如下

config:
  info: nacos config center,version=2

点击发布

确认发布

此时我们不重启项目,去刷新web请求接口,看看配置读取情况

直接就读取到最新的配置,相对于Spring Cloud Config+Bus做动态刷新更加的简单和方便

2. 命名空间、分组和DataID

2.1 起因

上面只是最基础的使用,实际开发过程中,可能会遇到下面的一些问题:

1.实际开发过程中一般会有三个环境

  1. dev 开发环境
  2. test 测试环境
  3. prod 生产环境

如何保证指定环境启动时能正确读取到Nacos上相应环境的配置文件?

2.一个大型的分布式微服务会有很多子微服务项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…如何对这些微服务经行配置管理?

2.2 解释

NameSpace+Group+DataID 就可以解决上面的问题

默认情况下

Namespace=public, Group=DEFAULT_ GROUP,默认Cluster是DEFAULT

  1. Nacos默认的命名空间是public, Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
  2. Group默认是DEFAULT_ GROUP, Group可以把不同的微服务切分到同一个分组里面去
  3. Service就是微服务; 一个Service可以包含多个Cluster (集群), Nacos默认Custer是DEFAULT, Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在了杭州机房和州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),給广州机房的Service微服务起一 个集群名称(GZ) ,还可以尽量让同一个机房的微服务互相调用,以提升性能。
  4. 最后是Instance,就是微服务的实例。

2.3 DataID配置

之前我们的基础使用测试就是使用了DataID配置,规则如下:

${spring.application.name}-${spring.profile.active}.${file-extension}

我们新建一个test测试环境的配置文件,并修改原来的dev配置文件更容易区别各个环境

修改 nacos-config-client-dev.yaml

config:
  info: nacos config center,nacos-config-client-dev,version=2

新建 nacos-config-client-test.yaml

config:
  info: nacos config center,nacos-config-client-test,version=2

现在我们只需要修改项目的application.yml中:

spring:
  profiles:
      #active: dev # 表示开发环境
      active: test # 表示测试环境

重启项目应该就可以读取到测试环境的配置文件,下面重启测试一下:

成功读取到了test测试环境的配置文件。

2.4 Group方案

新建一个 nacos-config-client-info.yaml 分组为TEST_GROUP,内容为:

config:
    info: nacos-config-client-info.yaml,TEST_GROUP

新建一个 nacos-config-client-info.yaml 分组为DEV_GROUP ,内容为:

config:
     info: nacos-config-client-info.yaml,DEV_GROUP

如何读取对应分组的信息呢,则需要修改两个配置文件

bootstrap.yml ,为config添加 group 属性 下面先读取TEST_GROUP

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 39.105.173.178:8848  # Nacos作为服务注册中心
      config:
        server-addr: 39.105.173.178:8848  # Nacos作为配置中心
        file-extension: yaml # 指定配置文件格式为yaml
        group: TEST_GROUP # 指定分组

修改application.yml 中的DataID中的 spring.profile.active 属性读取 info

spring:
  profiles:
    active: info #info
      #active: dev # 表示开发环境
      #active: test # 表示测试环境

重启项目,测试读取情况

再修改group属性为DEV_GROUP,重启项目进行测试

2.5 NameSpace方案

新建两个namespace分别是test、dev

在dev命名空间下新建一个nacos-config-client-dev.yaml 分组为DEFAULT_GROUP 内容如下:

config:
    info: namespace:dev ,DEFAULT_GROUP,nacos-config-client-dev.yaml

再新建一个 nacos-config-client-dev.yaml 分组为DEV_GROUP,内容如下:

config:
     info: namespace:dev ,DEV_GROUP,nacos-config-client-dev.yaml

然后最后再新建一个 nacos-config-client-dev.yaml 分组为 TEST_GROUP,内容如下:

config:
     info: namespace:dev ,TEST_GROUP,nacos-config-client-dev.yaml

新建完成后

然后修改boostrap.yml 和application.yml 测试读取dev命名空间下的DEV_GROUP 中的 nacos-config-client-dev.yaml

bootstrap.yml 中 config 下新增 namespace 属性

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 39.105.173.178:8848  # Nacos作为服务注册中心
      config:
        server-addr: 39.105.173.178:8848  # Nacos作为配置中心
        file-extension: yaml # 指定配置文件格式为yaml
        group: DEV_GROUP # 指定分组
        namespace: 64351ece-559c-48b8-a58d-cfddf5de32a3 # namespace ID 

application.yml中修改active属性为 dev

spring:
  profiles:
    #active: info
      active: dev # 表示开发环境
      #active: test # 表示测试环境

重启服务进行测试

成功读取了dev 下DEV_GROUP下的 nacos-config-client-dev.yaml ,对于其他的命名空间、分组下的配置文件读取只需要修改namespace、和group属性即可。

标签云

ajax AOP Bootstrap cdn Chevereto CSS Docker Editormd GC Github Hexo IDEA JavaScript jsDeliver JS樱花特效 JVM Linux Live2D markdown Maven MyBatis MyBatis-plus MySQL Navicat Oracle Pictures QQ Sakura SEO Spring Boot Spring Cloud Spring Cloud Alibaba SpringMVC Thymeleaf Vue Web WebSocket Wechat Social WordPress Yoast SEO 代理 分页 图床 小幸运 通信原理

Spring Cloud Alibaba Nacos配置中心
Spring Cloud Alibaba Nacos配置中心