分布式配置中心Nacos

一、Nacos分布式配置中心

1、使用分布式配置中心的优点

  1. 支持配置文件的动态更新:在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
  2. 支持配置集中式管理:在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
  3. 支持多环境部署:如果通过底层框架来维护不同环境的信息,则成本也是非常高的。

2、Nacos配置中心和应用间的数据同步的三种模式

  1. Pull模式:让应用开后长轮询,即定时地从配置中心拉取最新的配置信息,并更新到应用的内存中。

    长轮询:一般由客户端向服务器发出一个设置较长的网络超时时间的HTTP请求,并在HTTP连接超时前,不主动断开连接;待客户端超时或有数据返回后,再次建立一个同样的HTTP请求,重复以上过程。即会持续与服务器建立连接。

  2. Push模式:在配置中心的配置数据变更之后,主动推送配置数据到指定的应用,应用更新到本地内存中。

  3. 混合模式:应用和配置中心通过“事件机制+监听器”模式保持长连接。如果应用监听的配置信息发生了变化,则配置中心发布对应类型的事件。应用只有在监听到该事件之后,才会处理对应的配置信息,并更新到应用本地。

3、Namespace命名空间

  1. 在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境。
  2. 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认namespace=public的保留空间,不支持删除;默认情况下。
  3. Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod等。
    即Nacos组件Namespace命名空间的主要作用是多环境下的配置隔离和管理
  4. 在命名空间中创建不同的部署环境
    在这里插入图片描述
  5. 在配置列表中切换不同的命名空间(部署环境)
    在这里插入图片描述

4、DataID配置

  1. Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
    在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。
  2. DataID的拼接格式:prefix - spring.profiles.active . file-extension
    1)prefix:默认为 spring.application.name 的值。
    2)spring.profiles.active:即为当前环境对应的 profile。
    3)file-extension:文件后缀
  3. 当activeprofile为空时。DataID的拼接格式:prefix . file-extension
  4. 在配置列表中点击右上角的+号,即可新建配置,将application.yml文件中的配置复制到上面即可。
    在这里插入图片描述

5、Group配置

  1. Nacos中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串对配置集进行分组,从而区分Data ID相同的配置集。当您在 Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。
  2. 通过Group实现环境区分
    在这里插入图片描述
    即不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中。

二、Nacos分布式配置中心的使用

1、将应用对接Nacos配置中心

  1. 在父工程中,右键创建新模块cloud-nacos-config3344
    在这里插入图片描述

  2. 在cloud-nacos-config3344中,添加如下依赖

    <dependencies>
        <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>
        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    
  3. 在cloud-nacos-config3344中,创建主启动类NacosConfigMain3344

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 主启动类
     */
    @SpringBootApplication
    @Slf4j
    @EnableDiscoveryClient
    public class NacosConfigMain3344 {
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigMain3344.class,args);
            log.info("*********  NacosConfigMain3344 启动成功  *********");
        }
    }
    
    
  4. 在cloud-nacos-config3344中,创建ConfigController

    package com.zzx.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/nacos")
    public class ConfigController {
    
        @Value("${nacos.config}")
        private String config;
        @GetMapping("/config")
        public String config(){
            return config;
        }
    }
    
    
  5. 在cloud-nacos-config3344的resources中,创建bootstrap.yml

    server:
      port: 3344
    
    
    spring:
      application:
        name: nacos-config
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.126.32:8848
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  6. 在Nacos中新建一个配置nacos-config-dev.yaml,用来测试是否能从nacos中拉取配置
    在这里插入图片描述

  7. 启动NacosConfigMain3344,在浏览器访问:http://localhost:3344/nacos/config
    在这里插入图片描述

2、Nacos实现配置动态刷新@RefreshScope

  1. 即在对应Controller类上面添加上一个@RefreshScope
    此时在ConfigController类上面添加上一个@RefreshScope
  2. 重启该项目,然后在Nacos上面修改配置信息
    在这里插入图片描述
  3. 在浏览器测试,动态刷新是否生效:http://localhost:3344/nacos/config
    在这里插入图片描述

3、Dubbo服务对接分布式配置中心

  1. 将duubo服务的消费者和生产者的application.yml文件,配置到nacos中,然后将application.yml文件删除。
    在这里插入图片描述

  2. 在cloud-dubbo-consumer-order80的resources中,创建bootstrap.yml文件,配置nacos即可

    spring:
      main:
        allow-bean-definition-overriding: true
        allow-circular-references: true
      application:
        name: order-consumer-dubbo
      cloud:
        nacos:
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  3. 在cloud-dubbo-provider-payment8001的resources中,创建bootstrap.yml文件,配置nacos即可

    spring:
      main:
        allow-bean-definition-overriding: true
        allow-circular-references: true
      application:
        name: payment-provider-dubbo
      cloud:
        nacos:
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  4. 在cloud-dubbo-consumer-order80的POM文件中,再添加如下依赖

    <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
  5. 在cloud-dubbo-provider-payment8001的POM文件中,再添加如下依赖

    <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
  6. 只需要启动dubbo的生产者和消费者服务即可测试
    在这里插入图片描述

三、搭建Nacos集群

1、Nacos集群介绍

  1. 默认Nacos使用嵌入式数据库Derby实现数据的存储。如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
  2. Nacos支持三种部署模式
    1)单机模式 - 用于测试和单机试用。
    2)集群模式 - 用于生产环境,确保高可用。
    3)多集群模式 - 用于多数据中心场景。

2、Nacos使用MySQL实现数据持久化

  1. 在虚拟机中使用Docker容器快速搭建MySQL:docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

  2. 在navicat中连接该MySQL数据库
    在这里插入图片描述

  3. 新建一个数据库nacos
    在这里插入图片描述

  4. 因为Nacos是使用Docker容器部署的
    1)进入到Nacos容器中:docker exec -it nacos bash
    2)进入到Nacos的conf目录中:cd conf
    3)查看mysql-shema.sql:cat mysql-schema.sql
    4)在刚刚创建的nacos数据中新建查询,将结果复制到上面,执行运行即可
    在这里插入图片描述
    5)成功之后就会出现这些表
    在这里插入图片描述

  5. 修改nacos的配置文件
    1)将nacos的配置文件进行备份:cp application.properties application.properties.bak
    2)修改配置文件:vim application.properties

    spring.datasource.platform=mysql
    db.num=${MYSQL_DATABASE_NUM:1}
    db.url.0=jdbc:mysql://192.168.126.32:${MYSQL_SERVICE_PORT:3306}/nacos?${MYSQL_SEERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&auttoReconnect=true&useSSL=false}
    db.user.0=root
    db.password.0=123456
    
    

3)重启nacos:docker restart nacos,可能需要等几分钟才能访问,然后配置用MySQL数据库进行集中存储后,会直接从存储在Derby嵌入式数据库,改成存储在MySQL数据库中。
在这里插入图片描述

3、Docker搭建Nacos集群及配置

  1. 使用Docker创建三个Nacos,使用不同的端口号,模拟搭建Nacos集群(确保mysql已经启动)
    1)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e NACOS_APPLICATION_PORT=8848 -p 8848:8848 -p 9848:9848 -p 9849:9849 --name nacos1 --restart=always nacos/nacos-server:v2.2.0
    2)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e NACOS_APPLICATION_PORT=8858 -p 8858:8858 -p 9858:9858 -p 9859:9859 --name nacos2 --restart=always nacos/nacos-server:v2.2.0
    3)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e NACOS_APPLICATION_PORT=8868 -p 8868:8868 -p 9868:9868 -p 9869:9869 --name nacos3 --restart=always nacos/nacos-server:v2.2.0

  2. 重启nacos2、nacos3:docker restart nacos2/3,浏览器访问8848、8858、8868端口的nacos服务
    在这里插入图片描述

4、使用Nginx作为负载均衡访问Nacos集群

  1. 安装Nginx环境:yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel

  2. 下载nginx:http://nginx.org/download/nginx-1.22.1.tar.gz

  3. 将nginx通过mobax上传到/opt目录下,解压到/usr/local目录中:tar -zxvf /opt/nginx-1.22.1.tar.gz -C /usr/local

  4. 安装Nginx:
    1)检查生成.md文件:/usr/local/nginx-1.22.1/configure
    2)编译安装nginx:make && make install

  5. 修改nginx.conf文件:vim /usr/local/nginx/conf/nginx.conf

    #定义upstream名字,下面会引用
    upstream  nacos{  
        #指定后端服务器地址
        server 192.168.126.32:8848;    
        server 192.168.126.32:8858; 
        server 192.168.126.32:8868;   
    }
     
    server {
     listen 80;
     server_name localhost;
     location / {
       proxy_pass http://nacos;    #引用upstream
      }
    }
    
  6. 启动nginx:/usr/local/nginx/sbin/nginx

  7. 在浏览器访问nginx:http://192.168.126.32/nacos
    在这里插入图片描述

总结

  1. 即Namespace可以实现部署环境的区分,而DataID可以实现微服务的区分,而Group可以将多个微服务归属于同一个组。
  2. SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。也就是说从nacos拉取配置后,bootstrap.yml配置会被application.yml的相同配置覆盖掉。即低优先级覆盖高优先级。
  3. SpringCloudConfig需要启动Config服务,而Nacos不需要启动Nacos,直接配置即可。但是需要每个项目都引入Nacos的Config依赖。即SpringCloudConfig是作为一个微服务注册到Eureka中,由其他微服务去间接调用,但是Nacos的Config是每个微服务都可以直接配置调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值