配置迷思

管邈
• 阅读 1770

几乎每个程序都需要处理一些配置。这些配置可以有各种形式:

  • 通过系统属性或者环境变量,呈简单的 x = y

  • 通过配置文件,例如 .properties 文件,.ini 文件,.yml 文件,.edn 文件。

  • 通过高大上的配置平台,例如 etcd, zookeeper 等。

但最影响程序设计的并非这些形式,而是如何在程序中使用这些数据。

最直接的想法是用全局变量:(def admin-user "admin"),然后需要这些数据的部分可以通过全局变量来获取其内容。

这种方式的优点是方便,缺点则是过于自由的形式让配置处理变得分散到程序各处,对于“配置”这一本身有内聚性的需要没有恰当的一致处理。它还建立了随意性的依赖,例如任何使用上述 admin-user 的代码变为依赖于它,一旦我们改变它的数据类型或格式,会造成广泛的更改,而且这些更改非常容易引入 bug, 可以轻松成为维护的噩梦。

任何基于这种形式的配置库都共享同样的问题。例如 clojure 的 easy-conf 框架,基于 stuartsierra.component 库的配置框架的问题也一样。

理解配置问题的关键是,配置究竟是什么?它与系统内的其他数据比起来的关键不同是什么?

我对此的回答是,

  • 配置在系统范围或session 范围或单次交互范围是只读的。这意味着我们不需要 var (变量)这样的灵活性。它也不像系统内的用户数据,是被用户请求来改变的。

  • 配置是一种模板。它限制了系统的的具体行为。

因此,我们可以认为配置是制造具体逻辑的构造参数,我们仅仅在建造系统时需要它,而不需要在程序的其他生命期内关心它的形式。在 clojure 语言中,这意味着我们用它来构造函数即可。例如下面这个构造器用存在 map 中的 admin-user 配置数据来分类处理 req:

(defn mk-admin-wrapper [{:keys [admin-user]}]
   (fn [req]
     (let [username (get-in req [:params :username])]
       (if (= username admin-user)
         (handle-admin req)
         (handle-normal req)))))
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springcloud的配置文件的读取顺序
SpringBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如application.yml。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有@PropertySource这样方便的加载方式,
Easter79 Easter79
3年前
spring通过注解@Value获取properties配置
在springmvc中,想通过注解读取\.properties文件的值,可以采用以下方式一.在springmvc.xml配置文件中配置<!加载配置文件<context:propertyplaceholderlocation"classpath:properties/.properties"/二.在相应
kenx kenx
3年前
SpringBoot 属性配置文件数据注入配置和yml与properties区别
前言我们知道SpringBoot通过配置类来解放一堆的xml文件配置,通属性配置文件,来进行,系统全局属性配置,这样极大的简化了我们开发过程,javaweb也可以甜甜的从此快速配置SpringBoot默认加载支持application.properties、application.yaml和application.yml三种拓展名结尾的全局属性配
Stella981 Stella981
3年前
Spring boot 配置文件,配置注解详解 (properties 和yml )
从其他框架来看我们都有自己的配置文件,hibernate有hbm,mybatis有properties,同样,Springboot也有全局配置文件。Springboot使用一个全局的配置文件,而且配置文件的名字是固定的。有两种application.propertiesapplication.yml spring
Stella981 Stella981
3年前
Linux脚本调用Java模板,将Properties文件放到CLASSPATH中的配置方式
为了方便管理配置文件,每次更改配置文件(例如:jdbc.properties,service.properties),我们不需要重新buildjar,所以将properties单独放到一个目录中,在liunx脚本调用java的过程中,我们将这些配置文件放到CLASSPATH中,并export。!/bin/bashLIBRA
Stella981 Stella981
3年前
Spring 学习笔记(三):Spring Bean
1Bean配置Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中。实际开发中常使用XML的格式,其中<bean中的属性或子元素如下:id:Bean在BeanFactory中的唯一标识,在代码中通过BeanFac
Stella981 Stella981
3年前
Azkaban Flow 2.0
都9102年,还用properties配置文件吗?非也非也。Azkabanflow2.0使用yaml进行作业配置:上传的文件夹中,可以包含多个project的yml配置文件。FlowYAMLFile关于Flow的文件有如下定义:每个Flow对应一个yml文件.Flow的名称以yml文件的名称,如:m
Stella981 Stella981
3年前
Spring Boot 核心配置文件 bootstrap & application 详解。
用过SpringBoot的都知道在SpringBoot中有以下两种配置文件bootstrap(.yml或者.properties)application(.yml或者.properties)为什么会有这两种配置文件呢?大家都清楚它们的区别和具体使用场景吗?bootstrap/applicati
Stella981 Stella981
3年前
Spring Boot配置文件详解
一、主配置文件SpringBoot默认主配置文件名为application.yml或者application.properties1.yml和properties1.1yml语法:key:空格value同一个层级的缩进tab或者空格必须相同
Stella981 Stella981
3年前
Kubernetes ConfigMap vs Secret
场景对比Secret:当你想要存储一些敏感数据时使用Secret,例如(passwords,OAuthtokens,sshkeys,credentials等)ConfigMap:当需要存储一些非敏感配置数据时可以使用ConfigMap,例如应用程序的ini,json等配置文件。ConfigMap:
LeeFJ LeeFJ
2年前
Foxnic-Web —— 参数体系
所谓参数即程序在运行时可以或得到的一些基础环境或相关的配置信息。这些信息来自各个不同的地方,有系统参数、程序的启动参数,程序的YML配置文件参数以及系统本身在数据库配置表的配置参数。这些参数信息通过程序相互协同,使系统在不同是实施场景有不同的表现。