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

时间:2016-01-20 13:19:33

标签: json database configuration distributed-computing dsl

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

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

  2. 使用定制的(即,特定于每个节点)配置文件(例如,JSON),使得节点根本不必触摸数据库。他们只是阅读量身定制的配置文件并按照它说的做。

  3. 每个人都有利弊。出于我的目的,我想进一步探讨#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"
            }
        }
    }
    

    您可以看到最后一个标签是如何被覆盖的,因此这是一种稀疏指定内容的方法。那里有什么可以让人这样做吗?

    谢谢!

1 个答案:

答案 0 :(得分:1)

不是将元语言视为一个整体实体,而是将其分为三个部分可能更好:

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

  2. 可以使用print语句和for循环生成运行时配置文件的库或实用程序。想到 Apache Velocity 模板引擎作为适合此目的的东西。我建议你看一下它的user guide,以了解它能做些什么。

  3. 将上述两个项目连接在一起的一些胶水代码。特别是,粘合代码从输入规范读取 name = value 对,并将它们传递给模板引擎,模板引擎将它们用作参数来“实例化”您想要的配置文件的模板版本生成。

  4. My answer to another StackOverflow question提供了有关上述想法的更多详细信息。