关键词搜索

源码搜索 ×
×

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

发布2022-06-20浏览560次

详情内容

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

基于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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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

application.properties

spring.profiles.active=@profileActive@
  • 1

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

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

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

二、从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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

server:
  port: 8085

nacos:
  config:
    server-addr: 192.168.0.141:8848
    namespace: rain-api
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

而之前的配置,则写在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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

三、小结

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

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载