SCF: 简单配置门面[转]
原文:https://blog.csdn.net/koqizhao/article/details/82178100
Simple Configuration Facade :简单配置门面 是 代码 和 外部配置 (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
安全的配置
可以通过1个value filter来自动检查外部配置的正确性。
动态配置
配置可以是动态变化的。配置项的值自动更新。用户也可添加Listener监听配置项的变化。
多配置源
多个配置源有不同的优先级。配置项的值按配置源的优先级自动计算。
可扩展
scf-core 里只定义了一组接口抽象和默认实现。所有核心概念都是可扩展的(配置管理器,配置源,配置项等等)。用户可以自由地对默认实现进行扩展,或者编写自己的实现。
一些常用扩展:
scf-simple
scf-labeled
scf-yaml
scf-apollo
轻量
无线程使用,只使用少量内存来缓存配置项。
支持多线程并发
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个配置源里有配置项
配置源(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个配置管理器可以管理多个配置源, 不同的配置源具有不同的优先级 。配置管理器按优先级从配置源获取配置值。
核心概念间的关系
核心逻辑
转载于:https://www.cnblogs.com/wangcp-2014/p/10087966.html
SCF: 简单配置门面[转]相关推荐
- SCF: 简单配置门面
Simple Configuration Facade, 简写为 SCF.是 代码 和 外部配置 (properties文件, 环境变量,系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命 ...
- SLF4J 简单日志门面 介绍和使用
参考:http://singleant.iteye.com/blog/934593 http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...
- 简单配置nginx反向代理,实现跨域请求
简单配置nginx去做反向代理,实现跨域请求 简单介绍nginx的nginx.conf最核心的配置,去做反向代理,实现跨域请求. 更多详细配置,参考nginx官方文档 先介绍几个nginx命令 打开n ...
- Centos 6.5下一个SNMP简单配置(snmp protocol v3,监控宝)
Centos 6.5下一个SNMP简单配置(snmp protocol v3.监控宝) jom_ch@2014/7/25 1,安装 >yum -y install net-snmp net-sn ...
- virtualbox 创建桥接网络_VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
VirtualBox桥接网络的简单配置,让虚拟机直接访问网络 分类: Linux 2009-08-20 08:59 5071人阅读 评论(0) 收藏 举报 (1)最新的 VirtualBox 可以简单 ...
- Webpack4 学习笔记 - 01:webpack的安装和简单配置
安装 webpack 新建一个Demo文件夹,执行初始化: npm init 在Demo文件夹里安装 webpack 和 webpack-cli : npm install webpack webpa ...
- yum源的超级简单配置
yum源的超级简单配置 1.先挂载光盘. 使用命令"mount -o loop /dev/sr0 /mnt/cdrom".如果使用命令"mount -o loop ...
- Apache简单配置(4)搭建Discuz 7.0.0论坛
Apache简单配置(4)搭建Discuz 7.0.0论坛 RHEL5.3 基本网络配置 一. 1.RHEL5 U3:如图1 (如图1) 2.#hostname //查看当前主机的主机名:如图2 (如 ...
- maven存在的意义及其与eclipse的简单配置
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 以上定义源自百度百科. 其实,我认为,Maven是一个采用纯Java编写的开源项目管理工 ...
- 20 ubuntu 中科大源_Linux-Ubuntu简单配置-换国内源-中文显示
Linux-Ubuntu(个人示例使用版本20.04,其余版本区别不大) 好像知乎的动图加载有问题,这个动图应该阔以(*^▽^*)Linux-Ubuntu简单配置-更换国内源-中文设置www.bil ...
最新文章
- 深入理解Javascript闭包(一)
- ”过程”在敏捷开发中的位置
- 深入理解 JVM Class文件格式(九)
- 使用kibana和elasticsearch日志实时绘制图表
- 【从Northwind学习数据库】汇总查询
- 一、为什么会产生field概念 二、MBAFF
- NB-IOT紧急按钮
- 为markdown目录标题添加序号
- 2020 BAT/大厂/银行 Java后端开发 校招实习生要求
- 基于vue2.0的一个分页组件
- android 谷歌地图_Google天空地图可将您的Android手机变成数码望远镜
- 基于Caffe ResNet-50网络实现图片分类(仅推理)的实验复现
- Bitwise Exclusive-OR Sequence
- win10:打印机无故脱机、打印机缺纸故障处理
- 什么是DAOstack
- WMT 2022国际机器翻译大赛发榜,微信翻译斩获三项任务冠军
- 【商业信息】国家地区语言缩写码
- 【jzoj5055】【GDOI2017模拟二试4.12】【树上路径】【点分治】
- 平板电脑与计算机连接网络,终于发现平板电脑怎么连接网络
- shell 获取当月最后一天的方法
热门文章
- 备案号链接工信部_网站主页底部网站备案号的悬挂和链接的工作通知
- Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​
- 都在这儿了!Flink Forward Asia 最佳参会指南
- Android Multimedia框架总结(二十五)MediaProjection实现手机截屏(无须root)
- springboot 微服务_Spring Boot在微服务中的最佳实践
- mysql 数据字典详解_MySQL8功能详解——数据字典
- 曙光服务器怎么进入bios_曙光服务器怎么进入bios
- 计算机网络中什么是突发错,计算机网络基础习题(含答案)
- postgis java_Postgresql结合postgis使用java的JDBC连接
- jlabel 不能连续两次set_请问一个JAVA中JLabel的setFont()问题?