app后端架构设计(转)

(1)Restful设计原则

Restful风格:RESTfu设计原则,它被Roy Felding提出(在他的”基于网络的软件架构“论文中第五章)。而REST的核心原则是将你的API拆分为逻辑上的资源。这些资源通过http被操作(GET ,POST,PUT,DELETE)。

但现在看,一般的操作只有两种:GET ,POST。

这个设计原则最简单的应用就是根据object而不是页面来设计api。最开始的时候,app的一个页面需要什么数据,api就返回什么数据。结果随着app的UI不断改版,需要的数据不断变化,不停地修改api,最后当api的改动会影响以前的版本的时候,只能写一个新的api版本,最后弄得api中有很多_V2,V3这样的标志,恶梦!

后来在网站的重构过程中,就根据object来设计api,但根据object来设计,又有一个问题,一个大object可能包含很多小object,是一个api返回全部小object,还是分为多个api返回?根据业务和技术,带宽等仔细考虑吧。

(2) api的命名

其中一个原则,一看api名字就知道这个api是干啥。在创业团队中,一般就只有一两个人负责后台,当你要负责几十甚至上百个api,你就知道不能“望名知api”是个什么样的痛苦。

(3)    安全性,请看 http://blog.csdn.net/newjueqi/article/details/18887571

(4) api返回数据

app客户端的语言 java 和object-c都是强类型语言,所以怎么处理空值显得特别重要,不合理的设计很容易造成app的闪退。

从后台的角度来说,api中返回的数据中,正确值和空值的类型必须一样,举例,用户名的字段是“realname": "xxx”,如果用户名为空,则应该返回“realname": ""。如果返回值是一个array,空数据则返回一个空array,绝对禁止null值。

对于客户端,必须用个全局的函数来处理所有api的返回数据,需要有一个机制:对于某个客户端需要数据,如果api中缺失,客户端自动补上并给予默认值。这个机制在我们的实践中大大减少了app的闪退。

同时,在数据库设计的时候,一个合理的设计必须是所有字段都有默认值,不应该允许null值。null在大量的语言和数据库中,会带来无穷的问题。对于这个数据库设计原则,我以前不太明白,现在经历了一年的api设计后,终于懂得。

如果客户端是php,还有一个问题,php中数组和字典都是array,但在java 和object-c中是不一样,这个问题一定要注意。

(5)图片的处理

在不同版本的app中,各种不同尺寸的手机中,同一张图片显示的尺寸可能是不一样,如果每次都需要用返回原图,然后在客户端处理,则极大浪费网络资源。而如果是后台处理好图片才返回,则又是一个挑战,怎么有效保存和裁剪多种图片尺寸呢

例如,一开始头像只需要返回60*60的尺寸,后来在新的版本需要返回70*70, 又出了一个新版本,需要返回80*80, 每次增加一个新的尺寸,怎么在数据库上记录下来。这个问题在一开始做api的时候没考虑,后来不得不用了一个极端的方法,没增加新的图片尺寸,就在数据库中增加一个新的字段,保存并生成新的图片尺寸,结果最后数据库的头像字段有"avatar","avatar_60_60","avatar_70_70","avatar_80_80",这种极度恶虐的设计。

最后,针对图片,我们才用了这样的策略:

(1)客户端本地缓存图片,只有没有合适的图片,才去服务器取。

(2)当客户端需要某种尺寸的图片,由客户端告诉服务端图片的尺寸,服务端动态生成并缓存起来。

例如,客户端需要图片(http://www.baidu.com/img/bdlogo.gif)的80*80的尺寸,则在图片的路径加上宽和高的参数(类似于CDN的机制) http://www.baidu.com/img/bdlogo.gif?w=80&h=80, 则服务器就生成80*80的尺寸并返回。

采用了这样的图片处理机制,数据库中只要有一个字段保存原图就行了,其它尺寸就由客户端告诉服务端动态生成。以后无论什么尺寸的图片,数据库中都不需要记录,数据库只有原图就行了。

(6)返回的提示信息

最科学的情况,服务端只返回信息代码,具体的文字提示由客户端决定。

如果文字信息是由服务端返回,则最起码要区分2种信息:提示用户的信息,提示客户端程序员的信息。这两者的区别:

1.提示用户的信息是要在让客户知道的,提示客户端程序员的信息不需要让客户知道的。

2. 提示用户的信息文字很友好,客户不需要专业基础一看就知道是什么,提示客户端程序员的信息则很专业,例如告诉客户端少传了哪个参数?哪个参数有问题等等。

(7)在线api文档和测试

我们网站的api在线测试文档,既是一份在线api文档,也是一个在线测试工具,极大方便沟通和测试。每次客户端程序员觉得某个api有什么问题,我们就是这个在线工具上讨论沟通的。客户端程序员最喜欢这个玩意了^-^。

上个图解一下馋(这个图是旧版的api,已经弃用了):

负责做这个功能的同事专门写了篇博客详细介绍了这个在线api测试文档,还带有demo:

http://amuropikin.iteye.com/blog/1701537

----------------------------------------------------------------------------------------------------------

个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务。基于这个原则,就有了下面的系统架构:

1. apns:由于在apns中,无效的token会导致连接apns连接的失效从而使apns信息丢失。解决的方案是维护发送队列,当apns服务器返回错误的token后,把这个错误token后的消息重发。第三方推送很好了实现了这个技术方案,我们选择了百度云推送。

2. email:要考虑邮件发送失败的重发问题,所以不再在服务器上搭建sendmail服务发送,选择了邮件服务商mailgun。mailgun还提供每个账号每月1万封邮件的免费额度,很适合创业团队。

3. coreseek: 一个基于Sphinx的全文检索引擎。在前面描述的LBS模块中,和检索用户昵称,商铺等搜索功能上需要用到。

4. redis:一个支持多种数据结构的key-value数据库,在LBS模块,性能优化等多个方面都有广泛的用处。

5. httpsqs:轻量级的消息队列。

6. xmpp:采用了开源的openfire,当web服务需要向openfire通讯,有两种情况:

(1)实时的需求,例如注册的时候在聊天服务器注册一个用户,那么是直接连聊天服务器。

(2)如果是其它非实时的需求,例如通过聊天服务器向app发送一个更新通知,那么就在队列中处理。

7. 监控,采用了监控宝和云服务器提供的监控数据,能满足目前的需求了。

参考:

http://blog.csdn.net/newjueqi/article/category/1743543

时间: 2024-11-05 11:43:44

app后端架构设计(转)的相关文章

Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime.Android Framework.Android Native Service.Android Binder.Android App.Android Testing.HTML5技术的源泉和精髓等核心技术,不仅仅是技术和代码本身,更重要的是背后的设计思想和商业哲学. 一.课程特色 l  贯通And

14.app后端如何设计api

app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参考. 1. 什么是api? 这个问题在以前发表的文章"7.app和app后端的通讯"中其实已经回答了,这里再重复一次. 相信大家都用过银行的柜员机(ATM)的查询余额,转帐,取款等操作. 当在柜员机取款的时候,我们输入要取款的金额,隔一会钱就出来了,如果因为有什么问题不能取款(例如超过取款

app后端api设计【转】

博客:https://blog.csdn.net/newjueqi/article/details/44037011 app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参考. 1. 什么是api? 这个问题在以前发表的文章"7.app和app后端的通讯"中其实已经回答了,这里再重复一次. 相信大家都用过银行的柜员机(ATM)的查询余额,转帐

社交产品后端架构设计

本篇文章会向读者展示几个架构设计的关键点,使一个社交应用能够成为真正的下一代社交产品.以下几个属性将会影响到架构的设计: a)可用性 b)可扩展性 c)性能和灵活性可扩展 目标 a)确保用户的内容数据能够很方便的被其他用户发现和获取. b)确保内容推送是相关的,不仅在语义上,也是从用户设备的角度. c)确保实时更新生成.推送和分析. d)尽可能地节省用户的资源. e)不论服务器负载变化如何,用户体验应保持不变. f)确保应用整体上是安全的 总之,我们要处理一个相当大的挑战,我们必须处理不断扩大的

15.app后端怎么设计用户登录方案

在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢?在本文中,给出了一套用户登录的解决方案,以供大家参考. 1. 保证登录的安全性,最起码要使用https协议 避免信息的泄露,最简单的方案是所有涉及到安全性的api请求,都必须要使用https协议. HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议

**15.app后端怎么设计用户登录方案(API权限安全)

在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢?在本文中,给出了一套用户登录的解决方案,以供大家参考. 1. 保证登录的安全性,最起码要使用https协议 避免信息的泄露,最简单的方案是所有涉及到安全性的api请求,都必须要使用https协议. HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议

Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&Browser架构设计与实战开发

在软硬整合领域, Android以其对软件和硬件的高度开放性引领了当今的软硬整合潮流,全世界正在进行一场轰轰烈烈的Android运动,Android以不可思议的速度渗透越来越广的领域,Android智能手机.Android智能电视.Android微波炉.Android平板电脑.Android智能机器人.Android车载系统等越来越多的Android产品涌入人们的工作和生活中,自从Google的[email protected]战略发布以来,更是让世界对Android充满了怦然心动的期待,可以预

我的架构经验系列文章 - 后端架构 - 设计层面

设计层面: 分层架构 分层架构是项目设计中很重要的一点,从根本的目的上来说就是为了职责的分离.最经典的三层架构,到四层五层六层,甚至有人开玩笑说十八层的分层,根据项目的需要可以分不同的层.这里说的层其实是逻辑层,从物理层的角度来说也有三层.四层五层的分层架构.之所以三层架构这么流行是因为它的分层把大的关注点进行了分离,层数恰到好处,表现层.业务逻辑层和数据访问层,分别处理面向用户呈现的.面向逻辑处理的和面向数据库存取数据的三大关注点.UI前端框架最新力作!有奖试读! 在分层架构中除了分层之外还需

APP系统架构设计初探

一,图片体验的优化. 在手机上显示图片,速度是一个非常重要的体验点,试想,如果您打开一个网站,发现里面的图片一直显示失败或者是x,稍微做得好一点的,可能是一个不消失的loading或者是菊花等等,但不管如何, 没能快速的拉取和展示图片对用户体验是一个极大的挑战.那么,手机上的图片体验如何做呢?这里笔者有些小总结: 1,减少图片的大小.在失真度和图片大小中做好折衷,尽量利用工具减少图片的size,也可以考虑利用不同的图片格式. 2,减少图片的请求数.可以考虑把多个图片利用类似css sprite的