nacos基础

nacos基础,第1张

文章目录
  • 前言
  • 分布式应用配置管理
    • 1. 发布配置
    • 2. 创建父工程
    • 3. 微服务service01
    • 4. 微服务service02
    • 5. 支持配置的动态更新
    • 6. 自定义namespace和group配置
      • 支持自定义namespace的配置
      • 支持自定义Group的配置
    • 7. 自定义扩展的Data Id配置
    • 8. 自定义共享的Data Id配置(不推荐)
    • 9. 配置的优先级
    • 10. 完全关闭nacos配置

前言

  • 用户通过nacos server的控制台集中对多个服务的配置进行管理
  • 各服务统一从nacos server中获取各自的配置,并监听配置的变化

代码已传至Gitee:https://gitee.com/lengcz/nacosconfig.git

分布式应用配置管理 1. 发布配置

在nacos发布配置,我们规划了两个服务service01,service02,并且想对这两个服务的配置进行集中维护。
在nacos中添加配置

对应的内容

#service01.yaml
person:
    name: xiaowang from service01
#service02.yaml
person:
    name: xiaoming from service02
2. 创建父工程

(1) 新建一个maven工程

(2)引入依赖pom.xml,配置依赖管理和插件


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.1.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>

            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>2.1.3.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>


    <build>
        
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>
3. 微服务service01

(1)新建子工程service01
(2) 引入依赖

<dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

(3)在resources文件夹下配置bootstrap.yml文件

server:
  port: 10001  #启动端口
spring:
  application:
    name: service01
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   #配置中心
        file-extension: yaml  #文件扩展名,dataid的名称就是application.name+file-extension,即为service01.yaml
        namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72  #开发环境dev的id(nacos命名空间下找dev对应的id)
        group: TEST_GROUP  #测试组

(4) 编写一个controller

@RestController
public class HelloController {

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

    @GetMapping("/hello")
    public String hello(){
        //读取配置信息
        return name;
    }
}

(5) 编写启动类

package com.it2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Service01Bootstrap {

    public static void main(String[] args) {
        SpringApplication.run(Service01Bootstrap.class,args);
    }
}

(6)运行启动类,并访问controller,可以看到能获取到nacos的配置

4. 微服务service02

与service01同样,此处省略。

5. 支持配置的动态更新

在nacos后台修改了配置的内容

再次访问service01,发现内容并没有变化。

如何如何可以实时的获取配置呢?热更新

使用ConfigurableApplicationContext applicationContext来获取配置

@RestController
public class HelloController {

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

    @Autowired
    ConfigurableApplicationContext applicationContext;

    @GetMapping("/hello")
    public String hello(){
        //读取配置信息
        return name+"--------"+applicationContext.getEnvironment().getProperty("person.name");
    }
}

(1) 启动前的配置内容

#service1.yaml
person:
    name: xiaowang from service01 before

(2) 启动项目,并访问,两种方式获取的内容一致

(3) 在nacos上修改配置文件

(4) (不重启服务)访问接口获取nacos里配置的person.name,发现ConfigurableApplicationContext 可以在不重启服务的情况下得到新的配置内容。

总结
@Value注解不能热更新内容
ConfigurableApplicationContext 支持热更新

通过上面的例子说明spring-cloud-starter-clibaba-nacos-config支持配置的动态更新

6. 自定义namespace和group配置 支持自定义namespace的配置

在没有明确指定${spring.cloud.nacos.config.namespace}配置的情况下,默认使用nacos上的Public这个namespace。如果需要使用自定义的命名空间,可以通过如下配置实现:

spring:
  cloud:
    nacos:
      config:
        namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72  #namespace的id

注意:该配置必须放在bootstrap.ym或者bootstrap.propertiesl文件中。此外spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在nacos的控制台获取。并且在添加配置时注意不要选择其它的namespace,否则将会导致读取不到正确的配置。

支持自定义Group的配置

在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用是DEFAULT_GROUP。如果需要自定义自己的group,可以通过一下配置来实现:

spring:
  cloud:
    nacos:
      config:
        group: TEST_GROUP  #测试组

注意:该配置必须放在bootstrap.yml或者bootstrap.properties文件中。并且在添加配置时group的值一定要和spring.cloud.nacos.config.group的配置一致。

7. 自定义扩展的Data Id配置

Spring Cloud Alibaba Nacos Config可支持自定义Data Id的配置。一个完整的的配置案例如下:

server:
  port: 10002  #启动端口
spring:
  application:
    name: service02
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   #配置中心
        file-extension: yaml  #文件扩展名,dataid的名称就是application.name+file-extension,即为service01.yaml
        namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72  #开发环境dev的id(nacos命名空间下找dev对应的id)
        group: TEST_GROUP  #测试组
# 扩展文件
# 1. Data Id在默认的组DEFAULT_GROUP,不支持配置的动态刷新
        ext-config[0]:
          data-id: ext-config01.properties
        ext-config[1]:
# 2. Data Id 不在默认的组,不支持动态刷新
          data-id: ext-config02.properties
          group: TEST2_GROUP
# 3. Data Id不在默认的组,支持动态刷新
        ext-config[2]:
          data-id: ext-config03.properties
          group: TEST3_GROUP
          refresh: true

在nacos后台配置了三个配置

三个扩展文件的内容分别如下

config01.name=1
config02.name=2
config03.name=3

稍微修改代码

@RestController
public class HelloController {
    @Value("${person.name}")
    private String name;

    @Autowired
    ConfigurableApplicationContext applicationContext;


    @GetMapping("/hello")
    public String hello(){
        System.out.println("=====================");
        System.out.println(applicationContext.getEnvironment().getProperty("config01.name"));
        System.out.println(applicationContext.getEnvironment().getProperty("config02.name"));
        System.out.println(applicationContext.getEnvironment().getProperty("config03.name"));
        return name;
    }
}

在项目启动后,此时分别将值改成11,22,33,打印输出结果,只有第三个显示33,表明了 refresh: true可以热刷新。

总结

  • 通过spring.cloud.nacos.config.ext-config[n].data-id的配置方式来支持多个Data Id的配置,同时文件必须指定扩展名,支持properties和yaml,此扩展名与spring.cloiud.nacos.config.file-extension的配置对自定义扩展配置的Data Id文件扩展名没有关系。
  • 通过spring.cloud.nacos.config.ext-config[n],group的配置方式自定义Data Id所在的分组,未指定的情况下默认是DEFAULT_GROUP
  • 通过spring.cloud.nacos.ext-config[n].refresh的配置方式来控制该Data Id在配置变更时,是否支持应用中可动态刷新,感知到最新的配置值。默认为false,不支持热刷新。
  • 通过自定义扩展的Data Id配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置。
8. 自定义共享的Data Id配置(不推荐)

为了更加清晰的在多个应用间配置共享的Data Id,你可以通过一下的方式来配置:

server:
  port: 10001  #启动端口
spring:
  application:
    name: service01
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   #配置中心
        file-extension: yaml  #文件扩展名,dataid的名称就是application.name+file-extension,即为service01.yaml
        namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72  #开发环境dev的id(nacos命名空间下找dev对应的id)
        group: TEST_GROUP  #测试组
#共享Data Id只支持DEFAULT_GROUP
        shared-dataids: ext-config01.properties,ext-config02.properties   #共享的Data Id
        refreshable-dataids: ext-config01.properties   #热刷新的Data Id

总结:

  • 通过spring.cloud.nacos.config.shared-dataids来支持多个共享Data Id的配置,多个之间以逗号隔开。
  • 通过spring.cloud.nacos.config.refreshable-dataids来支持哪些共享配置的Data Id在配置变化时,应用是否动态刷新,获取最新的值,多个Data Id之间以逗号隔开。如果没有生命,默认情况下所有共享配置的Data Id都不支持动态刷新。

通过spring.cloud.nacos.config.shared-dataids来支持多个共享配置的Data Id时,多个共享配置间的一个优先级的关系约定:按照配置出现的先后顺序,即后面的优先级高于前面。

9. 配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从nacos拉取配置

  • A 通过spring.cloud.nacos.config.shared-dataids支持多个共享Data Id的配置
  • B 通过spring.cloud.nacos.ext-config[n].data-id的方式支持多个扩展Data Id的配置,多个Data Id同时配置时,优先级顺序:后面的配置覆盖前面,即后面优先级更高。
  • C 通过内部相关规则(应用,扩展名)自动生成相关的Data Id配置

当三种方式共同存在时,优先级C > B >A

验证B:
分别在ext-config01.properties和ext-config02.properties配置内容name=01和name=02

然后输出name,可以看到ext-config02.properties的优先级高于ext-config01.properties

验证C> B
此时修改service02.yaml,增加name=service.yaml

同时运行输出name,输出的name为service02.yaml的配置内容,说明C>B

10. 完全关闭nacos配置

通过配置spring.cloud.nacos.config.enabled=false 来完全关闭Spring Cloud Nacos Config

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/742793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存