• SpringCloud Nacos 配置中心


     动态配置,不用重新启动项目

    在云端设置一套配置信息,所有的项目都读取这一套配置

    1.专业名词解释

      Namespace:代表不同环境,如开发、测试、生产环境。
      Group:代表某项目,如XX医疗项目、XX电商项目
      DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件

    namespace:相当于环境,开发环境  测试环境  生产环境 ,每个空间里面的配置是独立的 (默认是 public)

    group:这个类似我们的项目,比如 风控系统 ,交易系统, 就是不同的项目

     2.配置获取的步骤如下

     配置中心的启动相关配置,如group,server-addr 是从application.yml中读取的

     3.项目实践

      实现效果 dev/pro 不同命名空间下,对某个项目(组) 读取开发环境、生产环境的数据库信息

      3.1 创建一个新的Maven子项目  cloud-config-nacos-client3377

        3.1.1 pom.xml 引入关键依赖 因为要连接数据库

    <dependencies>
            <!--公共项目-->
            <dependency>
                <groupId>ins.cloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
    
            <!--nacos-config 配置中心-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
            <!--nacos-discovery 注册中心-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- Fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
            </dependency>
    
        </dependencies>

        3.1.2 resources文件夹下新建 bootstrap.yml

           3.1.2.1  使用 bootstrap.yml ;该配置文件优先级高于 application

           3.1.2.2 Namespace必须在bootstrap.yml配置文件中指定,否则不生效。

           

          3.1.2.3 application.yml 

    spring: 
      profiles: 
        active: dev

          3.1.2.4 bootstrap.yml 

    server:
    port: 3377

    spring:
    application:
    name: @project.artifactId@
    profiles:
    active: dev
    cloud:
    nacos:
    # Nacos 认证用户
    username: nacos
    # Nacos 认证密码
    password: nacos
    discovery:
    #服务注册中心地址
    server-addr: ${NACOS_HOST:82.156.175.242}:${NACOS_PORT:8848}
    config:
    #配置中心地址
    server-addr: ${spring.cloud.nacos.discovery.server-addr}
    #指定yaml格式的配置(yml和yaml都可以)
    file-extension: yaml
    #指定命名空间 开发工作空间
    namespace: f2475b83-0fa8-42c4-acf0-1c64875cce92
    #指定组
    group: MES_DEV_GROUP

       -- yml文件中${}的使用

        ${key:default_value} 这种表达方式是通过key来获取value,如果获取不到就使用后面默认值。

        可以在jar包启动的时候 指定key

       -- 读取pom文件中的配置  @artifactId@

          -- 解决问题:SpringBoot中application.yml无法使用@@读取pom.xml中标签值 

            父级项目中配置

    <build>   
    <!--如果不设置resource 会导致application.yml中的@@找不到pom文件中的配置-->    
        <resources>       
            <resource>            
                <directory>src/main/resources</directory>
                <filtering>true</filtering>        
            </resource>    
        </resources>
    </build>

     

        3.1.3 启动类 

    @EnableDiscoveryClient
    @SpringBootApplication
    public class NacosConfigClientMain3377{
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigClientMain3377.class, args);
        }
    }

        3.1.3 业务类:ConfigClientController

    @RestController
    @RefreshScope   //通过SpringCould原生注解@RefreshScope实现配置自动更新
    public class ConfigClientController{
        @Value("${config.info}") //对应nacos配置:nacos-config-client-dev.yaml
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    // 数据库查询接口

         通过SpringCould原生注解@RefreshScope实现配置自动更新

         参考2

      3.2 nocos图形化操作

        3.2.1 新建两个命名空间,记住命名空间ID配置中会用到

                           

        3.2.2 DataId 说明

          

          公式: ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

          

          项目名-当前环境对应的profile.数据格式

       3.2.3 nacos 中配置项目的连接池,mysql的连接信息等信息

        

    spring:
      datasource:
         druid:
            url: jdbc:mysql://ip:3306/tsbx_cloud?Timezone=UTC&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useServerPrepStmts=true&cachePrepStmts=true&useSSL=false
            username: root
            password: tsbx8888
            
            max-wait: 10000
            min-idle: 5
            initial-size: 5
            max-active: 100
            web-stat-filter:
              enabled: false
    
      devtools:
         add-properties: false   
         
    management:
      endpoints:
        web:
          exposure:
            include: '*'
            
    
    mybatis:
      mapperLocations: classpath:/mapper/*/*.xml
      #实体类所在的包,配置号后mapper.xml不需要写实体类的完整路径
      #type-aliases-package: com.atguigu.springcloud.entities
    
    config:
      info: nacos-config-client-dev.yaml正式
    nacos配置

      

    4. 历史配置:Nacos会记录配置文件的历史版本默认保留30

    5.多环境的配置

      5.1 springboot 多环境配置 

        spring cloud用上了配置中心,配置中心就会默认只读取bootstrap.yml,配置中心的启动相关配置,如group,server-addr

      5.2 nacos配置中心多环境配置

      5.3 Nacos(五):多环境下如何“读取”Nacos中相应的配置 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 (没看懂) 

       5.2 思路: 通过配置父pom ,子项目 bootstrap.yml文件中读取父项目的pom 

        5.2.1 父项目 pom文件的配置

        <build>
            <!--如果不设置resource 会导致yml中的@@找不到pom文件中的配置-->
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.4.1</version>
                    <!-- 解决 jar包中没有主清单属性的问题-->
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                    <!--热部署工具-->
                    <configuration>
                        <fork>true</fork>
                        <addResources>true</addResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <!-- 环境 -->
        <profiles>
            <!--开发-->
            <profile>
                <id>dev</id>
                <activation>
                    <!-- 默认激活配置 -->
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <!--当前环境-->
                    <profile.name>dev</profile.name>
                    <!--配置文件前缀-->
                   <!-- <prefix.name>mes</prefix.name>-->
                    <!--Nacos配置中心地址-->
                    <config.server-addr>82.156.175.242</config.server-addr>
                    <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
                    <config.namespace>f2475b83-0fa8-42c4-acf0-1c64875cce92</config.namespace>
                    <!--Nacos配置分组名称-->
                    <config.group>MES_DEV_GROUP</config.group>
                    <!--Nacos服务发现地址-->
                    <discovery.server-addr>82.156.175.242</discovery.server-addr>
                </properties>
    
            </profile>
    
            <!--生产-->
            <profile>
                <id>prod</id>
                <properties>
                    <!--当前环境-->
                    <profile.name>prod</profile.name>
                    <!--配置文件前缀-->
                    <!-- <prefix.name>mes</prefix.name>-->
                    <!--Nacos配置中心地址-->
                    <config.server-addr>82.156.175.242</config.server-addr>
                    <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
                    <config.namespace>52319686-40f5-4725-9746-a29b0275f3db</config.namespace>
                    <!--Nacos配置分组名称-->
                    <config.group>MES_PROD_GROUP</config.group>
                    <!--Nacos服务发现地址-->
                    <discovery.server-addr>82.156.175.242</discovery.server-addr>
                </properties>
    
            </profile>
        </profiles>

        5.2.2 子项目中bootstrap.yml 通过@XX@ 读取 父项目pom文件中配置信息

    server:
      port: 3377
    
    spring:
      application:
        name: @project.artifactId@
      profiles:
        active: @profile.name@
      cloud:
        nacos:
          # Nacos 认证用户
          username: nacos
          # Nacos 认证密码
          password: nacos
          discovery:
            #服务注册中心地址
            server-addr: @discovery.server-addr@
          config:
            #配置中心地址
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            #指定yaml格式的配置(yml和yaml都可以)
            file-extension: yaml
            #指定命名空间 开发工作空间
            namespace:  @config.namespace@
            #指定组
            group: @config.group@

      5.x 多环境 启动和打包 选择

                  

     6.nacos 共享配置

       6.1 Nacos(七):Nacos共享配置

       6.2 当前环境 > 共享环境 》本地环境

      6.3 实操 bootstrap.yml 添加共享配置信息,多个 配置文件 用逗号隔开

        

      6.4 Nacos 新建配置 dev/prod 环境下 所有的 项目共享

        

       

     7.多环境打jar包启动   spring-boot-maven-plugin:没有主清单程序

     

       解决方法:父项目pom.xml 在引入该插件的标签内加上 <executions> 标签

        <build>
            <!--如果不设置resource 会导致yml中的@@找不到pom文件中的配置-->
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.4.1</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <fork>true</fork>
                        <addResources>true</addResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>

    8. 公共依赖项目 install IDEA打包出现Unable to find main class

      解决方法 在pom.xml中加入以下配置: 目前其他子模块是没有引入maven插件的

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.4.1</version>
                    <configuration>
                        <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                    </configuration>
                    <executions>
                        <execution>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

    9. jar包在本地启动的时候报错 需要指定编码格式 且要使用cmd 不能用powershell

      9.1  parse data from Nacos error,dataId

    1. 分析原因,nacos读取配置文件默认使用UTF-8,通过cmd启动项目,项目默认编码格式为GBK,导致问题出现
    2. 解决办法:添加启动参数-Dfile.encoding=utf-8 ,则能正常启动并读取远程配置

        java -Dfile.encoding=utf-8 -jar test.jar

     

       9.2 使用powershell 打开 找不到或无法加载主类 .encoding=utf-8 解决

        解决办法: 使用cmd 进行打开

     
     
     

     10.读取yml文件 进行debug 源码调试

     

       10.1 进入  com.alibaba.cloud.nacos.client.NacosPropertySourceLocator#loadApplicationConfiguration  这个方法

         

      10.2 com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder#loadNacosData

        

       看看请求com.alibaba.nacos.client.config.http.ServerHttpAgent#httpGet

     
     
     
     
     
     
     
     
     
     
     

     

     
     
     
     
     
     
     
     

     
  • 相关阅读:
    YARN架构设计详解
    HDFS文件上传
    HDFS Namenode启动过程
    (转)计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理
    (转)python之from_bytes、to_bytes
    (转)Python3入门之线程threading常用方法
    (转)Python3.5 queue模块详解
    (转) argparse — 解析命令参数和选项
    (转)Python3之pickle模块
    (转)linux用户态和内核态理解
  • 原文地址:https://www.cnblogs.com/nextgg/p/16135327.html
Copyright © 2020-2023  润新知