重构 需要同时支持桌面和移动版本的后端开发的框架应该怎么设计

as181920 · 2013年04月14日 · 最后由 as181920 回复于 2013年04月15日 · 5186 次阅读

手上越来越多的情况需要同时有 pc 版和移动版,甚至应用只需要移动版,pc 上需要个管理功能。

1,最初,是用 Rails,偶尔需要 api 时候直接 render 一个 json,或者单独加一些路由专门 render json。在 api 少的时候方便,效率似乎有待考虑,特别这个 rails 工程本身已经比较臃肿且慢的情况。

2,用 sinatra 只给 api 返回 json,或者其它 (protobuf,thrift),管理后台用 rails 直接再做一个。问题是 model 中这个数据逻辑可能会重复写一次,这个不可接受,大了久了很难保证一致性。

3,我最希望的是只写一个逻辑后端,比如 ruby 写一个 api,pc 和移动都用这个 api。问题,pc 端也用 api 的话需要经过一层网络传输,再传输到客户端这样时间是否太久影响用户体验。如果后端已经有 json 接口,前端 js 也可以直接用了,这个时候用 rails 仅仅为了开发熟悉方便?(说实话写 js 对我实在不是兴趣而是劳动)

关联问题: 1,有用 protobuf 或者 thrift 的同学告知下为什么一定要用这个,比 json 省流量我知道,真的很有这个必要?以前这两个我都用过,都是客户或者公司研究院已定的情况。

2,用 ruby 只写 api 的话,用 grape?没玩过,有经验的可以稍指导下。

靠自己顶一个吧

别把 PC 和 mobile 浏览器看得差别太大。对大部分应用来说只要分别渲染不同的 view templates 就可以了。如果 mobile 端是非浏览器而是 app,则用 json api 对应。

#2 楼 @ashchan 移动端指 app,客户也好网络环境也好现在大部分还是要 app(web 页面的话直接考虑 html5 加 css 做兼容了)。 给 app 做了一套接口和逻辑供调用,也需要 web 页面时用 rails 做里面的 model 等逻辑再写一遍有点浪费,rails 里面再调用 api 走两次网络请求的响应时间会否可接受,主要是这个:)

rails 里面再调用 api 走两次网络请求

弱问为啥会有两次网络请求呢,不是就一个 json 么……

#4 楼 @aptx4869 用户访问页面从浏览器到 rails,rails 数据通过网络从 api 获取(非 model 直接取数据库)

#5 楼 @as181920 有点不明白,弱弱得问下,为啥不能直接在 controler 里 respond_to :html, :json 呢…… 将 api 分离出来有啥特别的好处么?

#6 楼 @aptx4869 1,专门做 api 不需要 rails 加载那么多东西;2,rails 工程如果做不好响应速度慢了会直接影响到接口的效率;3,页面和 api 混在一起在工程很大的时候维护不容易。

主要是效率,前面手上一个项目从老的维护过来已经感觉响应比较慢,项目比较臃肿,里面再掺杂 api 进去效率不高也不易维护。

@aptx4869 api 的 action 和 web 端的 action 在大部分情况下需要不同的处理。如果将这些不同处理的代码都写到 controller 里面会让 controller 的代码很臃肿很丑陋,如果将 api 的处理代码抽离出来,controller 的代码就会清爽很多。
@as181920 grape 可以集成到 rails 里,非常方便的,你可以用 rails 写管理系统,然后 api 方面单独由 grape gem 处理.grape 搭配 grape-entirty 使用,基本上手机 app 的功能都能搞定,而且代码会很清爽,具体的资料可以在 ruby-china 搜索一下 grape,之前有大大们讨论过 grape
protobuf 是 google 的数据包格式,优点是数据压缩后比 json 数据包的大小小很多,而且有很多语言的代码版本,集成起来很方便。
thrift 是 facebook/apache 的数据包格式,与 protobuf 不同的是可以用它来写 RPC,protobuf 有 RPC 的接口,但是没写实现代码. 通常对于需要大量处理网络数据的应用 (网络游戏) 这些压缩量还是可观的。想象一下如果网络游戏用 json 或者 xml 来传输数据,数据包大小会大 20 倍左右,对于实时性要求高的射击游戏来说,这 20 倍的数据量的增加是致命的,而 web 应用则没有游戏那么苛刻的要求,故很少使用这些数据包格式

#3 楼 @as181920 建议倒过来,业务逻辑等在公用的 model 和 service 层提供(比方抽成一个 gem),api 和 web 直接消费这一层。设计和实现上,把 api 和 controllers 放在同等层次。

#8 楼 @sailtsao

api 的 action 和 web 端的 action 在大部分情况下需要不同的处理。如果将这些不同处理的代码都写到 controller 里面会让 controller 的代码很臃肿很丑陋

还是没弄懂……也许会是这样,但是我问的是 LZ 说的第三种情况,

pc 和移动都用这个 api

如果 pc 和移动端都用同一个 api,为啥还需要不同的处理……

#9 楼 @ashchan 这是个好的方法,我得花点时间考虑下具体怎么抽怎么实现,Thx。

若不考虑现有 rails 系统很慢的问题,直接在 controller 目录下建一个子目录叫 api,然后在其中定义 v1 版的 api,v2 版的 api…

#12 楼 @keating 以前是这么干的,方便;现在是以 api 为主,web 为辅,api 多且大,所以考虑要另外的设计。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号