来自本人专利号:EMC-14-0787
1)为什么需要元数据
当我们设计好公司基本的REST框架之后,用户可以通过DSL实现灵活的查询特定字段/过滤/排序以及批处理。 是不是这些就够了。
现实中却不是的,通常REST framework的消费者会有多个组件,它们如果也是对外提供REST服务,但是必须依赖于其它组件提供的REST服务,这时候需要
更灵活的元数据框架了。
2)元数据长什么样
GET api/v1/types/disk
{
attributes: [
{
"size" : "100"
"unit" : "bytes"
},
{
"size" : "100"
"unit" : "bytes"
},
..............................
],
methods: [
{
"name" : "create",
"parameters" : [
{
"name" : "identifier",
"type" : "int",
"rangeMin" : "1",
"rangeMin" : "100"
},
{
"name" : "size",
"type" : "int",
"rangeMin" : "1",
"rangeMin" : "1"
}
]
},
{
"name" : "update",
"parameters" : [
{
"name" : "identifier",
"type" : "int",
"rangeMin" : "1",
"rangeMin" : "100"
},
{
"name" : "size",
"type" : "int",
"rangeMin" : "1",
"rangeMin" : "1"
}
]
},
...........
],
"name" : "disk",
.......................
}
如你所见,以上是请求某一个对像类别时返回的元数据信息,全部是对像的信息。对比WSDL,要实现服务发现,基于元数据非常容易。 每个对像的方法的描述需要加上对应的相对 REST URI即可。
3)如何时设计元数据框架
想像一个Java 类,有各种作用于类、属性、方法的 Annotation,这就是我们想要的静态信息,解析这个对象模型存到数据库里面。这样通过基础的REST查询框架可以得到元数据。
如何想通过元数据生成对应Controller , Service, DAO之类的,只需要结合任何一个模板引擎即可,当今最流行的 freemarker和velocity,Groovy都可以胜任,当然也可以像我们一样自已写一个。
4)如何存放元数据
元数据存放在数据库中,可以是独立的数据库。基于对象模型,自动更新元数据至最新的版本。
5) 如何扩展元数据
现实中系统的元数据分为静态部分和动态部分 , 比如系统中某个 service 可不可用等, 某的服务的feature有没有enable, 这些都是动态变化。
当然,你可能会想 这些完全可以通过把feature看成一个和disk一样的对象来获取状态就行了,Good point. 不足的地方是当多个service之间有相系统的依赖关系,
那要发多少REST requests 以及 判断逻辑 来搞清楚究竟服务可不可用。
这个时候就需要动静结合了。 不错 , 各种服务本身也有feature 或者 service状态表中的数据,但是需要和静态的关系图作JOIN查询,听上去比较复杂。
限于专利,这里就不提供代码了。 想要设计的同学可以留言,我会提供support 。
阅读(773) | 评论(0) | 转发(0) |