寻找允许稀疏规范和输出的配置 DSL JSON
Looking for configuration DSL that allows sparse specification and outputs JSON
背景:我们都见过几种配置分布式应用程序的方法。出于我的目的,其中两个脱颖而出:
拥有一个所有节点都可以访问的海量数据库。每个节点都知道自己的身份,因此可以对所述数据库执行查询以提取特定于自身的配置信息。
使用定制的(即特定于每个节点的)配置文件(例如,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"
}
}
}
您可以看到最后一个标签是如何被覆盖的,所以这是一种稀疏指定内容的方法。是否已经有任何东西可以做到这一点?
谢谢!
与其将元语言视为一个整体,不如将其分为三个部分:
一个输入规范。您可以使用配置文件语法来保存此规范。
可以使用打印语句和 for-loops 生成运行时配置文件的库或实用程序。 Apache Velocity 模板引擎在脑海中浮现为适合此目的的东西。我建议您查看它的 user guide 以了解它的功能。
一些胶水代码将以上两项连接在一起。特别是,胶水代码从输入规范中读取 name=value 对,并将它们传递给模板引擎,模板引擎将它们用作 "instantiate" 模板版本的参数您要生成的配置文件。
My answer to another Whosebug question 提供了上述想法的更多细节。
背景:我们都见过几种配置分布式应用程序的方法。出于我的目的,其中两个脱颖而出:
拥有一个所有节点都可以访问的海量数据库。每个节点都知道自己的身份,因此可以对所述数据库执行查询以提取特定于自身的配置信息。
使用定制的(即特定于每个节点的)配置文件(例如,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"
}
}
}
您可以看到最后一个标签是如何被覆盖的,所以这是一种稀疏指定内容的方法。是否已经有任何东西可以做到这一点?
谢谢!
与其将元语言视为一个整体,不如将其分为三个部分:
一个输入规范。您可以使用配置文件语法来保存此规范。
可以使用打印语句和 for-loops 生成运行时配置文件的库或实用程序。 Apache Velocity 模板引擎在脑海中浮现为适合此目的的东西。我建议您查看它的 user guide 以了解它的功能。
一些胶水代码将以上两项连接在一起。特别是,胶水代码从输入规范中读取 name=value 对,并将它们传递给模板引擎,模板引擎将它们用作 "instantiate" 模板版本的参数您要生成的配置文件。
My answer to another Whosebug question 提供了上述想法的更多细节。