Shindig JAVA版本内部结构(译)

newidea 发布于 2010/01/20 00:26
阅读 1K+
收藏 0

英文原文:http://rollerweblogger.org/roller/entry/shindig_java_internals_diagram_updated

Shindig JAVA版本内部结构

 

我发表第一篇和第二篇 Shindig JAVA版本工作原理之后,Shindig已经修改了很多。现在Shindig中有两个分离的web services协议,下面我分享一下我对Shindig内部结构的了解情况。

 

注意:本文只包括了Shindig中social API的实现,没有关于Gadget server的部分。

 

我们来看看发生了什么。在OpenSocial spec邮件列表中曾经有长篇的讨论,关于REST和RPC这两种OpenSocial网络服务API到底哪个更好 。(比如。 这里这里)。我不打算再讨论这两方。简单来说,这里并不存在真正的竞争,在OpenSocial 0.8.1中包括了两个并存的网络服务协议:

 

虽说为了达到同一个目的而使用了两种方式有点郁闷,但是幸运的是它们有很多相似之处.比如说, JSON-RPC 协议的方法有GET, POST, PUT 和 DELETE。而且 在JSON-RPC和REST API中使用的+JSON格式是一样的。这样使事情变得稍微简单一些,如果用Shindig作为OpenSocial实现,只要实现了一组接口就可以支持 REST和JSON-RPC两种方式。下面我解释一下具体是怎样工作的:

diagram

接下来我会解释一个请求的全部过程; 新加的部分用 黄色高亮显示:

1… 一个请求通过 /social/rest 中的 DataServiceServlet 或者 /social/rpc中的 JsonRpcServlet 进入Shindig, 这两个Servlet各包含一个DataRequestHandler (从HandlerProvider中取得)的map用各自处理的路径做键值。同时还包括一对JavaBean的转换器,在后面的处理中用来转换输出的POJO到XML或者JSON格式。

2… Servlet 创建一个 RequestItem, 这个对象用来解析请求,后面需要用到。这个对象也有两个转换器,用来转换XML或者JSON数据到Java POJO。

有两个不同的RequestItem,一个给REST请求用的RestfulRequestItem和一个给RPC请求用的RpcRequestItemRestfulRequestItem解析进来的URL的参数等信息,把PUT或POST的数据作为输入,自动地从JSON,XML或者ATOM转换成Java的POJO对象,根据SPI中的规范。

如果是在RPC中,所有的数据都是通过POST方式,RequestItem会从发送到服务器的JSON对象中提取参数和输入负载。

3… Servlet调用合适的处理程序。 如果是一个单一的请求,Servlet按照请求的”路径”(比如,URL路径信息中的第一截),查找DataRequestHandler对象。Servlet调用选中的handler对象来处理这个请求。 如果是一个批量的请求,Servlet将循环进行以上的操作。

4… Shindig中三个处理器中的某一个处理器处理进入的请求 然后返回一个或多个ResponseItem,其中包含了用来返回的多个Java POJO对象。 在这里通过调用 requestItem.getTypedParameter(),进入的XML和JSON被反序列化成POJO。 Shindig 提供了三个 DataRequestHandler:

  • PersonHandler: 返回Person对象包括详细的用户资料
  • ActivtyHandler: 返回用户或者组的Activities 对象,也可以新建Activity
  • AppDataHandler: 返回应用数据,并可以让应用存储数据

注意: 如果你要添加自己的 REST/RPC 接口来扩展Shindig, 像我们在 SocialSite中做的, 你可以插入你自己的处理程序。 使用 Guice 依赖注入来挂载你自己的 HandlerProvider, 返回你自己的处理器对象(handler)。

5… Shindig 处理器调用 Shindig服务提供者 (SPI), SPI是一系列返回ResponseItem的接口。 里面有一系列的不同类型的POJO模型对象,用来做REST和RPC调用的返回结果。 服务的具体实现返回这些POJO对象,然后Shindig会自动地把他们转换成合适的JSON或者XML。

  • PersonService: 返回Person对象包括详细的用户资料
  • ActivtyService: 返回用户或者组的Activities 对象,也可以新建Activity
  • AppDataService: 返回应用数据,并可以让应用存储数据

注意: 如果你想通过标准的OpenSocial REST或者RPC接口来展现你程序中的社会化数据,SPI就是接入点。你需要自己实现这些接口来调用你自己的后台来创建,获取,更新和删除数据。接入也是通过Guice来做。

6… 处理器返回一个ResponseItem, 其中包括了一个或者多个POJO对象。Servlet可能直接输出或者在批量请求的情况下继续调用处理器来收集更多的ResponseItem对象。

7…Servlet 转换并序列化,最后返回ResponseItemREST API中, 当一个或者多个处理器返回了ResponseItem之后, DataServiceServlet 调用合适的转换器来序列化ResponseItem到JSON或者XML格式, 这个取决于在请求中的’format’参数。

加载中
返回顶部
顶部