Spring Boot 集成Nacos实现动态配置更新

1,430 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

背景

项目中我们经常会遇到如下的问题:

  • 同一个项目有多套环境,分布在不同的配置文件中,修改时需要修改多个文件,能容易遗漏。
  • 生产环境紧急情况需要修改某个配置信息,我们只能修改、提交、要重启服务,非常不便。

针对这些问题,需要采用配置中心来进行统一管理,本文将讲解Spring Boot集成Nacos如何实现动态配置更新?

简介

Nacos是阿里巴巴的新开源项目,其核心定位是"一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台"。

nacos安装

工欲善其事,必先利其器,所以需要先安装nacos,具体步骤如下:

下载nacos相关安装包

通过pan.baidu.com/share/init?… 下载安装包解压即可

新建nacos数据库,在安装目录下conf/nacos-mysql.sql文件,执行对应的脚本

图片.png

安装目录下conf/applicaiton.properties文件中修改数据库配置

图片.png

启动Nacos

由于不是集群环境,所以需要修改为单机模式,打开startup.cmd文件修改启动模式为standalone

图片.png

双击startup.cmd启动,出现如下信息表示启动成功

图片.png

访问http://localhost:8848/nacos/#/login 地址采用nacos/nacos登录即可

图片.png

集成

新增配置信息

登录nacos新增命名空间和添加项目配置信息

命名空间下新增配置信息内容如下:

图片.png

引入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

图片.png

只需要点击编辑修改相应的值,点击发布按钮,项目中就能获取到新的值,测试结果如下:

图片.png

总结

本文讲解Spring Boot 集成Nacos实现动态配置更新的基本使用,关于nacos的其他高级特性将在后续的文章中进行讲解,如有疑问,请随时反馈。