手写分布式配置中心一步一个脚印正在进行中。
这年头基本上都是使用Spring Boot开发,然后都知道在项目中会有个application.properties
配置文件(也有的是application.yaml
,反正就是用来保存我们的一些配置信息),通常我们会把一些配置信息写到properties文件中,比如:数据库连接信息、第三方接口信息(密钥、用户名、密码、地址等),连接池、Redis配置信息、各种第三方组件配置信息等。
单体服务,甚至一些小型的分布式架构中,项目的配置都是依赖一个application.properties
配置文件来解决(可能有的项目会搞一个环境区分,比如:application-dev.properties
、application-pro.properties
等)。不过,可能伴随着业务的发展和架构不断升级,服务的数据以及每个服务涉及到配置信息会越来越多,并且对于配置管理的要求也是越来越高,比如配置信息的实时性、独立性等。
同时,我们在微服务架构下,可能还会涉及到不同环境下的配置管理、灰度发布、动态限流、动态降级等需求,包括对于配置内容的安全与权限,所以传统的配置维护方式很难达到需求。
于是,分布式配置中心就在这样的环境下产生了。
本文我们先搞清楚java中读取properties配置文件,到底有哪些方法。
Java读取properties配置文件的6种方式
需求背景
需求是我们项目中有个jdbc.properties
配置文件,内如如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
现在是想要在java代码中获取上面配置文件内容。
第一种方式
第一种方式我们采用:this.getClass().getResourceAsStream()
+Properties
代码实现:
/**
* @author tianwc 公众号:java后端技术全栈、面试专栏
* @version 1.0.0
* @date 2023年05月27日 09:13
* 在线刷题1200+,100+篇干货文章:<a href="http://woaijava.cc/">博客地址</a>
*/
public void readProperties1() throws IOException {
//不加/会从当前包进行寻找,加上/会从src开始找
InputStream inputStream = this.getClass().getResourceAsStream("/jdbc.properties");
Properties properties=new Properties();
properties.load(inputStream);
System.out.println("jdbc.driver="+properties.getProperty("jdbc.driver"));
System.out.println("jdbc.url="+properties.getProperty("jdbc.url"));
System.out.println("jdbc.username="+properties.getProperty("jdbc.username"));
System.out.println("jdbc.password="+properties.getProperty("jdbc.password"));
}
下面来聊聊上面的这段代码:
this.getClass().getResourceAsStream()
具体文件和代码的位置是,代码在
src/main/java
目录下,资源文件在src/main/resources/
目录下。会从当前类的目录下去找,这个文件如果不和该类在一个目录下,就找不到。
会从编译后的整个classes目录下去找,maven也会把资源文件打包进classes文件夹,所以可以找到。
ClassLoader
就是从整个classes文件夹找的,所以前面无需再加/
Properties
Properties:java.util.Properties
,该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常改变的,为了方便用户的配置,能让用户够脱离程序本身去修改相关的变量设置。就像在Java中,其配置文件常为.properties
文件,是以键值对的形式进行参数配置的。
类关系图:
从上面的类图可以看到Properties类继承至Hashtable</