SCF: 简单配置门面
SCF: 简单配置门面
Simple Configuration Facade, 简写为 SCF。是 代码 和 外部配置 (properties文件, 环境变量,系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命名上和另一个著名组件slf4j (Simple Logging Facade for Java)相似, 在配置领域的地位也和slf4j (.NET可类比NLog)在日志领域的地位相同。
SCF使得代码和外部配置分离。代码使用一个配置项,无需关心配置项在哪里配置,如何配置。
用法
java: https://github.com/mydotey/scf/tree/master/java
dotnet: https://github.com/mydotey/scf/tree/master/dotnet
示例
https://github.com/mydotey/scf-best-practice
功能
强类型
核心抽象是强类型的Property<K, V>, Key和Value都是强类型。
安全的配置
可以通过1个value filter来自动检查外部配置的正确性。
动态配置
配置可以是动态变化的。配置项的值自动更新。用户也可添加Listener监听配置项的变化。
多配置源
多个配置源有不同的优先级。配置项的值按配置源的优先级自动计算。
可扩展
scf-core 里只定义了一组接口抽象和默认实现。所有核心概念都是可扩展的(配置管理器,配置源,配置项等等)。用户可以自由地对默认实现进行扩展,或者编写自己的实现。
一些常用扩展:
轻量
无线程使用,只使用少量内存来缓存配置项。
支持多线程并发
Manager/Property的方法都是线程安全的,可以多线程并发使用。时间复杂读为O(1),和ConcurrentHashMap相同。
容易使用
scf-simple 对最简单常用的Property<String, String>
场景进行了实现: properties file, memory Map, system properties, env variables.
参考:
核心概念
配置项(Property)
配置项是可以在代码里独立使用的配置单元,有1个唯一的Property Config和1个强类型值。
代码可以监听配置项的动态变化。配置项的值由配置管理器(Configuration Manager)自动更新。
配置项配置(Property Config)
配置项配置具有以下组成部分:
Key: 在1个配置管理器里唯一标识1个配置项。最常见的类型是String,也可以是其它强类型的对象。
Value Type: 配置项的值的类型。
Default Value: 配置项的默认值。如果配置项在任何配置源里都没有配,使用此默认配置。
Value Converter: 值转换器。把1个类型的值转换为另1个类型的值。比如1个配置源里有配置项<K, V1>,但代码需要的配置是<K, V2>,值转换器<V1, V2>可以自动地把V1的值转为V2的值。
Value Filter: 值过滤器。主要用于检查配置源里取到的值的有效性。
配置源(Configuration Source)
1个配置项可以以多种形式来进行配置。例如内存字典、properties文件、环境变量、命令行参数、yaml文件等等。
多种配置方式可以一起使用。每种配置方式是1个配置源。配置源负责对配置项提供值。
有时1个配置源无法向某个配置项提供值,提供null(认为没有配置此配置项)。
配置项的Key无法被配置源识别。如key是1个强类型的对象
{ key: request.timeout, labels: { dc: aws-us-east1, app: 100000 } }
, 但是配置源只接受String类型的key。配置项在配置源里没有配置。
配置项在配置源里的值是类型A,但代码里需要类型B,PropertyConfig没有值转换器可以把类型A转为类型B,配置源也无法自动把A转换为B。
配置管理器(Configuration Manager)
配置管理器是代码和外部配置间的门面。代码从配置管理器获取配置项,不关心配置项在哪里配置,如何配置。
1个程序里可以只使用1个配置管理器,也可以使用多个不同的管理器。不同的组件可以使用不同的配置管理器,配置管理器也可以在不同组件间共享/传递。
配置管理器提供2个Api:
<K, V> Property<K, V> getProperty(PropertyConfig<K, V> config)
: 用于具有 稳定 的Key的 稳定 的配置项,返回1个 唯一 的配置项。 配置管理器 保持这个配置项,自动更新配置值,通知配置监听器配置项的变化。 代码 可以保持获得的配置项,多次重复使用。<V> V getPropertyValue(PropertyConfig<K, V> config)
: 用于具有 不稳定 的Key的 不稳定 的配置项。例如, 访问者 IP 作为配置项Key的一部分, 不确定程序里有多少配置项,不确定哪个配置项会被配置,何时会被配置。
配置源和配置优先级
1个配置管理器可以管理多个配置源, 不同的配置源具有不同的优先级 。配置管理器按优先级从配置源获取配置值。
核心概念间的关系
核心逻辑
开发者
- Qiang Zhao koqizhao@outlook.com
SCF: 简单配置门面的更多相关文章
- SCF: 简单配置门面[转]
原文:https://blog.csdn.net/koqizhao/article/details/82178100 Simple Configuration Facade :简单配置门面 是 代码 ...
- SLF4J 简单日志门面 介绍和使用
参考:http://singleant.iteye.com/blog/934593 http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...
- 小丁带你走进git世界一-git简单配置
小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config –global user.name BattleHeaer ...
- 以实际的WebGIS例子探讨Nginx的简单配置
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 以实际项目中的一个例子来详细讲解Nginx中的一般配置,其中涉 ...
- CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB,两条命令都可以 systemctl sta ...
- ssm简单配置
MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架. MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获. MyBatis 只使用简单的XML 和注解来配置和映射 ...
- 安装MariaDB和简单配置
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...
- BIND的进程一:DNS简单配置与的主从配置
DNS的简单配置和DNS的主从配置 摘要:DNS(Domain-Name Server) ,DNS的服务起到的作用就是名称解析,在网络通讯来说计算机与计算机是通过IP地址相互通信的, 当是IP地址 ...
- 转-squid介绍及其简单配置
本文原始出处:http://linuxme.blog.51cto.com/1850814/372960 1.Squid是什么? Squid中文权威指南:http://zyan.cc/book/squi ...
随机推荐
- CSDN 四川大学线下编程比赛第一题:数字填充
题目意思: http://student.csdn.net/mcs/programming_challenges peter喜欢玩数字游戏,但数独这种游戏对他来说太简单了,于是他准备玩一个难的游戏. ...
- Skip-External-Locking – MySQL性能参数详解
MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即“跳过外部锁定”.根据MySQL开发网站的官方解释,External-locking用于多进程条件下为 ...
- 【spring data jpa】jpa中criteria拼接in查询
示例代码: public static Specification<GoodsType> where(final GoodsType goodsType){ return new Spec ...
- Python学习(六)模块 —— 第三方库
Python 第三方库 安装第三方库 在Python中,安装第三方库包,是通过setuptools这个工具完成的.Python有两个封装了setuptools的包管理工具:easy_install和p ...
- HDU 4649 - Professor Tian(2013MUTC5-1007)(概率)
不知道这题算作什么类型的题目,反正很巧妙,队友小杰想了没一会就搞定了 为了学习这种方法,我也搞了搞,其实思路不难想,位运算嘛,只有0和1,而且该位的运算只影响该位,最多20位,一位一位地计算即可,只需 ...
- Python开发之AJAX全套
概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...
- java中读取配置文件中的数据
1.先在项目中创建一个包(如:config),再创建一个配置文件(如:a.properties),添加配置信息如下:比如:name=kakaage=28 2.代码:import java.io.IOE ...
- Open DJ备份与恢复方案
最近接手了一个Cognos项目,第三方用户认证采用的是和Open DJ集成.本人之前很多采用的是cjap ,当然这和cjap相比起来简单的多了,最起码你不必具有Java的基础知识就可以完全驾驭了! 一 ...
- [ACM] POJ 2524 Ubiquitous Religions (并查集)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23093 Accepted: ...
- (笔试题)数组A中任意两个相邻元素大小相差1,在其中查找某个数。
题目: 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路: 很明显,在数组中寻找 ...