Nacos配置中心基本概念及使用

Spring Cloud Alibaba从2018年开源以来,得到了众多软件爱好者的关注,尤其是在Spring Cloud Netflix一些组件处于停更后。Spring Cloud Alibaba提供了许多分布式环境下的重要特性,如:分布式事务。
本文主要讲解Nacos作为配置中心的相关特性。

一、背景

在项目研发过程中,少不了一些基础配置,不同环境的一些配置可能是不一样的,如:数据源、消息服务器等。为了避免将所有配置放置在项目中,也为了配置的安全性,通常会使用外部的配置中心来管理这些配置信息,Spring Cloud Netflix提供了Config组件,本文主要介绍Spring Cloud Alibaba提供的配置中心组件:Nacos,官网地址:https://nacos.io

二、基础概念

Nacos中有namespace、Group和DataId的概念,
namespace:命名空间,租户粒度的配置隔离,通常用来区分不同环境。默认public
Group:对配置集进行分组,从而区分 Data ID 相同的配置集,常用于不同的应用使用相同的配置。默认DEFAULT_GROUP
Data Id: 某个配置集的id,一个系统或应用可以包含多个配置集。
整体结构如下:

三、基本使用

1. 服务端配置

首先,需要下载Nacos服务端,这里以Windows nacos-server-2.2.0版本为例,下载地址:https://github.com/alibaba/nacos/releases
下载成功后,解压到本地某个目录,然后使用命令控制台启动(单机模式),命令如下:
startup.cmd -m standalone
启动成功后,可以通过浏览器访问http://127.0.0.1:8848/nacos,页面显示如下:

通过内置的用户名/密码:nacos/nacos 可以访问UI界面。
这里使用自定义的namespace(nacos-config),如下:

然后在该namespace下新建一个配置项nacos-config.yml,Group就使用默认的DEFAULT_GROUP

配置文件内容如下:

name: Michael
title: Nacos Configuration
user:
    name: Michael
    age: 18

2. 客户端配置

以Maven项目为例,项目依赖如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.7.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <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>
</dependencies>

在classpath下新建bootstrap.yml文件

不能使用application.yml配置Nacos配置,因为bootstrap会优先application进行加载,加载顺序会对程序的行为产生影响。

内容如下:

spring:
  application:
    name: nacos-config-client

  cloud:
    nacos:
      config:
        serverAddr: 127.0.0.1:8848
        namespace: nacos-config
        group: DEFAULT_GROUP
        fileExtension: yml
        extension-configs[0]:
          dataId: nacos-config.${spring.cloud.nacos.config.fileExtension}
          refresh: true

启动类如下:

@SpringBootApplication
public class ConfigApp {
    public static void main(String[] args) {
        ConfigurableApplicationContext ac = SpringApplication.run(ConfigApp.class, args);
        Environment env = ac.getEnvironment();
        System.err.printf("Application Start....user.name=%s, user.age=%s\n", env.getProperty("user.name"), env.getProperty("user.age"));
    }
@RestController
@RefreshScope
public class HelloConfigController {
    @Value("${title}")
    private String title;

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

    @GetMapping("/hello")
    public String hello() {
        return "Hello " + name + " ,Title: " + title;
    }
}

配置@RefreshScope可以动态监听Nacos配置项的变更,可以直接获取最新的配置项。

在变更Nacos配置项时,也能触发回调方法,如:@PostConstruct@PreDestroy修饰的方法

@RestController
@RefreshScope
public class HelloConfigController {
    @Value("${title}")
    private String title;

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

    @GetMapping("/hello")
    public String hello() {
        return "Hello " + name + " ,Title: " + title;
    }

    @PostConstruct
    public void init() {
        System.out.printf("Controller init......name:%s\n", name);
    }

    @PreDestroy
    public void destroy() {
        System.out.printf("Controller destroy......name:%s\n", name);
    }
}

当Nacos配置项中name属性变更后,则会收到销毁的回调消息,如下:

读取新的配置属性,比如访问http://127.0.0.1:9002/hello后,也会输出初始化的回调信息:

posted @ 2022-12-17 23:27  生活咖啡  阅读(318)  评论(0编辑  收藏  举报