从内置配置文件到外置配置管理,这是一个很大的进步。
基于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,像一般的网站操作就好。以往也有将配置写在数据库的,虽然也比配置文件方便,但直接修改数据库却有风险。