• SCF: 简单配置门面


    SCF: 简单配置门面

    [English]  [中文]

    Simple Configuration Facade, 简写为 SCF。是 代码外部配置 (properties文件, 环境变量,系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命名上和另一个著名组件slf4j (Simple Logging Facade for Java)相似, 在配置领域的地位也和slf4j (.NET可类比NLog)在日志领域的地位相同。

    SCF使得代码和外部配置分离。代码使用一个配置项,无需关心配置项在哪里配置,如何配置。

    arch

    用法

    示例

    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个配置管理器可以管理多个配置源, 不同的配置源具有不同的优先级 。配置管理器按优先级从配置源获取配置值。

    核心概念间的关系

    arch-class

    核心逻辑

    get-property-value

    开发者

  • 相关阅读:
    全网通5X_AL10 非定制版 固件汇总
    system.new.dat解压工具sdat2img
    linux 平台中 Android5.0的更新包中system.new.dat文件的解包
    【 henuacm2016级暑期训练-动态规划专题 A 】Cards
    【BZOJ 1486】 [HNOI2009]最小圈
    【BZOJ 1433】[ZJOI2009]假期的宿舍
    【BZOJ 1412】[ZJOI2009]狼和羊的故事
    【BZOJ 1305】[CQOI2009]dance跳舞
    【Codeforces Round #483 (Div. 2) C】Finite or not?
    【Codeforces Round #482 (Div. 2) C】Kuro and Walking Route
  • 原文地址:https://www.cnblogs.com/koqizhao/p/9552395.html
Copyright © 2020-2023  润新知