Scala - 使用 typesafe.config 管理你的配置文件

14 July 2016

为了统一管理配置项,我在真是操碎了心啊。现在我分享下这两天的研究成果。

首先先介绍下 typesafe.config,Scala 语言下一个流行的配置管理库,由 Lightend(前身是 typesafe,Scala 编程语言的发明者)公司开发的。所以它的流行自然就不言而喻了。它的项目地址:https://github.com/typesafehub/config。

安装和使用 typesafe.config

在你的 sbt 依赖中添加如下:

braryDependencies += "com.typesafe" % "config" % "1.3.0"

这个版本你需要关注,如果你的 Java 1.6及以下,其版本就是 1.2.1;1.3.0 则是为 java 8 构建的

下面是演示代码:

import com.typesafe.config.ConfigFactory

val conf = ConfigFactory.load();

int bar1 = conf.getInt("foo.bar");

Config foo = conf.getConfig("foo");

int bar2 = foo.getInt("bar");

在这里,我就不对用法进行详细介绍,自行 google 或者看官方 API(它的 README.md 将的已经足够详细了)。

可选的覆盖配置方案

这几天我一直思考一个问题:在不同环境下,如何能够自动切换配置,而减少上线和调试成本,降低配置错误带来的风险。目前有如下几个方案:

Java System Properties

Java 系统属性,通过 -D 标签传递给命令行来达到覆盖配置的目的:

java -Dsys_args=value com.cyou.fz.config

如果需要的覆盖的参数占少数,那么这个方式是一个不错的方案,但是配置一多就蛋碎了一地,举个例子:

java -Ddb1=0.0.0.0/db -Ddb1_pass=u -Ddb1_pass \

-Ddb2=0.0.0.0/db -Ddb2_pass=u -Ddb2_pass \

-Ddb3=0.0.0.0/db -Ddb3_pass=u -Ddb3_pass \

-Ddb4=0.0.0.0/db -Ddb3_pass=u -Ddb4_pass \

com.cyou.fz.config

用这种方式来传递多个数据配置,是不是很蛋疼啊;总结下优缺点:

优点:

需要传递命令行 flag,操作起来简便

缺点:

如果需要覆盖的配置数量多(个人认为,超过 5 个就不适用了)

使用环境变量

现在来看看我们的 HOCON 配置:

app {

db {

host = localhost// 默认参数

host = ${?DB_PORT_3306_TCP_ADDR}// 环境变量 DB_PORT_3306_TCP_ADDR 有设置,将会替换 host 的值

port = "3306"

port = ${?DB_PORT_3306_TCP_PORT}

}

}

就不过多解释了,自己看注释。

HOCON 中使用 include

首先我们将系统配置以文件形式存储和统一管理,下面是的数据库连接串管理:

# 生产环境数据库配置

# 路径 /usr/local/etc/db.conf

db {

jdbcUrl = "jdbc:mysql://0.0.0.0:3306/MyDatabase"

user = "dba"

pass = "pass"

}

这时,你只需要在你的 resoures 中的配置文件引入我们公用的配置:

# src/main/scala/resources/application.conf

include "/usr/local/etc/db.conf"

测试下:

scala> val conf = ConfigFactory.load();

Iconf: com.typesafe.config.Config = ...

scala> conf.getString("db.jdbcUrl")

res0: String = jdbc:mysql://0.0.0.0:3306/MyDatabase

这样子,你就可以在的开发环境,测试环境的同一个路径下配置自己的数据连接,就很方便。

另外,另外你觉得路径太长太丑,你也可以使用:

include classpaht("db.conf")

你要把你的配置文件追加到 classpath 中,这边,我需要这么操作:

export CLASSPATH = /usr/local/etc/:$CLASSPATH

这样,测试结果同上。

你还可以通过 web 服务,来统一管理配置,那么你就可以直接试用 Url 引入配置:

include url("http://0.0.0.0/db.conf")

结语

这里,提供了三种配置管理的方法,任君挑选。个人更偏向于最后一种;第一种的弊端已经讲过了,置于第二种,如果没有线上环境变量的配置权限,就无法操作了。最后一种,你只要有目录的操作权限,就可以轻松部署了。

hocon配置文件_Scala - 使用 typesafe.config 管理你的配置文件相关推荐

  1. mysql配置文件没有spring_spring cloud config使用mysql存储配置文件

    spring cloud config使用mysql存储配置文件 1.结构图 2.pom.xml: 4.0.0 com.didispace config-server-db 1.0.0 jar con ...

  2. perl 登录linux服务器,用Perl管理Linux操作系统的配置文件

    一般的开发者用于定位.学习和调试配置文件的所花费的时间,比您预期的要更长.不过,使用一个您可能每天都在用的工具:CVS 树,您就可以节约那些时间--并减轻精力和挫折的负担.使用这些技巧来备份.发布最令 ...

  3. ssh整合之六管理我们的配置文件

    1.我们的ssh搭建已经搭建好了,之前是纯xml方式,而且我们的配置文件,是一个框架一个配置文件.这样的话,配置文件中的内容就会很多,这样以后修改起来也会很麻烦,因        此,我们尝试着把这些 ...

  4. python读取配置文件存在某配置_Python读取配置文件(config.ini)以及写入配置文件

    一.读取配置文件 我的目录如下,在config下有一个config.ini配置文件 配置文件内容# 定义config分组 [config] platformName=Android appPackag ...

  5. 在配置文件(.settings、.config)中存储自定义对象

    引言 我前面曾写过一篇<使用配置文件(.settings..config)存储应用程序配置>,我在其中指出"settings无法实现对一些复杂类型及自定义类型的支持". ...

  6. javaconfig配置mysql_spring cloud config使用mysql存储配置文件

    spring cloud config使用mysql存储配置文件 1.结构图 2.pom.xml: 4.0.0 com.didispace config-server-db 1.0.0 jar con ...

  7. windows和linux互传文件,用户配置文件和密码配置文件,用户和组管理

    windows和linux互传文件,用户配置文件和密码配置文件,用户和组管理 用xshell  和windows互传文件 ,首先安装一个包  ,yum install -y lrzsz sz 加文件就 ...

  8. python配置文件密码管理_用户配置文件和密码配置文件,用户组管理和用户管理...

    1 用户配置文件 /etc/passwd 是用户配置文件,每创建一个用户,该配置文件相应增加一行. [root@localhost ~]# cat /etc/passwd root:x:0:0:roo ...

  9. SELinux系列(四)——SELinux配置文件(/etc/selinux/config)详解

    我们知道,SELinux 是预先配置的,可以在不进行任何手动配置的情况下使用 SELinux 功能.然而,一般来说,预先配置的 SELinux 设置很难满足所有的 Linux 系统安全需求. SELi ...

最新文章

  1. 图解Win32汇编字符串和Debug输出
  2. Abstract Factory抽象工厂模式
  3. 模型怎么样_次世代PBR游戏模型流程到底是怎么样?
  4. 【硬件】集线器,交换机,路由器
  5. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~三 分部类是否破坏了单一职责...
  6. SpringBoot2.0 基础案例(15):配置MongoDB数据库,实现增删改查逻辑
  7. 掌握基本的Java程序开发过程 题库 1213
  8. 002redis常用的数据结构
  9. Netty工作笔记0048---Http服务过滤资源
  10. 第 15 章 代理模式
  11. python美多商城项目百度网盘_美多商城项目(六)
  12. 三维曲线图的绘制方法大全
  13. LeetCode路径问题
  14. 什么是Prettier?
  15. 七种基本质量工具(7QC)和PDCA循环
  16. 【F1C100S】编译启动所需的uboot,kernel,rootfs
  17. 360无线路由器dns服务器,路由器的首选dns服务器怎么填
  18. MySQL究竟是如何做到持久性的?
  19. 远程计算机强迫关闭一个连接,远程主机强迫关闭了一个现有的连接,该怎么办...
  20. C语言decompose函数,R语言时间序列应用(decompose、Holt-Winters初步)

热门文章

  1. 根据角色id查询菜单的名字
  2. Authentication认证和Authorization授权的作用
  3. [转]Ikariam 生存法则
  4. 10部能让ni爱上数学的经典电影
  5. origin python控制台怎么用_python如何使用代码运行助手
  6. 2023第82届中国(天津)教育装备展示会
  7. 小黑麦当劳坚韧leetcode之旅:23. 合并K个升序链表
  8. QQ空间常见问题及解决办法2007版
  9. 分享一个自己利用Python写的淘宝秒杀工具源码
  10. R语言处理数据——ggplot2去掉网格线和背景色