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

文章目录

    • 简介
    • 项目集成
      • Pom.xml 示例
      • 启动Nacos Server
      • Nacos Server添加配置
    • 常用功能介绍
      • 使用 Nacos Config 作为 Spring Cloud 分布式配置
      • 使用 Nacos Config 实现 Bean 动态刷新
        • Bean @Value 属性动态刷新
        • @ConfigurationProperties Bean属性动态刷新
        • 使用 Nacos g Config 监听实现 Bean 属性动态刷新

简介

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 Server国内下载速度缓慢的问题

项目集成

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

  • https://start.aliyun.com/bootstrap.html

Pom.xml 示例


<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.0modelVersion>
    <groupId>com.lakergroupId>
    <artifactId>configartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>configname>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASEspring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASEspring-cloud-alibaba.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring-boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.3.7.RELEASEversion>
                <configuration>
                    <mainClass>com.laker.config.ConfigApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <id>repackageid>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>

project>

启动Nacos Server

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

用户名密码默认都是:nacos

Nacos Server添加配置

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

整体如下图:

配置中心 Nacos 简介、入门 拉取远程配置和动态刷新配置功能介绍_第1张图片

常用功能介绍

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

使用 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 即可下载

本系列目录

  • 微服务Spring Cloud相关系列文章【目录】总览,该目录会实时更新

你可能感兴趣的:(《Spring,Cloud实战》,spring,boot,spring,cloud,alibaba,spring,cloud)