• 献给Nacos小白的一篇好文:配置参数使用及存储


    配置参数使用及存储

    Nacos可作为配置中心使用,主要为服务提供在线实时参数配置,也就是当我们修改nacos中的参数配置后,该配置可快速在服务中生效,做到在线及时灵活控制服务参数的作用,如:将数据库连接源中需要频繁调整的配置放在nacos中配置,我们可以修改相关配置项来灵活调配大数据量交互时数据源的瓶颈问题。

    1. 如何快速使用
    2. 数据如何存放
    3. 一些注意事项

    一、如何快速使用

    首先,我们需要依赖alibaba-nacos-config软包,如下:


       
    com.alibaba.cloud
       
    spring-cloud-starter-alibaba-nacos-config

    其次,配置bootstrap.yml而不是application.yml,这是因为前者在Spring中初始化优先级更高,Nacos的在线实时参数配置需要bootstrap.yml的优先加载级别。当然,两个配置文件可同时使用,只需将配置部分放入bootstrap.yml即可,这里为了方便,仅使用了bootstrap.yml配置文件,如下:

    spring:
      application:
        name:
    provider-service
     
    cloud:
        nacos:
          config:
           
    ### 服务配置地址及端口
            server-addr: 127.0.0.1:8848
           
    ### 指定配置前缀,默认为应用名
            prefix: ${spring.application.name}
           
    ### 指定配置文本格式,常用yaml
           
    file-extension: yaml
           
    ### 指定配置所属命名空间
            namespace: 4d973c7e-0a7e-4488-8e45-83ee5441f9d9
           
    ### 指定配置所属的分组
            group: DEFAULT_GROUP

    说明:

    1、dataId格式

    在nacos spring cloud配置中,是通过配置的dataId来精准定位配置内容的,而dataId的组成规则如下:

    ${prefix}-${spring.profiles.active}.${file-extension}

    1. prefix默认为spring.application.name,可通过spring.cloud.nacos.config.prefix自定义。
    2. spring.profiles.active则是当前环境profile,如果其为空,那么dataId格式变为${prefix}.${file-extension}
    3. file-extension为配置内容的格式,可通过spring.cloud.nacos.config.file-extension来指定,目前支持的格式有:text、json、xml、yaml、html及properties。

    2、命名空间和分组

    与服务注册&发现相同,服务加载配置也需要在指定的命名空间和分组中获取,如果服务和配置不在同一个命名空间和分组内,服务是获取不到配置参数,启动直接报无法解析字符错误。

    最后,我们构建一个Person配置类,用来承载配置内容,如下:

    @Component
    @RefreshScope

    public class Person {

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

       
    @Value("${person.age}")
       
    private int age;

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

         // getter&setter省略

    }

    注意:我们必须添加@RefreshScope注解,如果未添加该注解,是可以获取到配置的,但不能实时获取配置内容,也就失去了实时在线参数更新的意义。

    然后,我们在provider空间中新增一个provider-service.yaml配置内容,指定其格式为yaml,效果如下:

    我们编写个DemoController验证一下,内容如下:

    @RestController
    public class DemoController {
       
    @Autowired
       
    private Person person;

        @GetMapping(value = {"/test/config"})
       
    public String hello() {
           
    return JSON.toJSONString(person);
       
    }
    }

    在浏览器中,访问接口:http://127.0.0.1:10001/test/config,返回结果内容如下:

    {"address":"上海浦东新区新秀街129号B座102室a","age":88,"name":"张三"}

    二、数据如何存放

    这里介绍的是nacos以单例模式运行时,配置参数是如何存放的。我们知道当我们重启nacos后发现,之前配置的参数依然存在和生效,这是因为nacos的配置数据存放在其内嵌的derby数据库中,并且该数据库文件已本地化,所以重启后数据不丢失。

    1、Derby数据库

    Derby数据库采用纯java语言开发,是一个轻量级开源的可嵌入和独立使用的关系型数据库,其SQL使用与其它数据库,如:Oracle、MySQL及SqlServer等基本相同,一般被用作存取小量配置数据使用,这也是nacos选择其作为单例模式存储数据的原因。关于derby数据更多内容,若读者感兴趣,可自行查阅资料进行学习。

    2、存放的位置

    A、数据表config_info

    nacos将配置的基本信息存放在config_info表中,如:dataId、分组、配置描述、配置格式及内容等。

    B、数据表config_tags_relation

    这张表用来存放一些高级配置参数,如;标签和归属应用等信息,可在nacos控制台UI中,通过他们来过滤查询配置。

    C、数据表his_config_info

    这张表nacos用来存放记录相关配置的日志记录,主要用来查询配置的历史信息,当然,nacos的配置历史数据是有时效的,如:只保留30天的历史数据。

    D、数据表config_info_tag

    该表用来维护某配置的若干标签基本信息,主要对配置基本信息config_info打了个标签。

    E、数据表config_info_aggr

    在当前nacos版本1.4.3中,这张表目前并未被使用,具体要看后续版本。

    F、数据表config_info_beta

    这张表是当我们勾选Beta发布选项后,输入对应下发IP地址(多个用,号分割)时,点击“发布Beta”发布后,对应的beta版配置信息存储在该表中,其是测试版本,与正式版本同时只能存在一个,一般使用较少,停止Beta发布后,实时配置参数即切换为正式版本。

    说明:了解了以上数据存储内容后,当配置发生异常时,可快速定位相关的数据表进行问题排查,进而修复。

    三、一些注意事项

    1、配置文件命名

    nacos配置中心相关配置需要放在bootstrap.yml中,而不是放在application.yml,否则会报无法解析相关配置字符错误,这是因为,在线参数实时配置需要更高的初始化优先级,而bootstrap.yml高于application.yml被优先解析加载。

    2、命名空间隔离

    与服务注册发现相同,如果服务属于某个namespace时,我们在为该服务配置参数时,必须将配置存储在与该服务同一个namespace和group中,否则报错无法解析配置参数。

    3、配置的热更新

    nacos的配置参数功能采用了发布/订阅模式,利用事件队列异步线程方式刷新配置数据,并结合RefreshScope机制,使得Bean参数配置实时热更新,即实现了服务配置实时更新。对于nacos如何结合RefreshScope实现配置参数热更新的,笔者会在后续内容单独进行介绍。

     

  • 相关阅读:
    摩托车题目 记录
    SpringCloud(三)Sentinel、Seata、多级缓存
    金仓数据库 KingbaseGIS 使用手册(6.14. 几何对象处理函数)
    python+ipc+改造过的插线板写一个控制ipc疯狂上下电的脚本
    基于ssm的员工工资培训奖惩管理系统
    TCP的三次握手和四次挥手
    docker中安装并启动rabbitMQ
    Redis为什么这么快?高频面试题详解
    分享|破世界纪录的OceanBase,如今入选了国际顶会VLDB 2022
    【Leetcode合集】2342. 数位和相等数对的最大和
  • 原文地址:https://blog.csdn.net/why_2012_gogo/article/details/126003773