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
后,也会输出初始化的回调信息: