App后台api开发前的准备

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

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

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

  • 功能——业务逻辑思维导图

  • 基本功能模块关系

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

  • 编写API文档

  • 在设计稿中标注API

1. 业务逻辑思维导图

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

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

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

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

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

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

3. 基本功能模块关系

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

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

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

5. 编写API文档

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

6. 设计稿标注API

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

二、设计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测试文档中详细说明,方便客户端人员调试。

三、选择合适的数据库

  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

四、选择消息队列

1. 消息队列应用场景

消息队列可以把大量的并发请求变成串行请求,起到减轻服务器负担的作用。
有些小任务需要花很多时间,但是迟点完成也可以,就可以把这样的任务交给消息队列处理。比如一些不要求马上完成的发送邮件,推送消息的任务。

2. 消息队列介绍

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

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

五、搜索技术介绍

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

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工作流程如下:

《App后台api开发前的准备》

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

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

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

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

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

  6. 把数据返回给客户端

    原文作者:waterandair
    原文地址: https://segmentfault.com/a/1190000009724437
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞