• GoLang读取yaml配置文件

    最近这段时间在用GoLang写项目。其中如何读取配置文件一度是让我比较头疼的事情,好在最后都解决了,这里简单记录一下GoLang读取配置文件的方式。 因为写了多年java springboot项目的缘故,在多种配置方式中独独比较偏爱yaml的格式。因此为新项目选择配置文件的时候就毫不犹豫地选择了继续使用yaml。 使用yaml时遇到了这样几个问题: yaml配置文件读取并映射为struct yaml多配置文件读取 适应性选择配置 接下来就以这几个问题的顺序来简单介绍下使用GoLang如何读取yaml配置文件以及关于配置文件选择的问题。 读取yaml配置文件 也许很多人都在网上搜索过“golang读取yaml”这样的词条,搜索结果也通常大部分都是推荐使用gopkg.in/yaml这个package。 gopkg.in/yaml诚然是读取yaml最经典的一个方案,但却不是最简单易用的一个方案。 读取yaml(或其它类型的配置文件)我首先推荐使用viper,因为它用起来最简洁。 来看一个viper读取配置文件的示例: 到这里配置文件的读取就已经完成了。 使用配置信息时可以使用viper的GetInt、GetString、GetBool等方法来读取。 比如类似下面的配置信息: 要获取配置中的age信息时可以这样做: viper也支持将配置信息渲染为struct对象: 需要注意一点:viper并不是直接将yaml配置文本转换成了struct对象。viper是先将配置信息转换成了map结构,而后再通过github.com/mitchellh/mapstructure这个模块将map对象转换为struct对象。因此在配置struct成员映射关系时使用的是mapstructure关键字,而非yaml关键字。 yaml多配置文件读取 在java springboot中可以做这样的配置:在application.yml做通用的配置;在application-dev.yml和application-prod.yml添加适应不同环境的个性化配置;如有相同配置项,后者可以覆盖前者。 我非常喜欢这种配置方法,能够灵活适配不同环境,减少冗余配置。但很不幸,viper目前并不支持类似的操作。头疼了一段时间后,干脆参考viper的代码写了一个新的项目vibe。这个项目目前的版本是0.0.5。在读取yaml文件这一点上,vibe的使用方式和viper几乎是一样的——除了能够满足读取多配置文件这一项。 看下示例代码: 这里只看第一行代码就好。这行代码里读取了两个配置文件:config.yml和config-dev.yml,两个文件中的配置有重合之处(不详细贴配置信息了,可参考后文示例代码),但是最终输出信息以后者中的配置为准。 适应性选择配置 虽然这个写在最后,不过应该是最好解决的事情了,通过环境变量、命令参数都能解决。为此写段演示代码意义好像也不大,就这样吧。 文中示例代码见git:yaml-reader End!!

    [阅读更多...]
  • springboot入门07 – 配置文件详解

    概述 这一篇主要介绍下SpringBoot配置相关的内容。 通过配置文件,我们可以做到如下事情: 修改springboot的默认配置项 添加自定义配置项 SpringBoot使用全局的配置文件,主配置文件名是固定的:application.xxx springboot的配置文件有多种格式可选,如:.properties,.xml,.yml。 我个人比较喜欢yaml的简洁,所以推荐使用yaml。 yaml的基本语法 下面介绍些yaml的语法 使用空格缩进来表示结构,相同层级的数据其缩进的长度必定相同: 支持使用注解,但只支持使用单行注解,注解以“#”号开头: 支持直接类型或字符串的列表或数组结构,有两种表达形式: 每个列表成员占一行,以横杠和空格(- )开头 所有列表成员在同一行,被方括号([])包围,列表成员间以逗号和空格分隔 也支持Map结构,同样也有两种表达形式: 每个KV对占一行,键值用冒号分隔 所有KV对在同一行,被大括号({})包围, KV对之间用逗号和空格分隔,键值用冒号分隔 通常字符串不需要使用引号,但必要时可以使用单引号(’)或双引号(”),比如需要使用转义字符时 可以使用两个叹号(!!)来强制指定格式(这个感觉用处不大,但是万一用到了呢) 内容可以重复使用,原始位置的内容用(&标记名)来标记,在引用位置用(*标记名)来引用 如果想在一个文件里面配置不同的profile,可以使用三个横杠“—”将yaml文件分割成多个独立区域,每个区域被视为一个独立的文件。三个点号“…”用来标识文件结尾。 如示例代码,在一个yaml文件中存在多个独立区域时,使用spring.profiles属性来标识配置区域的profile信息。 多环境配置 在主配置文件application.yml之外,还可以有多个外部配置文件,其名称格式固定为application-{profile}.yml。 SpringBoot会根据主配置文件中的spring.profiles.active参数来决定加载哪个配置文件。 通过这种方式SpringBoot实现了支持多环境配置,从而能够在不同环境下(开发、测试、生产)进行配置参数的切换。 主配置文件中的spring.profiles.active属性还可以有多个值,每个值以逗号进行分割: 这种方式允许我们为不同需求创建不同的配置文件。SpringBoot会依序加载每个值指向的配置文件。 配置文件的加载顺序是主配置文件application.yml,spring.profiles.active指定的外部配置文件。如有冲突项,后面加载的配置会覆盖前面的。 如果多个外部配置文件有相同的配置项,建议在主配置文件中进行配置。 如spring.profiles.active指定的值无法与任何外部文件匹配,SpringBoot会尝试加载application-default.yml文件。 结合@Profile实现内部实例的动态选择 spring.profiles.active参数不仅可以指明要使用哪个外部配置文件,也可以控制内部实例的选择。这需要通过配合@Profile注解实现。 如下例: 如果没有@Profile注解,在启动的时候SpringBoot就会报错,因为为一个Worker类提供了两个实例。但是现在,SpringBoot可以根据spring.profiles.active指明的profile和@Profile注解来选择注入哪个实例。 @Profile注解可以用于含有@Component、@Configuration、@Bean等注解的类及其方法。 @Profile注解也可以有多个值,如下: 这样,在profile是dev或test时,这个Bean都可以被成功注入。 配置项获取 使用SpringBoot的配置项有两种方式:通过@Value注解或通过@ConfigurationProperties注解。这两种方式各有长处,可根据进行选择。 通过@Value注解获取 @Value注解适用于单个配置项的获取,比如我们可以获取当前的外部配置文件的profile: @Value注解的一个优势是可以使用SPEL表达式(关于SPEL表达式,我有整理过:《SpringBoot SpEL表达式》),如下是一个非常粗略的SPEL表达式: @Value注解的不足之处在于只能获取直接类型的值或字符串,不能映射为复杂类型。 通过@PropertiesConfiguration注解获取 @PropertiesConfiguration注解的主要特点是可以将配置映射为对象。因此平时还是通过这种方式获取SpringBoot配置为主。 @PropertiesConfiguration注解可应用于类或成员方法。 如下是将应用于类的示例: 从示例代码中可以看到配置类需要有@Component注解或@Configuration注解,以便完成注入。 此外,在使用@ConfigurationProperties注解的时候需要传入注入配置属性的前缀,以便获得配置项的范围。 在成员方法上使用@PropertiesConfiguration注解则是一种更为灵活的方式,能够充分弥补@Value注解的不足,示例如下: 注意这里还需要用到@Bean注解,以便将读取到的配置信息注入到实例上。不过不能通过getWorker()方法调用,否则获取的还是一个只有默认值的对象。要使用该实例还是需要通过@Autowired注解来注入。 最后,可以看下我在GITHUB上的示例应用,在里面我尝试了SpringBoot配置的各种应用实践。 就这样。

    [阅读更多...]