• SpringCloudAlibaba项目之Nacosconfig配置中心


    SpringCloudAlibaba随笔目录

    一、SpringCloudAlibaba项目之父工程搭建

    二、SpringCloudAlibaba项目之Nacos搭建及服务注册

    三、SpringCloudAlibaba项目之生产者与消费者

    四、SpringCloudAlibaba项目之Ribbon负载均衡

    五、SpringCloudAlibaba项目之OpenFeign远程调用

    六、SpringCloudAlibaba项目之Nacos-config配置中心

    七、SpringCloudAlibaba项目之Sentinel流量控制

    八、SpringCloudAlibaba项目之Seata分布式事务

    九、SpringCloudAlibaba项目之GateWay网关

    十、SpringCloudAlibaba项目之SkyWalking链路

    SpringCloudAlibaba项目之Nacos-config配置中心

    1、服务配置中心介绍

      首先我们来看一下,微服务架构下关于配置文件的一些问题:

      1、配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

      2、配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

      3、配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

      基于上面这些问题,我们就需要配置中心的加入来解决这些问题。配置中心的思路是:

    • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
    • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
    • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

      在业界常见的服务配置中心,有下面这些:

      Apollo

    Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。

      Disconf

    Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。

      SpringCloud Config

    这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。

      Nacos

    这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。
     

     

    2、Nacos-config简介

      Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
      Nacos Config就是一个类似于SpringCloud Config的配置中心。

    使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。

    官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

    Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。

    3、Client读取配置

     Nacos 服务端初始化

    1、启动Nacos Server。启动方式可见 Nacos 官网

    2、启动好Nacos之后,在Nacos添加如下的配置:

    Data ID:    service-nacosconfig.properties
    
    Group  :    DEFAULT_GROUP
    
    配置格式:    Properties
    
    配置内容:   user.name=service-nacosconfig-properties
                user.age=90

     注意:注意dataid是以 properties(默认的文件扩展名方式)为扩展名。

    客户端使用方式

    pom.xml文件添加依赖

    <!-- nacos-config 配置中心依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    创建一个标准的 Spring Boot 应用

    @SpringBootApplication
    @EnableDiscoveryClient//可加可不加,依版本而定,从Spring Cloud Edgware开始,@EnableDiscoveryClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
    public class ServiceNacosconfigApplication {
        public static void main(String[] args) {
            //SpringApplication.run(ServiceNacosconfigApplication.class, args);
            ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceNacosconfigApplication.class, args);
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :"+userName+"; age: "+userAge);
        }
    }

    在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:

    bootstrap.properties

    # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
    # Nacos认证信息,如果不加可能读取到的是电脑系统的用户名和密码
    spring.cloud.nacos.config.username=nacos
    spring.cloud.nacos.config.password=nacos
    spring.cloud.nacos.config.contextPath=/nacos
    # 设置配置中心服务端地址,必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    # Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
    # spring.cloud.nacos.config.namespace=

    注意:注意当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。

    application.properties

    # 应用名称
    #会自动根据服务名拉取dataid对应的配置文件,如果服务名和dataid不一致,就需要手动指定dataid
    spring.application.name=service-nacosconfig
    # 应用服务 WEB 访问端口
    server.port=8070
    # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
    # Nacos认证信息
    spring.cloud.nacos.discovery.username=nacos
    spring.cloud.nacos.discovery.password=nacos
    # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    # 注册到 nacos 的指定 namespace,默认为 public
    spring.cloud.nacos.discovery.namespace=public

    注意:bootstrap.properties配置文件要比application.properties文件先加载,但是两种文件是可以共同存在的,只是加载的优先级不同而已。

    一般客户端读取的配置文件根据对应的服务名称来的。

     启动这个 Example,可以看到如下输出结果:

    4、其他扩展配置

    基于 dataid 为 yaml 的文件扩展名配置方式

    spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。这个时候只需要完成以下两步:

    1、在应用的 bootstrap.properties 配置文件中显示的声明 dataid 文件扩展名。如下所示

    bootstrap.properties
    # Nacos客户端,默认是properties的文件扩展名,显示的声明 dataid 文件扩展名
    # 一旦修改成非properties格式,则必须通过file-extension进行设置
    spring.cloud.nacos.config.file-extension=yaml

    2、在 Nacos 的控制台新增一个dataid为yaml为扩展名的配置,如下所示:

    Data ID:        service-nacosconfig.yaml
    
    Group  :        DEFAULT_GROUP
    
    配置格式:        YAML
    
    配置内容:        user.name: service-nacosconfig-yaml
                    user.age: 68

    这两步完成后,重启测试程序,可以看到如下输出结果:

     支持配置的动态更新

    spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:

    @SpringBootApplication
    @EnableDiscoveryClient//可加可不加,依版本而定,从Spring Cloud Edgware开始,@EnableDiscoveryClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
    public class ServiceNacosconfigApplication {
        public static void main(String[] args) throws InterruptedException {
            //SpringApplication.run(ServiceNacosconfigApplication.class, args);
            ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceNacosconfigApplication.class, args);
            while(true) {
                //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
                String userName = applicationContext.getEnvironment().getProperty("user.name");
                String userAge = applicationContext.getEnvironment().getProperty("user.age");
                System.err.println("user name :" + userName + "; age: " + userAge);
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }

    如下所示,当变更user.name和user.age时,应用程序中能够获取到最新的值:

    提示:你可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新 

    支持自定义扩展的 Data Id 配置

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

    # 配置外部配置
    # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
    spring.cloud.nacos.config.extension-configs[0].data-id=service-config-common01.properties
    
    # 2、Data Id 不在默认的组,不支持动态刷新
    spring.cloud.nacos.config.extension-configs[1].data-id=service-config-common02.properties
    spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
    
    # 3、Data Id 既不在默认的组,也支持动态刷新
    spring.cloud.nacos.config.extension-configs[2].data-id=service-config-common03.properties
    spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
    #动态刷新
    spring.cloud.nacos.config.extension-configs[2].refresh=true  

    可以看到:

    • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。

    • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。

    • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

     提示:

      多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。

       spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

    通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

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

    # 配置支持共享的 Data Id
    spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
    # 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
    spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
    # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
    spring.cloud.nacos.config.shared-configs[0].refresh=true

    可以看到:

    • 通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置。

    • 通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。

    • 通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。

    配置的优先级

    Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

    • A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置

    • B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置

    • C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

    当三种方式共同使用时,他们的一个优先级关系是:A < B < C

    完全关闭Nacos-config配置

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

     5、@RefreshScope注解

      在 Spring Cloud 体系的项目中,配置中心主要用于提供分布式的配置管理,其中有一个重要的注解:@RefreshScope,如果代码中需要动态刷新配置,在需要的类上加上该注解就行。

    /**
     * 订单服务
     */
    @RestController
    @RequestMapping("/order")
    @RefreshScope //配置此类接口动态刷新
    public class OrderController {
    
        @Resource
        private StockOpenFeignService stockOpenFeignService;
    
        @Value("${user.name}")
        public String username;
    
        /**
         * 新增订单
         * @return
         */
        @RequestMapping("/addOrder")
        public String addOrder(){
            System.out.println("订单新增成功");
            String id = "123456";
            //调用库存扣减
            String result = stockOpenFeignService.subStock(id);
            return "订单服务-订单新增成功:" + result + " --username:" + username;
        }
    }

     访问地址:http://localhost:8070/order/addOrder

     

  • 相关阅读:
    linux下内存检测工具valgrind
    c语言可变参数与宏定义
    rabbitmq学习之路-rabbitmqctl
    linux/mac下命令行rm回收站--rmtrash
    Python之路【第十一篇】: 进程与线程理论篇
    Python之路【第十一篇】: 进程与线程
    Git常用命令
    Python之路【第十篇】: python基础之socket编程
    Python之路【第九篇】:面向对象进阶
    Python之路【第八篇】:面向对象的程序设计
  • 原文地址:https://www.cnblogs.com/qiantao/p/15730785.html
Copyright © 2020-2023  润新知