抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Nacos作为配置中心

简介

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

Nacos Config支持多种方式的配置格式,比如:TEXTJSONXMLYAMLHTMLPROPERTIES等。

整合配置中心

增加dependencyManagement

IDEA中创建聚合工程Nacos作为父工程,其pom.xml如下(重点关注dependencyManagement配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>

</dependencies>
</dependencyManagement>

导入POM文件

在子模块引入配置中心的依赖

1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

新建配置

在Nacos-Server中新建配置,其中Data ID它的定义规则是:${prefix}-${spring.profile.active}.${file-extension}

  • nacos 会去找 ${prefix}-${spring.profiles.active}.${file-extension} 的配置文件
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile, 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

这里我创建Data Id 为order-server.properties的配置文件,其中Group为默认的DEFAULT_GROUP,配置文件的格式也相应的选择properties,其内添加配置api.version=1.0.0,如图所示

bootstrap引导配置

Nacos Config相关的配置必须在bootstrap.yml或者bootstrap.properties文件内添加。

1
2
3
4
5
6
7
8
# 配置中心url
spring.application.name=order-server
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties

我们没有配置spring.profiles.active配置,这样他会自动去找order-server.properties配置文件

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

上面的配置是为了保证服务的正常注册和配置获取,以及配置DataID的正确性

代码配置

OrderServiceImpl 引用配置中心配置api.version

其中通过@Value注解,去读取key为api.version的配置的值,并通过/getVersion接口返回。

1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class OrderServiceImpl implements OrderService {

@Value("${api.version}")
private String apiVersion;

@Override
public String getVersion() {
return apiVersion;
}
}

OrderService

1
2
3
4
5
6
@RestController
@RequestMapping("/order")
public interface OrderService {
@GetMapping("/version")
public String getVersion();
}

启动类配置

启动类只要引入@SpringBootApplication注解就可以完成配置中心启动

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
//启用Nacos注册中心
@EnableDiscoveryClient
public class OrderApplication {

public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
}

启动测试

访问测试接口进行测试 http://localhost:8083/order/version

已经可以进行启动加载动态配置了 但是还是不能进行动态修改配置

自动更新配置

加入@RefreshScope

加入@RefreshScope注解,可以使当前类下的配置支持动态更新。

1
2
3
4
5
@Component
@RefreshScope
public class OrderServiceImpl implements OrderService {
........
}

@RefreshScope在这里的作用就是让配置内容支持动态刷新,也就是当应用运行中,我们在Nacos控制台修改了配置之后这里也会动态的更新。

修改nacos配置

修改nacos配置文件将配置文件改为1.2.0

控制台进行了更新

1
2020-06-04 11:08:56.685  INFO 9900 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [api.version]
接口测试

访问接口测试

小结

​ 通过上面的测试,可见Nacos做配置中心,在SpringCloud项目中,也可以做到无缝衔接,切换到Nacos可以说知识修改配置的问题,成本也很低

​ 项目的其他配置不变,只需要指定配置中心地址,同时将配置文件外部管理。

数据持久化

​ 在之前的教程中,我们对于Nacos服务端自身并没有做过什么特殊的配置,一切均以默认的单机模式运行,完成了上述所有功能的学习。但是,Nacos的单机运行模式仅适用于学习与测试环境,对于有高可用要求的生产环境显然是不合适的。那么,我们是否可以直接启动多个单机模式的Nacos,然后客户端指定多个Nacos节点就可以实现高可用吗?答案是否定的。

​ 在搭建Nacos集群之前,我们需要先修改Nacos的数据持久化配置为MySQL存储。默认情况下,Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只要支持MySQL的存储。

安装数据库

目前Nacos仅支持Mysql数据库,且版本要求:5.6.5+

初始化数据库

Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有

进入nacos-server\nacos\conf目录,初始化文件:nacos-mysql.sql

此处我创建一个名为 nacos 的数据库,然后执行初始化脚本,成功后会生成 12 张表

修改配置文件

这里是需要修改Nacos-server的配置文件

​ Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos-server\nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:

1
2
3
4
5
6
7
8
9
10
11
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.64.128:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

启动Nacos-server

先启动Nacos-server,启动方式不变,直接双击执行nacos-server\nacos\bin下的startup.cmd文件

​ 启动成功后进入Nacos控制台,此时的Nacos控制台中焕然一新,之前的数据都不见了

​ 因为加入了新的数据源,Nacos从mysql中读取所有的配置文件,而我们刚刚初始化的数据库是干干净净的,自然不会有什么数据和信息显示。

添加配置

在公共空间(public)中新建一个配置文件DataID: order-server.properties, 配置内容如下:

1
nacos.share=order-server:1.0.0

验证是否持久化到数据库中

观察数据库mynacos中的数据库表 config_info , 如下

小结

Nacos通过集中式存储来保证数据的持久化,同时也为Nacos集群部署奠定了基础

​ 试想一下,如果我们以之前的方式启动Nacos,如果想组建Nacos集群,那各个节点中的数据唯一性就是最大的问题

​ Nacos采用了单一数据源,直接解决了分布式和集群部署中的一致性问题。

评论