SpringCloudAlibaba Nacos配置中心
在java代码中或者在配置文件中写配置,是最不雅的,意味着每次修改配置都需要重新打包或者替换class文件。若放在远程的配置文件中,每次修改了配置后只需要重启一次服务即可。话不多说,直接干货拉满。
集成nacos配置中心
首先引入配置相关的依赖
<!--Nacos 配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--bootstrap的依赖,由于SpringCloud2020版本上bootstrap被默认禁用了所以要引入才能使用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
其次保证项目启动时,配置先从nacos配置中心获取,所以配置都写在bootstrap.yml
或bootstrap.properties
中即可。bootstrap的文件比application的优先级要高。配置详情如下:
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
nacos中的DataId配置
DataId主要是使当前项目快速进行多套配置内容的切换,看看DataId的组成格式:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix:项目的服务名,也就是spirng.application.name的值
- spring.profiles.active:当前的环境
- file-extension:文件后缀
当spring.profiles.active为空时,对应的’-'连接符也将会不存在,DataId的格式就是变换为${prefix}.${file-extension}
设置profiles为dev
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
profiles:
active: dev
那么我们的文件名就应该为consumer-dev.yml
,我们需要在nacos上创建配置,先创建consumer-dev.yml和consumer-prod.yml文件
通过代码获取这个配置,然后通过调整环境,注意它们的配置返回。
@RestController// @RestController注解是@Controller+@ResponseBody
@RefreshScope //通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
public class ConfigController {
@Value("${custom.info}")// 注解获取custom.info配置的值
private String config;
@RequestMapping("/getConfig")
public String getConfig() { // 获取配置的接口
return config;
}
}
调用查看结果:
D:\springcloud\doc>curl localhost:9001/getConfig
nacos config dev
切换为prod环境,重启项目再次调用
spring:
profiles:
active: prod
D:\springcloud\doc>curl localhost:9001/getConfig
nacos config prod
莫得问题~
Nacos的Group配置
group是分组的意思,表示配置内容归于哪个组,默认的是DEFAULT_GROUP
组,如创建配置文件时声明一个CONSUMER_GROUP
java代码配置:
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
group: CONSUMER_GROUP # 指定某GROUP
profiles:
active: dev
重启调用
D:\springcloud\doc>curl localhost:9001/getConfig
nacos config dev CONSUMER_GROUP
nacos的Namespace配置
namespace表示命名空间,比较粗粒度的控制。默认的namespace是public,当创建新的命名空间时,如果要指定此命名空间,则需要在java配置中声明它的namespace的id值
如上图创建了一个命名空间,在namespace中创建consumer-dev.yml的配置文件
在java配置中namespace是填写的ID值而不是名称
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
namespace: e6d5450d-a8d3-45c4-9801-091586082104 # 命名空间的id值
profiles:
active: dev
Nacos的持久化
Nacos默认的是使用嵌入式数据库Derby数据库,也就表明越到后面越容易出现瓶颈,如存储容量限制,不方便数据查询、存储优化等等。Nacos支持使用mysql做数据持久化,版本要求mysql在5.6.5+
mysql数据持久化
在mysql中创建一个数据库,并且导入nacos-mysql.sql的文件(路径是/conf/nacos-mysql.sql)
在Nacos的conf/application.properties文件中添加mysql数据源支持
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql # 添加mysql数据源
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root # 数据库账号
db.password.0=123456 # 密码
重启下nacos,登录进入后,发现我们刚刚测试的那些数据都不在了,这就是不做持久化的问题。
现在已经将数据的持久化加上了,我们像刚刚一样随便添加几个数据,然后再次重启nacos,看看数据有没有丢失。
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
profiles:
active: dev
调试:
D:\springcloud\doc>curl localhost:9001/getConfig
nacos config dev
重启nacos,可以看到我们的数据都还在
nacos的配置扩展
除了通过${prefix}-${spring.profiles.active}.${file-extension}
的方式指定我们的配置文件,我们还可以直接通过dataId配置指定nacos上的一些共享配置
如创建了一个redis的共享配置
在java项目中不仅要读取consumer-dev.yml
还要读取redis.yml的配置,可以使用extension-configs来声明
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
config:
server-addr: localhost:8848 # nacos地址
file-extension: yml # 指定配置内容的数据格式
extension-configs:
-
dataId: redis.yml
group: DEFAULT_GROUP
refresh: true
profiles:
active: dev
extension-configs是一个数组,extension-configs中若有多个配置时
extension-configs:
-
dataId: redis.yml
group: DEFAULT_GROUP
refresh: true
-
dataId: rabbitmq.yml
group: DEFAULT_GROUP
refresh: true