携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
背景
项目中我们经常会遇到如下的问题:
- 同一个项目有多套环境,分布在不同的配置文件中,修改时需要修改多个文件,能容易遗漏。
- 生产环境紧急情况需要修改某个配置信息,我们只能修改、提交、要重启服务,非常不便。
针对这些问题,需要采用配置中心来进行统一管理,本文将讲解Spring Boot集成Nacos如何实现动态配置更新?
简介
Nacos是阿里巴巴的新开源项目,其核心定位是"一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台"。
nacos安装
工欲善其事,必先利其器,所以需要先安装nacos,具体步骤如下:
下载nacos相关安装包
通过pan.baidu.com/share/init?… 下载安装包解压即可
新建nacos数据库,在安装目录下conf/nacos-mysql.sql文件,执行对应的脚本
安装目录下conf/applicaiton.properties文件中修改数据库配置
启动Nacos
由于不是集群环境,所以需要修改为单机模式,打开startup.cmd文件修改启动模式为standalone
双击startup.cmd启动,出现如下信息表示启动成功
访问http://localhost:8848/nacos/#/login 地址采用nacos/nacos登录即可
集成
新增配置信息
登录nacos新增命名空间和添加项目配置信息
命名空间下新增配置信息内容如下:
引入jar包
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>
说明:由于本文只使用了Nacos的配置功能,所以不需要引入spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-alibaba-nacos-config这两个jar包。
nacos配置
spring:
profiles:
#开发环境dev,测试环境uat,生产环境prod
active: dev
application:
name: fw-nacos-config
cloud:
nacos:
# 配置中心
config:
# nacos的ip地址和端口
server-addr: 127.0.0.1:8848
#nacos登录用户名
username: nacos
#nacos登录密码
password: nacos
# 文件类型
file-extension: yml
#
config-retry-time: 300000
auto-refresh: false
max-retry: 10
简单使用
启动类配置nacos注解
@SpringBootApplication
@NacosPropertySource(dataId = "fw-nacos-config-dev.yml",groupId = "DEFAULT_GROUP",type = ConfigType.PROPERTIES,autoRefreshed = true)
public class NacosApplication
{
public static void main(String[] args)
{
SpringApplication.run(NacosApplication.class, args);
}
}
本文采用@NacosPropertySource注解方案添加配置文件,也可以使用属性文件的方式。
- dataId:配置的数据id
- groupId:配置groupid
- type:配置文件的类型
- autoRefreshed:是否自动刷新
基本使用
采用 @NacosValue获取属性值
@NacosValue(value="${filePath:1}",autoRefreshed=true)
private String value;
@RequestMapping("/getHttpConfig")
public String getHttpConfig(){
String requestTimeOut = httpConfig.getConnectionRequestTimeout().toString();
logger.info("getHttpConfig requestTimeOut:{}",requestTimeOut);
return requestTimeOut;
}
说明:采用@NacosValue获取配置文件中的值。也可以使用@value来获取值,这两个注解之间的区别如下:
@Value是从Spring容器中的Environment中获取对应的属性值,在启动Nacos的时候就把数据给加载到了Environment中去了; 所以通过@Value也能获取到属性值;但是它跟@NacosValue的区别是, 它不能够实时刷新数据; 它的值一直都是启动时候第一遍加载的数据。
使用@NacosConfigurationProperties将配置绑定到对象中
例如读取http配置信息
@NacosConfigurationProperties(prefix="http.pool",dataId="fw-nacos-config-dev.yml",groupId="DEFAULT_GROUP",type=ConfigType.YAML,autoRefreshed=true)
@Configuration
public class HttpConfig
{
private Long connectTimeout;
private Long connectionRequestTimeout;
private Long defaultMaxPerRoute;
private Long maxTotal;
private Long socketTimeout;
private Long validateAfterInactivity;
private Long maxCostTime;
public Long getConnectTimeout()
{
return connectTimeout;
}
public void setConnectTimeout(Long connectTimeout)
{
this.connectTimeout = connectTimeout;
}
public Long getConnectionRequestTimeout()
{
return connectionRequestTimeout;
}
public void setConnectionRequestTimeout(Long connectionRequestTimeout)
{
this.connectionRequestTimeout = connectionRequestTimeout;
}
public Long getDefaultMaxPerRoute()
{
return defaultMaxPerRoute;
}
public void setDefaultMaxPerRoute(Long defaultMaxPerRoute)
{
this.defaultMaxPerRoute = defaultMaxPerRoute;
}
public Long getMaxTotal()
{
return maxTotal;
}
public void setMaxTotal(Long maxTotal)
{
this.maxTotal = maxTotal;
}
public Long getSocketTimeout()
{
return socketTimeout;
}
public void setSocketTimeout(Long socketTimeout)
{
this.socketTimeout = socketTimeout;
}
public Long getValidateAfterInactivity()
{
return validateAfterInactivity;
}
public void setValidateAfterInactivity(Long validateAfterInactivity)
{
this.validateAfterInactivity = validateAfterInactivity;
}
public Long getMaxCostTime()
{
return maxCostTime;
}
public void setMaxCostTime(Long maxCostTime)
{
this.maxCostTime = maxCostTime;
}
}
说明:采用@NacosConfigurationProperties将http的配置文件信息封装到HttpConfig对象中。
- prefix:前置
- dataId:配置的数据id
- groupId:配置groupid
- type:配置文件的类型
配置文件动态更新
修改配置文件中的filePath有abc修改为accd
只需要点击编辑修改相应的值,点击发布按钮,项目中就能获取到新的值,测试结果如下:
总结
本文讲解Spring Boot 集成Nacos实现动态配置更新的基本使用,关于nacos的其他高级特性将在后续的文章中进行讲解,如有疑问,请随时反馈。