Rails系统重构:从单一复杂系统到多个小应用集群
2010-10-09 08:15:34 来源:WEB开发网app: course #名称,应用在系统中的唯一标识
url: example.com/course #url
api:
course_list: package/courses
从上文可以看出,通过只读数据库,我们可以完全无缝地读取其他应用的数据,并且代码非常简单明了,并没有增加应用间的耦合性。
只读数据库适应于业务逻辑比较简单的数据读取,如果数据需要预先进行复杂的操作,就无法简单地通过只读数据库取得数据。另一方面,应用间有时候确实需要进行一些写操作,这时候就需要借助于其他手段了。
Web Service
示例程序中,用户在purchase成功购买课程后,需要在learning这个应用中激活课程。这个过程可以通过Web Service来实现,由learning提供service接口,purchase调用这个接口并传递必要的参数。
Rails程序一般通过ActiveResource来简化service的开发,learning中提供服务的Controller代码示例如下:
# learning: app/controllers/roadmap_services_Controller.rb
def create
Roadmap.generate(params[:roadmap_service])
end
purchase通过RoadmapService来调用learning的service接口。
# purchase: app/models/roadmap_service.rb
class RoadmapService < ActiveResource::Base
self.site = :learning
end
RoadmapService.create(params)
我们对ActiveResource::Base类的site=方法进行了扩展,这样只需要指定提供service的应用名称(learning)就可以找到service的url。实现的原理仍然是通过向core发送请求,查询应用的url。
DRY
以上介绍了如何保持用户体验的一致性以及应用间如何交互,我们可以看到这些功能的实现方法与应用的业务逻辑并不相关,属于“框架支持代码”,所以为了避免代码重复并且进一步简化开发,我们把这些方法封装到gem里面,这样每个Rails应用只需要引用这个gem,就可以无缝地集成到框架中来,并且可以使用gem里面包装好的一系列方法。
更多精彩
赞助商链接