基于Spring Boot的程序的配置读取方案

Posted 左直拳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring Boot的程序的配置读取方案相关的知识,希望对你有一定的参考价值。

从内置配置文件到外置配置管理,这是一个很大的进步。

基于Spring Boot的程序的配置读取,可以有2种方案。一是基础的,读取项目配置文件;二是读取外置的配置信息,比如利用nacos的配置管理服务,将配置写到nacos,程序运行时从nacos读取。

方案一方便快捷,方案二配置与程序解耦,修改十分方便。各有所长。

一、从项目配置文件读取

1、配置文件
将配置信息写在配置文件里,是基础的做法。配置文件有2种格式,*.properties*.yml。properties是键值对,干脆利落,但yml可读性更胜一筹。不过,application.properties的优先级比application.yml高,如果两个文件同时定义了同名的配置项,则以application.propertis中的为准。

通常,配置信息分为开发环境和生产环境,即将开发时的配置和正式部署时的配置区分。方法是分开写到2个配置文件里,比如开发环境的配置文件为application-dev.yml,生产环境的配置文件为application-pro.yml。它们分别定义在两种环境中不同的配置信息,而公有的、不随环境变化的信息可以定义在application.properties。

application-dev.yml

server:
  port: 8085

token:
  users: test
  passwords: test1234

remote:
  url: http://192.168.0.22:8083/gzdzzh/raindata

2、注册配置文件
在pom.xml里注册环境,不然配置文件不会被识别:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <profileActive>dev</profileActive>
            <maven.test.skip>true</maven.test.skip>
            <scope.jar>compile</scope.jar>
        </properties>
        <!-- 使能 -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>pro</id>
        <properties>
            <profileActive>pro</profileActive>
            <maven.test.skip>true</maven.test.skip>
            <scope.jar>provided</scope.jar>
        </properties>
    </profile>
</profiles>

3、使用哪种环境的配置文件
使用开发环境还是生产环境的配置文件?
首先在pom.xml指明(参考上面pom.xml的使能部分),然后在application.properties里引用。

application.properties

spring.profiles.active=@profileActive@

4、读取配置
代码中可以这样读取

@Component
public class AppConfig 
    @Value(value = "$token.users")
    private String users;
    @Value(value = "$token.passwords")
    private String passwords;

    public String[] getUsers() 
        return users.split(",");
    

    public void setUsers(String users) 
        this.users = users;
    

    public String[] getPasswords() 
        return passwords.split(",");
    

    public void setPasswords(String passwords) 
        this.passwords = passwords;
    

5、发布
项目打包时,指定环境。比如本例准备部署到生产环境,则可以运行以下命令。其中-Ppro,就是指定按生产环境打包(见上面的pom.xml)。

call mvn clean package -Dmaven.test.skip=true -Ppro

可以将这个命令写在批处理文件里,该批处理文件放在项目根目录下。

二、从nacos读取

Nacos是阿里巴巴旗下产品,一个动态服务发现、配置管理和服务管理平台。

1、引入nacos
pom.xml

<!-- nacos -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.1</version>
</dependency>

2、编写配置文件
application-dev.yml

server:
  port: 8085

nacos:
  config:
    server-addr: 192.168.0.141:8848
    namespace: rain-api

而之前的配置,则写在nacos里


从中也可以知道,虽然有了nacos,但配置文件还是要有,因为nacos的地址,开发环境可能与生产环境不一样。其次,像server.port这类配置,可能要很早就开始读取,写到nacos里不合适。

3、读取nacos

1)主函数

import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@NacosPropertySource(dataId = "normal", autoRefreshed = true)
public class RainApiApplication 
    public static void main(String[] args) 
        SpringApplication.run(RainApiApplication.class, args);
    

2)读取配置项

import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.gzdd.rainapi.pojo.TokenUser;
import org.springframework.stereotype.Component;

@Component
public class AppConfig 
    @NacosValue(value = "$token.users:test", autoRefreshed = true)
    private String users;
    @NacosValue(value = "$token.passwords:test1234@gzdd", autoRefreshed = true)
    private String passwords;
    @NacosValue(value = "$remote.url:http://192.168.0.22:8083/gzdzzh/raindata", autoRefreshed = true)
    private String remoteUrl;

    public String getRemoteUrl() 
        return remoteUrl;
    
    public void setRemoteUrl(String remoteUrl) 
        this.remoteUrl = remoteUrl;
    
    public String[] getUsers() 
        return users.split(",");
    
    public void setUsers(String users) 
        this.users = users;
    
    public String[] getPasswords() 
        return passwords.split(",");
    
    public void setPasswords(String passwords) 
        this.passwords = passwords;
    

4、发布
这个与nacos无关,参考上面。

三、小结

从配置文件到nacos,这是一个很大的进步。这种配置外置的思想很赞。配置文件的话,其实发布之后,修改起来不方便,比如要解开jar包、war包什么的。抛开这层不说,登录到服务器捣鼓就很麻烦。将配置外置,只需放问nacos,像一般的网站操作就好。以往也有将配置写在数据库的,虽然也比配置文件方便,但直接修改数据库却有风险。

以上是关于基于Spring Boot的程序的配置读取方案的主要内容,如果未能解决你的问题,请参考以下文章

基于spring boot读取配置yaml hashmap

Spring/Spring Boot的外部化配置

无法在 spring-boot 应用程序中从 Consul 读取配置

基于spring-boot的应用程序的单元+集成测试方案

基于spring-boot的应用程序的单元测试方案

Spring Boot配置文件放在jar外部