工具使用背景
很多配置项都是使用 yaml 的格式进行配置的, 按一定的格式进行缩进, 一眼看上去,清晰明了.
如 Springboot 工程下图所示:
如:k8s 的 Deploy 文件:
本次写这个 yaml 工具解析是想解析 k8s 的 config 文件,然后封装一个 k8s 客户端. 因为无论阿里云还是华为云,要查看多个容器的日志. 都不是方便.
基础依赖
这个工具是在已有的工具上进行封装的
gradle:
compile group: 'org.yaml', name: 'snakeyaml', version: '1.25'
maven:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
封装的代码
// 首先声明一个Map存解析之后的内容:
Map<String, Object> properties;
// 空的构造函数
public YamlTools() {
}
// 以文件路径为条件的构造函数
public YamlTools(String filePath) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 调基础工具类的方法
Yaml yaml = new Yaml();
properties = yaml.loadAs(inputStream, Map.class);
}
// 从String 中获取配置的方法
public void initWithString(String content) {
// 这里的yaml和上面那个应该可以抽取成一个全局变量,不过平常用的时候
// 也不会两个同时用
Yaml yaml = new Yaml();
properties = yaml.loadAs(content, Map.class);
}
/**
* 从Map中获取配置的值
* 传的key支持两种形式, 一种是单独的,如user.path.key
* 一种是获取数组中的某一个,如 user.path.key[0]
* @param key
* @return
*/
public <T> T getValueByKey(String key, T defaultValue) {
String separator = ".";
String[] separatorKeys = null;
if (key.contains(separator)) {
// 取下面配置项的情况, user.path.keys 这种
separatorKeys = key.split("\\.");
} else {
// 直接取一个配置项的情况, user
Object res = properties.get(key);
return res == null ? defaultValue : (T) res;
}
// 下面肯定是取多个的情况
String finalValue = null;
Object tempObject = properties;
for (int i = 0; i < separatorKeys.length; i++) {
//如果是user[0].path这种情况,则按list处理
String innerKey = separatorKeys[i];
Integer index = null;
if (innerKey.contains("[")) {
// 如果是user[0]的形式,则index = 0 , innerKey=user
index = Integer.valueOf(StringTools.getSubstringBetweenFF(innerKey, "[", "]")[0]);
innerKey = innerKey.substring(0, innerKey.indexOf("["));
}
Map<String, Object> mapTempObj = (Map) tempObject;
Object object = mapTempObj.get(innerKey);
// 如果没有对应的配置项,则返回设置的默认值
if (object == null) {
return defaultValue;
}
Object targetObj = object;
if (index != null) {
// 如果是取的数组中的值,在这里取值
targetObj = ((ArrayList) object).get(index);
}
// 一次获取结束,继续获取后面的
tempObject = targetObj;
if (i == separatorKeys.length - 1) {
//循环结束
return (T) targetObj;
}
}
return null;
}
运行效果
以上图中的 K8s 为例,运行如下图所示:
总结
一个小工具, 根据自己的需求封装了一下,大家也可以定制自己的工具
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于