App后台api开发前的准备

(整理自《App后台开发运维和架构实践》 做者:曾健生)java

1、从业务逻辑中提炼API接口

此过程可分为六个阶段:
  • 业务逻辑思惟导图mysql

  • 功能——业务逻辑思惟导图程序员

  • 基本功能模块关系web

  • 功能模块接口UML(设计出API)算法

  • 编写API文档sql

  • 在设计稿中标注API数据库

1. 业务逻辑思惟导图

抽象业务流程,列出结构关系,相同的元素(推送、评论、图片上传)用同一种颜色标记。api

2. 功能——业务逻辑思惟导图

列出功能模块业务逻辑相结合。
功能模块的划分,能够按照“人”、“事”来划分。“人”就是一个大模块,“事”要看有哪些事,相同的事就是一个模块,人和事之间的关系,就是关系模块 。数组

好比分析发消息这个业务:
  • 我 (我是人。“人”是一个模块)缓存

  • 消息 (消息是“事物”。“消息”是一个模块)

  • 我发消息 (发消息,是事件,不是事物,是人与物的关系,是一个关系模块)

3. 基本功能模块关系

理清各个模块之间的依赖调用关系

4. 功能模块接口UML (设计出API)

具体分析各个模块的具体的功能(具体的API),再根据上一步骤整理的模块间的关系,画出UML图

5. 编写API文档

提倡使用TDD(测试驱动)原则开发,编写在线API文档,既是一份文档,也是一个在线测试工具。
相关的开源工具:

6. 设计稿标注API

为了方便app端和web端的开发人员,快速理解和使用API,能够在设计图中在相应的界面相应的元素上,标注出须要的API,这个工做能够分析编写API文档同时进行。

2、设计API的要点

1. 根据对象设计API

API设计中最重要的是根据对象而不是界面来设计API,提升API的可扩展性。

2. API的命名

API的命名务必要作到从API名称就能明白这个API的做用。

3. API的安全性

  • 涉及到登陆和支付功能的,使用HTTPS协议

  • 使用URL签名的方式验证API请求的合法性

  • 使用AES对称加密的方式,保护API请求和返回中的全部数据
    ##### 更进一步的通讯安全:

  • 使用自定义的通讯协议传输敏感数据

  • 使用DES(非对称加密算法)

  • 使用邦邦加密、爱加密等第三方工具对APP进行加密

  • 涉及到支付功能的,每一次都须要输入密码,密码不在本地保存

  • 使用自主开发的输入控件输入敏感信息

4. API返回的数据

APP客户端主要开发语言java和objective-C都是强类型语言,因此绝对不容许返回null值。

  • 数据库设计时,全部字段都必须有默认值,不容许出现null。

  • app客户端必须用全局的函数处理全部API返回的数据,当返回的数据缺乏某个值时,自动补上一个默认值。

使用PHP做为APP后台的开发语言存在一个问题:PHP中数组和字典都属于Array,但在java和objective-C中这二者是不同的。

5. 图片的处理

app开发中,一般须要一张图片有多种尺寸,以适应app的不一样版本和各异的客户端。
建议:

  1. App客户端本地缓存经常使用图片,缓存不能命中时才去请求服务器

  2. App端须要的不一样尺寸的图片时,发送带尺寸参数的请求到后台,有后台动态生成并缓存。

  3. 文件云存储服务(七牛,又拍)和CDN都提供图片的缩放功能,高速的文件上传下载,有条件的状况下,推荐使用。

6. 返回的提示信息

最科学的状况是APP后台只返回信息代码,具体的文字由客户端决定。
须要给App客户端程序员返回的提示信息,要专业清晰,好比“少传了什么参数,哪一个参数有问题”

7. 关于API的版本升级问题

App客户端作了改版后,部分API不能知足需求了,这时就须要升级API,要避免同一个App客户端调用不一样版本的API,通常会所有升级。例如:原来是“xxx.com/v1/getpost”, 升级为“xxx.com/v2/getpost”。
注意:

  1. 升级版本时,V2版本的API的Controller必需要继V1版的Controller,这样V2版本的API只重写须要改动的API

  2. 完善文档,在线API测试文档中详细说明,方便客户端人员调试。

3、选择合适的数据库

  1. 内存型仍是硬盘型

  • 内存的读取速度大概是硬盘的80倍。

  • 内存容量颇有限。例如Ucloud服务器最多有64G内存,硬盘可高达1000G。

  1. Redis,MongoDB,mysql 读写数据的区别

存储服务 类型 说明
Redis 内存型 支持持久化保存到硬盘
mongoDB 混合 使用MMAP机制,操做内存完成文件读写
Mysql 硬盘型
  1. Redis,MongoDB,Mysql 查询数据的区别

存储服务 说明
Redis “键值对”存储,读写速度快
MongoDB、 Mysql 有id或索引,效率高;无id或索引,效率低
  1. Redis,MongoDB,Mysql 适用场景

存储服务 适用场景
Redis 适合存储读写频率很是高,且知道“键”的数据,好比用户身份信息,在登陆或其余操做中都能用到
mongoDB 大尺寸、低价值的数据;高伸缩性场景;地理坐标查询功能强大,适用于LBS应用。劣势:不支持事务,查询功能逊于sql
Mysql 最经常使用的存储服务,支持事务,支持复杂sql

4、选择消息队列

1. 消息队列应用场景

消息队列能够把大量的并发请求变成串行请求,起到减轻服务器负担的做用。
有些小任务须要花不少时间,可是迟点完成也能够,就能够把这样的任务交给消息队列处理。好比一些不要求立刻完成的发送邮件,推送消息的任务。

2. 消息队列介绍

消息队列通常包括三个角色:队列服务端,队列生产者,队列消费者。
常见的消息队列产品:

消息队列 介绍
RabbitMQ 重量级产品,支持大量协议,适合企业级开发;支持路由,负载均衡,数据持久化;自带web监控界面,方便监控。
Redis 轻量级,运维成本低
ZeroMQ 号称最快,适合大吞吐量场景

5、搜索技术介绍

搜索的基本原理是“分词”和“倒序索引”。
常见的开源搜索软件:

Lucene
很受欢迎的免费java信息检索程序库
solr
基于Lucene,查询语言更丰富,查询性能更好,提供了完善的功能管理界面。对外提供相似于Web-service的API接口,用户能够经过http请求向搜索引擎服务器提交必定格式的xml文件,生成索引;也能够经过http get操做提出查找请求,获得XML格式的返回结果。
ElasticSearch
它是一个基于Lucene的搜索服务器。它提供了一个分布式多用户的全文搜索引擎,基于RESTful Web接口。
Sphinx
Sphinx是一个基于Sql的全文检索引擎,其结合MySQL、PostgreSQL作全文索引,能够提供比数据库自己更专业的搜索功能,使应用程序更容易实现专业化的全文索引。Sphinx特别为一些脚本语言设计搜索API接口,如PHP、Python、Perl、Ruby等,同时为MySQL也设计了一个存储引擎插件。
CoreSeek
CoreSeek是一款中文全文索引/搜索软件,基于Sphinx研发,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户能够免费下载使用。
Coreseek有两个核心模块Indexer和Search。

  • Indexer: 负责从mysql拉取数据源,把数据源分词,创建索引

  • Search: 搜索模块

Coreseek工做流程以下:

图片描述

  1. Indexer模块从MySQL中拉取数据

  2. Indexer模块用通过中文分词后的数据创建索引

  3. 客户端向Search模块发起搜索请求

  4. Search模块查找索引中的数据

  5. Search模块获得索引中符合要求的数据的id等数据

  6. 把数据返回给客户端

相关文章
相关标签/搜索