nacos(五): 读取nacos配置并实现动态刷新

接上回《nacos(四): 创建第一个消费者Conumer(单体)》,这一篇将介绍如何读取nacos中的配置,并实现动态刷新。

首先,需要先引入spring-cloud-starter-alibaba-nacos-config

复制代码
<?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.nacos</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</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>
            <version>2.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.5</version>
        </dependency>

        <!-- 动态配置 -->
\<dependency\>
\<groupId\>com.alibaba.cloud\</groupId\>
\<artifactId\>spring-cloud-starter-alibaba-nacos-config\</artifactId\>
\<version\>2021.0.5.0\</version\>
\</dependency\>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.nacos.springboot.SpringbootApplication</mainClass>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

在一个步骤中,同样需要注意版本的适配。版本不合适,会报出各种各样的错误。

第二步:在application.yml中进行配置

复制代码
server:
  port: 8085


spring:
config: import: - nacos:nacos-config-sample.properties?refreshEnabled=true ##- classpath:extra-config.yml
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
config: server-addr: 127.0.0.1:8848 username: nacos password: nacos namespace: public

    loadbalancer:
      nacos:
        enabled: true

  application:
    name: product1

其中,有以下几点需要注意:

  1. spring.nacos.import这一项是新版本要求的,如果没有配置这项配置启动时有相应报错;

  2. spring.nacos.import配置中nacos-config-sample.properties,是nacos的dataId;

  3. 配置文件中的refreshEnabled=true参数,是为了让项目中的配置能随着nacos进行同步更新。

附,当前博主的实验nacos配置项如下:

第三步:在代码中读取配置

复制代码
@RestController
@RefreshScopepublic class RemoteConfig {

    @Value("${remote.name}")
    private String name;

    @GetMapping("/readconfig")
    public String ReadConfig(){
        return this.name;
    }
}

其中@RefreshScope是为了配合第二步refreshEnabled=true,实现配置随nacos同步更新(即nacos配置重新发布时,本地会立即同步更新)。

到这里nacos的配置的读取与同步更新已完成,下一篇我们将一起讨论如何创建多模块版本的生产者与消费者: )