目录

1. SpringCloud Config

2. Nacos_Config

3. 使用 Nacos Config 添加/配置 外部配置文件

3.1 添加/配置命名空间

3.2 添加/配置 外部配置文件

3.3 外部文件克隆到其他空间

4. 新建子模块【config_client】

4.1 父模块pom文件依赖结构

         4.2 子模块pom文件结构

4.3 配置子模块 bootstrap.yml文件

4.4 配置子模块启动类

4.5 编写controller接口测试

4.6 启动项目测试接口

4.6.1 Nacos_config外部配置文件数据  

4.6.2 测试接口获取到的nacos_config外部配置文件数据 

4.6.3 切换命名空间 



1. SpringCloud Config

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_java


微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大 量的服务。


由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。 Spring Cloud 提供了 ConfigServer来解决这个问题.


Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服 务应用的所有环境提供了一个中心化的外部配置。


SpringCloud Config 分为服务端和客户端两部分。 


springcloud nacos如何实现数据源动态刷新 springcloud nacos config_java_02

服务端也称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置 信息,加密/解密 信息等访问接口。


客户端则是通过制定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心 获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并 且可以通过git客户端工具来方便的管理和访问配置内容。


springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_03

 一个使用微服务架构的应用系统可能会包括成百上千个微服务,配置各部相同,需求各不相同:

  • 不同环境不同配置:例如数据源在不同的环境(开发,测试,生产)是不同的,可以通过配置中心
  • 运行期间可以动态调整。例如根据各个微服务的负载状况,动态调整数据源连接池大小或者熔断阀 值,并且调整时不停止微服务(配置修改后可以自动更新)

2. Nacos_Config

Spring Cloud Alibaba Nacos Config Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布 式系统中的外部化配置提供服务器端和客户端支持。

使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外 部属性配置。


Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象


在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生 产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。 

3. 使用 Nacos Config 添加/配置 外部配置文件

3.1 添加/配置命名空间

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_04

 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_05

 

  • 添加完成的结构 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_06

 

3.2 添加/配置 外部配置文件

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_07

 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_08

 

  • 添加完成的结构 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_09

 

3.3 外部文件克隆到其他空间

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_10

 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_11

 

4. 新建子模块【config_client】

  • 因为小编是在父模块里面一个子模块里面完成的配置 也可以在单个模块里面完成

父模块pom文件依赖结构

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jmh</groupId>
  <artifactId>springcloud01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--pom代表这个是个父工程-->
  <packaging>pom</packaging>

  <!--指向儿子-->
  <modules>
    <module>nacos_provider</module>
    <module>nacos_consumer</module>
    <module>nacos_commons</module>
    <module>config_client</module>
  </modules>

  <name>springcloud01 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <!--提供版本-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring-boot.version>2.4.1</spring-boot.version>
    <spring-cloud.version>2020.0.0</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  </properties>

  <!--提供依赖-->
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--注册与发现-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--远程通信-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--负载均衡-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-loadbalancer</artifactId>
    </dependency>
    <!--对象赋值依赖-->
    <dependency>
      <groupId>ma.glasnost.orika</groupId>
      <artifactId>orika-core</artifactId>
      <version>1.4.6</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <!--子模块nacos_commons依赖-->
    <dependency>
      <groupId>com.jmh</groupId>
      <artifactId>nacos_commons</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <!--配置中心-->
    <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>
  </dependencies>

  <!--提供依赖版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


</project>

子模块pom文件结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jmh</groupId>
    <artifactId>config_client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config_client</name>
    <description>Demo project for Spring Boot</description>

    <!--指向父亲-->
    <parent>
        <artifactId>springcloud01</artifactId>
        <groupId>com.jmh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

配置子模块 bootstrap.yml文件

server:
  port: 8083

spring:
  application:
    # 会自动根据服务名拉取data-id对应的配置文件.如果data-id跟服务名不一致 就需要手动指定data-id
    # 跟服务名相同的data-id的配置文件,称之为默认的配置文件
    # 除了默认的配置文件,其他配置文件必须写上后缀
    name: config-client
  cloud:
    nacos:
      #注册中心
      discovery:
        server-addr: 127.0.0.1:8848
        # username: nacos
        # password: nacos
      #配置中心
      config:
        prefix: ${spring.application.name}
        #指定nacos配置中心地址
        server-addr: 127.0.0.1:8848
        file-extension: yml # 使用的 nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
        #namespace: ee98175d-fa34-4bd1-a732-e15c5cb352d6  # 使用的 nacos 的命名空间,默认为 null
        group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
        # 共享配置集数组
        shared-configs:
          - data-id: config-redis.yml
            group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
            refresh: true # 是否自动刷新配置,默认为 false

SpringBoot默认支持properties和YAML两种格式的配置文件。

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_Cloud_12

 

bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使 用来配置application.yml中使用到参数等

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_13

application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用 的公共参数等。

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_spring_14


bootstrap.yml 先于 application.yml 加载

配置子模块启动类

package com.jmh.config_client;

import lombok.Data;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@EnableDiscoveryClient
@SuppressWarnings("all")
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

    /*对象形式获取nacos配置文件里面的属性*/
    @Configuration
    @ConfigurationProperties(prefix = "email")
    @Data
    public class EmailProperties{
        private String host;
        private String port;
        private String username;
        private String userpwd;
    }

}

编写controller接口测试

package com.jmh.config_client.controller;

import com.jmh.config_client.ConfigClientApplication;
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 蒋明辉
 * @data 2022/11/6 14:05
 */
@RestController
@RefreshScope
@SuppressWarnings("all")
public class TestController {

    /*属性形式获取nacos里面配置文件的属性*/
    @Value("${redis.host}")
    private String host;
    @Value("${redis.port}")
    private String port;

    @Autowired
    private ConfigClientApplication.EmailProperties emailProperties;


    @RequestMapping("/run")
    public String email(){
        StringBuffer str=new StringBuffer();
        str.append("email:"+emailProperties);
        str.append("redis:"+host+",");
        str.append(port);
        return str.toString();
    }


}

 @RefreshScope

启动项目测试接口

  • 可测试接口获取到的外部配置文件的数据是否一致

       4.6.1 Nacos_config外部配置文件数据  

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_配置文件_15

       4.6.2 测试接口获取到的nacos_config外部配置文件数据 

 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_Cloud_16

       4.6.3 切换命名空间

  • 复制命名空间步骤 

springcloud nacos如何实现数据源动态刷新 springcloud nacos config_java_17