背景:我们都看到了几种配置分布式应用程序的方法。为了我的目的,其中两个脱颖而出:
拥有一个所有节点都可以访问的海量数据库。每个节点都知道自己的身份,因此可以对所述数据库执行查询,以获取特定于自身的配置信息。
使用定制的(即,特定于每个节点)配置文件(例如,JSON),使得节点根本不必触摸数据库。他们只是阅读量身定制的配置文件并按照它说的做。
每个人都有利弊。出于我的目的,我想进一步探讨#2a,但我遇到的问题是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辆自行车,每辆都是车型。
更进一步:
bike[i=0..3](Vehicle)
label: "hello %i"
label.3: "last"
现在这样做是为了命名索引变量'i',以便它可以用于每个项目的配置信息。将输出的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"
}
}
}
您可以看到最后一个标签是如何被覆盖的,因此这是一种稀疏指定内容的方法。那里有什么可以让人这样做吗?
谢谢!
答案 0 :(得分:1)
不是将元语言视为一个整体实体,而是将其分为三个部分可能更好:
输入规范。您可以使用配置文件语法来保存此规范。
可以使用print语句和for循环生成运行时配置文件的库或实用程序。想到 Apache Velocity 模板引擎作为适合此目的的东西。我建议你看一下它的user guide,以了解它能做些什么。
将上述两个项目连接在一起的一些胶水代码。特别是,粘合代码从输入规范读取 name = value 对,并将它们传递给模板引擎,模板引擎将它们用作参数来“实例化”您想要的配置文件的模板版本生成。
My answer to another StackOverflow question提供了有关上述想法的更多详细信息。