配置中心 Nacos 简介、入门 拉取远程配置和动态刷新配置功能介绍

简介

Nacos有注册中心和配置中心的功能,先单独介绍配置中心。

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

​ Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。Nacos 的获取和启动方式可以参考 Nacos 官网

问题

项目集成

Nacos Config 引入的方式同样也有两种,即 Aliyun Java Initializr 引入和Maven pom.xml 依赖。官方推荐使用 Aliyun Java Initializr 方式引入 Nacos Config,以便简化组件之间的依赖关系。

Pom.xml 示例

<?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.laker</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config</name>
    <description>Demo project for Spring Boot</description>

    <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.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <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-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.laker.config.ConfigApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

启动Nacos Server

参考解决Nacos Server国内下载速度缓慢的问题下载启动

用户名密码默认都是:nacos

Nacos Server添加配置

  • Nacos Server配置
  • bootstrap.yml配置
  • 代码配置

整体如下图:

在这里插入图片描述

常用功能介绍

仅描述如何使用,原理参考后面文章。

使用 Nacos Config 作为 Spring Cloud 分布式配置

启动类

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

配置类

@RestController
@RequestMapping("/config")
public class ConfigController {
    
    

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

    @RequestMapping("/get")
    public String get() {
    
    
        return lakerName;
    }
}

验证

浏览器访问:http://ip:port/config/get.

使用 Nacos Config 实现 Bean 动态刷新

​ Nacos Confg 支持标准 Spring Cloud @ RefreshScope特性,即应用订阅某个Nacos 配置后,当配置内容变化时,Refresh Scope Beans 中的绑定配置的属性将有条件的更新。所谓的条件是指 Bean 必须:

  • 必须条件:Bean 的声明类必须标注 @RefreshScope
  • 二选一条件
    • 属性(非 static 字段)标注 @Value
    • @ConfigurationProperties Bean

​ 除此之外,Nacos Confg 也引入了 Nacos Client 底层数据变化监听接口,
即 com.alibaba.nacos.api.config.listener.Listener。下面的内容将分别讨论这三种不同
的使用场景。

Nacos Client:Nacos 客户端 API,也是 Nacos Config 底层依赖

Bean @Value 属性动态刷新

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
    
    

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

    @RequestMapping("/get")
    public String get() {
    
    
        return lakerName;
    }

    @PostConstruct
    public void init() {
    
    
        System.out.printf("---[init]--- laker name : %s ", lakerName);
    }
}

@ConfigurationProperties Bean属性动态刷新

  • 激活 @ConfigurationProperties Bean @EnableConfigurationProperties(
    User.class)。
  • 通过 @Autowired 依赖注入 User Bean。
@RefreshScope
@ConfigurationProperties(prefix = "laker")
public class User {
    
    
    private String name;
    private int age;
}

启动类

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

使用 Nacos g Config 监听实现 Bean 属性动态刷新

​ 前文曾提及 com.alibaba.nacos.api.config.listener.Listener 是 Nacos ClientAPI 标准的配置监听器接口,由于仅监听配置内容,并不能直接与 Spring 体系打通,因此,需要借助于 Spring Cloud Alibaba Nacos Config API NacosConfigManager

@SpringBootApplication
public class NacosConfigSampleApplication {
    
    
    @Autowired
    private NacosConfigManager nacosConfigManager;

    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosConfigSampleApplication.class, args
        );
    }
    @Bean
    public ApplicationRunner runner() {
    
    
        return args -> {
    
    
            String dataId = "laker-dev.yaml";
            String group = "DEFAULT_GROUP";
            nacosConfigManager.getConfigService().addListener(dataId, group, new
                    AbstractListener() {
    
    
                        @Override
                        public void receiveConfigInfo(String configInfo) {
    
    
                            System.out.println("[Listener] " + configInfo);
                        }
                    });
        };
    }
}

[Listener] laker:
  name: laker1222222

参考:

  • Spring Cloud Alibaba从入门到实战.pdf
伸手党福利:Spring Cloud Alibaba从入门到实战.pdf 下载

关注我的公众号【Java大厂面试官】,回复:100 即可下载

本系列目录

猜你喜欢

转载自blog.csdn.net/abu935009066/article/details/112667479