zoukankan      html  css  js  c++  java
  • SpringCloud Nacos 作为Config配置中心,SpringCloud Nacos 配置动态更新

    SpringCloud Nacos 作为Config配置中心,SpringCloud Nacos 配置动态更新

    ================================

    ©Copyright 蕃薯耀 2021-03-29

    https://www.cnblogs.com/fanshuyao/

    一、SpringCloud Nacos 概述
    Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
    使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。

    官方地址:

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

    官方文档:

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

    Spring官方文档:

    https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html


    二、SpringCloud Nacos 下载安装启动
    见:

    https://www.cnblogs.com/fanshuyao/p/14577910.html

    三、SpringCloud Nacos 作为服务注册发现中心
    见:

    https://www.cnblogs.com/fanshuyao/p/14577910.html

    官方文档:

    https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery

    四、SpringCloud Nacos 作为Config配置中心
    官方中文文档:

    https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html#_spring_cloud_alibaba_nacos_config

    英文文档:

    https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_config

    Nacos1.4.1报错: longPolling error ,java.util.concurrent.RejectedExecutionException 解决方案:

    https://www.cnblogs.com/fanshuyao/p/14572830.html

    SpringCloud Nacos 作为Config配置中心步骤:

    1、pom.xml文件引入依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version><!-- Hoxton.SR10 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <dependency>
                        <groupId>com.alibaba.cloud</groupId>
                        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                        <version>2.2.5.RELEASE</version><!-- 当Nacos的版本为:1.4.1,必须使用2.2.5.RELEASE版本,不然Nacos配置在第一次更新后会报错,后面再也更新不了,因为版本不一致导致的 -->
                        <type>pom</type>
                        <scope>import</scope>
              </dependency>
    
        </dependencies>
    </dependencyManagement>

    2、添加bootstrap.properties配置文件

    bootstrap文件优先级高于application.properties
    注意(都是官方文档说的):
    (1)必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
    (2)${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。

    具体内容是:

    #必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
    #${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。
    
    #bootstrap.properties,bootstrap文件优先级高于application.properties
    
    #spring.devtools.restart.enabled=false
    
    spring.profiles.active=dev
    server.port=8805
    
    spring.application.name=SPRING-CLOUD-NACOS-CONSUMER
    
    #配置nacos服务地址,通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
    #单机配置:127.0.0.1:8848
    #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    
    #服务提供者的服务名,接口调用需要用到
    my.nacos.service.name=SPRING-CLOUD-NACOS-SERVICE
    
    #配置中心,相关配置
    #配置文件的后缀,默认值是:properties,可以配置成:yaml
    spring.cloud.nacos.config.file-extension=properties
    #配置文件更新的服务地址
    #单机配置:127.0.0.1:8848
    #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    #完全关闭 Nacos Config 的自动化配置
    #spring.cloud.nacos.config.enabled=false
    
    #DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP
    
    #DataId匹配模式
    #Nacos DataId的格式:
    #${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
    #${spring.profiles.active}不为空时:${spring.application.name}-${spring.profiles.active}.${file-extension:properties}
    #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER-dev.properties
    #若spring.application.name=myconfig,且无spring.profiles.active配置,则Nacos服务配置的DataId就是:myconfig.properties
    
    #指定特定的DataId配置文件
    #从默认的组DEFAULT_GROUP取配置名为aaa.properties进行更新
    #如果设置了组:spring.cloud.nacos.config.group,则在Nacos服务配置时,Group属性就必须一致
    #spring.cloud.nacos.config.name=aaa.properties
    
    #Group匹配模式:
    #当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有配置组,就是从默认组取
    spring.cloud.nacos.config.group=mygroup
    
    #命名空间(namespace)模式
    #Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
    #在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
    #在命名空间管理,新增自定义命名空间:dev,命名空间ID不用填写,自动生成,保存后把命名空间ID复制,赋值给spring.cloud.nacos.config.namespace
    #匹配方式是:
    #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER.properties,而命名空间的名称就是dev,和spring.profiles.active配置一致
    #spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7
    
    #配置的优先级
    #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 配置
    
    #服务端如何开启鉴权
    #当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问
    #服务注册中心、服务配置中心的同时配置的账号和密码
    #spring.cloud.nacos.username=nacos
    #spring.cloud.nacos.password=nacos
    #服务注册中心配置的账号和密码:
    #spring.cloud.nacos.discovery.username=nacos
    #spring.cloud.nacos.discovery.password=nacos
    #服务配置中心的账号和密码:
    #spring.cloud.nacos.config.username=nacos
    #spring.cloud.nacos.config.password=nacos
    #配置如下:
    #spring.cloud.nacos.username=nacos
    #spring.cloud.nacos.password=nacos
    
    
    #测试配置的值
    config.text=1

    3、application.properties配置文件修改

    测试bootstrap文件优先级高于application.properties,application.properties配置的属性,会覆盖bootstrap.properties的属性,因为bootstrap.properties先加载。

    #测试配置的值
    config.text=application.properties-1


    4、启动类
    加上@EnableDiscoveryClient注解

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
     *
     */
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringCloud8805NacosWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloud8805NacosWebApplication.class, args);
        }
    
    }

    5、Controller请求类
    加上@RefreshScope,实现Nacos配置文件的动态刷新,不加不会刷新。
    @RefreshScope不能配置在启动类上,无效果。
    @RefreshScope作用域是:ElementType.TYPE, ElementType.METHOD

    实现配置文件:config.text=xxx的动态更新

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import com.lqy.springCloud.Result;
    
    //@RefreshScope:实现Nacos配置文件的动态刷新,不能配置在启动类上,无效果,作用域是:ElementType.TYPE, ElementType.METHOD
    @RefreshScope
    @RestController
    @RequestMapping("/web")
    public class WebController {
    
        @Value("${config.text}")
        private String configText;
        
        
        @RequestMapping(value="/config", produces = MediaType.APPLICATION_JSON_VALUE)
        public Result config() {
            return Result.ok(configText);
        }
    
    }

    五、SpringCloud Nacos Config配置中心动态更新

    1、启动Nacos Server
    在bin路径(D:soft acos-server-1.4.1 acosin)打开cmd命令窗口,输入下面的命令启动:

    startup.cmd -m standalone

    2、浏览器打开Nacos Server控制台

    http://127.0.0.1:8848/nacos

    登录名:nacos
    密码:nacos

    3、配置管理
    展开【配置管理】,点击【配置列表】,在最右边有一个加号的添加按钮,添加相应的配置


    六、项目实现配置文件动态刷新,bootstrap.properties增加配置

    #配置文件的后缀,默认值是:properties,可以配置成:yaml
    spring.cloud.nacos.config.file-extension=properties
    
    #配置文件更新的服务地址
    #单机配置:127.0.0.1:8848
    #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848

    七、SpringCloud Nacos Config配置DataId配置规则

    DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP

    1、支持DataId匹配模式的配置
    Nacos DataId的格式:

    ${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
    ${spring.profiles.active}不为空时:${spring.application.name}-${spring.profiles.active}.${file-extension:properties}

    具体示例:
    若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER-dev.properties
    若spring.application.name=myconfig,且无spring.profiles.active配置,则Nacos服务配置的DataId就是:myconfig.properties

    指定特定的DataId配置文件
    从默认的组DEFAULT_GROUP取配置名为aaa.properties进行更新
    如果设置了组:spring.cloud.nacos.config.group,则在Nacos服务配置时,Group属性就必须一致

    spring.cloud.nacos.config.name=aaa.properties


    2、支持自定义 Group 的配置

    当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有自定义组,就是从默认组取

    spring.cloud.nacos.config.group=mygroup

    3、支持自定义 namespace 的配置

    Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
    在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
    在命名空间管理,新增自定义命名空间:dev,命名空间ID不用填写,自动生成,保存后把命名空间ID复制,赋值给spring.cloud.nacos.config.namespace
    匹配方式是:
    若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER.properties,而命名空间的名称就是dev,和spring.profiles.active配置一致

    spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7


    4、支持自定义扩展的 Data Id 配置
    Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:

    spring.application.name=opensource-service-provider
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    
    # config external configuration
    # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
    spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
    
    # 2、Data Id 不在默认的组,不支持动态刷新
    spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
    spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
    
    # 3、Data Id 既不在默认的组,也支持动态刷新
    spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
    spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
    spring.cloud.nacos.config.ext-config[2].refresh=true

    可以看到:
    通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
    通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
    通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

    注意:
    多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
    spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。
    此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
    通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

    5、配置的优先级
    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 配置


    八、完全关闭 Nacos Config 的自动化配置
    通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

    spring.cloud.nacos.config.enabled=false


    九、Nacos Config Starter 更多的配置项信息

    spring.cloud.nacos.config.server-addr
    服务端地址
    Nacos Server 启动监听的ip地址和端口
    
    spring.cloud.nacos.config.name
    配置对应的 DataId
    先取 prefix,再去 name,最后取 spring.application.name
    
    spring.cloud.nacos.config.prefix
    配置对应的 DataId
    先取 prefix,再去 name,最后取 spring.application.name
    
    spring.cloud.nacos.config.encode
    配置内容编码
    读取的配置内容对应的编码
    
    spring.cloud.nacos.config.group
    GROUP
    默认是:DEFAULT_GROUP,配置对应的组
    
    spring.cloud.nacos.config.fileExtension
    文件扩展名
    默认是:properties,配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
    
    spring.cloud.nacos.config.timeout
    获取配置超时时间
    默认是:3000,客户端获取配置的超时时间(毫秒)
    
    spring.cloud.nacos.config.endpoint
    接入点
    地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
    
    spring.cloud.nacos.config.namespace
    命名空间
    常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
    
    spring.cloud.nacos.config.accessKey
    AccessKey,当要上阿里云时,阿里云上面的一个云账号名
    
    spring.cloud.nacos.config.secretKey
    SecretKey,当要上阿里云时,阿里云上面的一个云账号密码
    
    spring.cloud.nacos.config.contextPath
    Nacos Server 对应的 context path,Nacos Server 对外暴露的 context path
    
    spring.cloud.nacos.config.clusterName
    集群,配置成Nacos集群名称
    
    spring.cloud.nacos.config.sharedDataids
    共享配置,共享配置的 DataId, "," 分割
    
    spring.cloud.nacos.config.refreshableDataids
    共享配置动态刷新,共享配置中需要动态刷新的 DataId, "," 分割
    
    spring.cloud.nacos.config.extConfig
    自定义 Data Id 配置,属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh


    十、Nacos服务端开启鉴权
    当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问

    服务注册中心、服务配置中心的同时配置的账号和密码(已经验证)

    spring.cloud.nacos.username=nacos
    spring.cloud.nacos.password=nacos

    仅服务注册中心配置的账号和密码(未验证):

    #spring.cloud.nacos.discovery.username=nacos
    #spring.cloud.nacos.discovery.password=nacos

    仅服务配置中心的账号和密码(未验证):

    #spring.cloud.nacos.config.username=nacos
    #spring.cloud.nacos.config.password=nacos

    十一、Nacos Config 对外暴露的 Endpoint
    Nacos Config 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacos-config。

    Endpoint 暴露的 json 中包含了三种属性:
    Sources: 当前应用配置的数据信息
    RefreshHistory: 配置刷新的历史记录
    NacosConfigProperties: 当前应用 Nacos 的基础配置信息

    (时间宝贵,分享不易,捐赠回馈,^_^)

    ================================

    ©Copyright 蕃薯耀 2021-03-29

    https://www.cnblogs.com/fanshuyao/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    线程安全和非线程安全
    spring MVC和hibernate的结合
    Spring学习笔记1——基础知识 (转)
    bitset && Luogu 3674 小清新人渣的本愿
    luogu P3452 [POI2007]BIU-Offices
    每日刷题记录
    Codeforces Round #721 (Div. 2) B2. Palindrome Game (hard version)
    2019湘潭邀请赛A
    2021CCPC浙江省赛 B
    Codeforces Round #720 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14581381.html
Copyright © 2011-2022 走看看