寻找允许稀疏规范和输出的配置 DSL JSON

Looking for configuration DSL that allows sparse specification and outputs JSON

背景:我们都见过几种配置分布式应用程序的方法。出于我的目的,其中两个脱颖而出:

  1. 拥有一个所有节点都可以访问的海量数据库。每个节点都知道自己的身份,因此可以对所述数据库执行查询以提取特定于自身的配置信息。

  2. 使用定制的(即特定于每个节点的)配置文件(例如,JSON),以便节点根本不必接触数据库。他们只需阅读定制的配置文件并按其说明操作即可。

各有利弊。出于我的目的,我想进一步探讨 #2,但我 运行 遇到的问题是 JSON 文件可能会变得非常大。我想知道是否有人知道适合生成这些 JSON 文件的 DSL。

逐步举例说明我的意思:

假设我编写了如下元语言:

bike.%[0..3](Vehicle)

这将输出以下 JSON:

{
    "bike.0": 
    {
        "type": "Vehicle"
    },

    "bike.1": 
    {
        "type": "Vehicle"
    },

    "bike.2": 
    {
        "type": "Vehicle"
    },

    "bike.3": 
    {
        "type": "Vehicle"
    }
}

想法是我们刚刚创建了 4 辆自行车,每辆都是 Vehicle 类型。

更进一步:

bike[i=0..3](Vehicle)
    label: "hello %i"
    label.3: "last"

现在这里做的就是给索引变量命名'i',这样就可以用来存放各个item的配置信息了。输出的 JSON 是这样的:

{
    "bike.0": 
    {
        "type": "Vehicle",
        "cfg": 
        {
            "label": "hello 0"
        }
    },

    "bike.1": 
    {
        "type": "Vehicle",
        "cfg": 
        {
            "label": "hello 1"
        }
    },

    "bike.2": 
    {
        "type": "Vehicle",
        "cfg": 
        {
            "label": "hello.2"
        }
    },

    "bike.3": 
    {
        "type": "Vehicle",
        "cfg": 
        {
            "label": "last"
        }
    }
}

您可以看到最后一个标签是如何被覆盖的,所以这是一种稀疏指定内容的方法。是否已经有任何东西可以做到这一点?

谢谢!

与其将元语言视为一个整体,不如将其分为三个部分:

  1. 一个输入规范。您可以使用配置文件语法来保存此规范。

  2. 可以使用打印语句和 for-loops 生成运行时配置文件的库或实用程序。 Apache Velocity 模板引擎在脑海中浮现为适合此目的的东西。我建议您查看它的 user guide 以了解它的功能。

  3. 一些胶水代码将以上两项连接在一起。特别是,胶水代码从输入规范中读取 name=value 对,并将它们传递给模板引擎,模板引擎将它们用作 "instantiate" 模板版本的参数您要生成的配置文件。

My answer to another Whosebug question 提供了上述想法的更多细节。