Cloud Foundry samples学习笔记8: Grails Twitter

来源:互联网 发布:动漫资讯网站知乎 编辑:程序博客网 时间:2024/05/19 17:52
这个样例程序是一个Grails应用程序,它模拟了类似于twitter的微博场景,旨在演示如何在一个Grails应用程序中将标准的SQL数据库、MongoDB和Redis三者结合使用,并使其能够部署到Cloud Foundry上运行。
程序repository地址:https://github.com/SpringSource/cloudfoundry-samples/tree/master/grailstwitter

一、MySQL用户管理

应用程序使用MySQL对用户信息进行管理,并进行访问控制。访问控制是通过Spring Security框架来处理的。domain.org.grails.twitter.auth 包内的Person、Authority两个域类分别表示用户信息及权限信息,均通过Hibernate进行OR映射,而PersonAuthority类则作为事务类与MySQL数据库交互。
用户所发布的状态(status)消息通过 domain.org.grails.twitter 包内的Status类表示,它分别持有1个Person和1个Authority引用来与状态的发布者关联并提供简单的访问权限。

二、MongoDB状态消息存储

用户发布的状态消息使用MongoDB面向文档数据库存储。之所以做出这种选择,是由于在微博网站应用中,需要存储用户会发布的大量状态消息数据,因此MongoDB是一个比较理想的选择;另外MongoDB也可以良好支持一些简单类型的内嵌集合数据结构,如String类型的列表。

用户状态类Status如下:

package org.grails.twitterimport org.grails.twitter.auth.Personclass Status {    static mapWith = "mongo"    static transients = ["author"]    static searchable = {        only = ["message", "dateCreated"]        authorId index: "no", store: "yes"    }    String message    Long authorId    List<String> tags = []    Date dateCreated    Person getAuthor() {        return Person.get(authorId)    }    static constraints = {        message maxSize: 160    }}

通过代码可以看到,Status类与MongoDB绑定,并限定状态消息为160字符以内。它持有一个String类型的列表属性tag,用来存储status中的标签,也就是两个#号之间用来标记话题的部分。将tag嵌在Status类内部而不是用单独的域类表示,这使得对tag的查询变得复杂并且低效,本程序对此的处理是建立另一个后台服务线程 service.org.grails.twitter.TagService,从status中提取tag以及对tag信息的搜集等工作都是由这个后台服务线程来做的。

三、Redis标记缓存

微博应用需要对状态消息的tag进行评级,并统计有多少状态中包含某个tag。然而这一操作的耗费是极其高的,尤其对于超大用户群的情形。本程序中,每当一条用户状态发布出来,就在后台线程TagService中对所有tag进行重新评级,并缓存在Redis数据库中。每次接收到来自主页的tag请求,就从Redis缓存中拉去,从而节省开销,提高响应速度。

以上只是对程序逻辑的简单介绍,至于更多细节以及三种数据存储服务之间的协作,请亲手部署并尝试,相信可以获得更清楚的认识。

四、将应用程序部署到Cloud Foundry

部署应用程序之前,最好修改属性文件中的应用程序名字,以避免默认的部署名字和url与云平台上已部署的应用冲突。比如,将 app.name=后的名字改成有自己特色的 grailstwitter-myname。确保你已经正确安装了grails的cloud foundry插件之后,就可以开始部署应用程序了。
grails prod cf-push
部署过程中,需要将程序与MySQL、MongoDB和Redis三个云服务绑定。部署完成之后,就可以通过url:grailstwitter.cloudfoundry.com 访问应用程序了。
原创粉丝点击