(整理自《App后台开发运维和架构实践》作者:曾建生)1.从业务逻辑中提取API接口这个过程可以分为六个阶段:业务逻辑思维导图功能——业务逻辑思维导图基本功能模块关系功能模块接口UML(设计API)编写API文档并在设计稿中标注API1.业务逻辑思维导图抽象业务流程,列表结构关系,相同元素(推送、评论、图片上传)用相同颜色标注。2.功能——业务逻辑思维导图列出了功能模块和业务逻辑的组合。功能模块的划分可以按照“人”和“事”来划分。“人”是一个大模块,“物”要看里面有什么东西。同样的事物是一个模块,人与物的关系是一个关系模块。比如分析发送消息的业务:我(我是一个人。“人”是一个模块)消息(一条消息是一个“东西”。“消息”是一个模块)我发送一条消息(一条消息是一个event,notathing,butaperson)与事物的关系就是一个关系模块)3.基本功能模块之间的关系明确各个模块之间的依赖和调用关系4.功能模块接口UML(设计API)具体分析每个模块的功能(具体的API),然后根据上一步梳理出的模块之间的关系,画出UML图5.编写API文档提倡使用TDD(测试驱动)原则进行开发,编写在线API文档不仅仅是一个文档,更是一个在线测试工具。相关开源工具:swagger-uieolinkersosoapihttp://www.easyapi.com/6。设计稿标注API是为了方便app和web开发者快速理解和使用API??,可以在设计图中相应的界面元素上,标注需要的API,这项工作即可与API文档同时分析和编写。二、API设计的要点1.按照对象设计APIAPI设计中最重要的是按照对象而不是接口来设计API,从而提高API的可扩展性。2.API的命名API的命名必须能够从API名称中理解API的功能。3、API安全如果涉及登录和支付功能,使用HTTPS协议和URL签名验证API请求的合法性,使用AES对称加密保护API请求中的所有数据,返回#####更新更进一步的通信安全:使用自定义通信协议传输敏感数据使用DES(非对称加密算法)通过第三方工具如棒棒加密、爱加密等对APP进行加密。如果涉及支付功能,每次都需要输入密码。密码不保存在本地。使用自主开发的输入控件输入敏感信息。4.API返回的数据。APP客户端的主要开发语言是java和objective-C,属于强类型语言,所以绝对不允许返回空值。设计数据库时,所有字段都必须有默认值,不允许为空。应用程序客户端必须使用全局函数来处理API返回的所有数据。当返回的数据缺少某个值时,会自动添加一个默认值。使用PHP作为APP后台的开发语言有一个问题:数组和字典在PHP中都属于Array,但是在java和objective-C中是不同的。5.图片处理在APP开发中,一张图片通常需要有多种尺寸,以适应不同版本的APP和不同的客户端。建议:app客户端在本地缓存常用的图片,当缓存命中失败时,请求服务端App端需要的不同尺寸的图片,并向后台发送带尺寸参数的请求,后台动态生成并缓存。文件云存储服务(七牛、优拍)和CDN均提供图片缩放功能,高速文件上传下载,有条件的情况下推荐使用。6、提示信息返回最科学的情况是APP后台只返回信息代码,具体文本由客户端决定。需要返回给App客户端程序员的提示信息要专业清晰,比如“少了哪些参数,哪个参数有问题”7、关于API版本升级App客户端改版后,部分API不能满足现在的需求,此时需要升级API。为了防止同一个App客户端调用不同版本的API,一般都会全部升级。例如:原来是“xxx.com/v1/getpost”,升级为“xxx.com/v2/getpost”。注意:升级版本时,V2版本API的Controller必须接替V1版本的Controller,这样V2版本的API只重写需要改动的API。完整文档详见在线API测试文档,方便客户人员调试。3.选择合适的数据库内存类型或硬盘类型。内存的读取速度大约是硬盘的80倍。内存容量有限。比如Ucloud服务器最大内存64G,硬盘最大1000G。Redis、MongoDB、mysql读写数据的区别。存储服务类型的描述。Redis内存类型支持持久化存储到硬盘。MongoDB结合MMAP机制操作内存完成文件读写。Mysql硬盘类型Redis、MongoDB、Mysql查询数据。Redis“键值对”存储,读写速度快MongoDB、Mysql有id或索引,效率高;没有id和索引,效率低,知道“关键”数据,比如用户身份信息,mongoDB大容量、低价值的数据可以用于登录或其他操作;高可扩展性场景;强大的地理坐标查询功能,适合LBS应用。缺点:不支持事务,查询功能不如sqlMysql最常用的存储服务,支持事务,支持复杂SQL。减轻服务器负载的作用。一些小任务耗时较多,但可以稍后完成,这样的任务可以交给消息队列处理。例如,一些不需要立即完成的发送邮件和推送消息的任务。2、消息队列介绍消息队列一般包括三种角色:队列服务器、队列生产者、队列消费者。常用消息队列产品:消息队列引入RabbitMQ重量级产品,支持大量协议,适合企业级开发;支持路由、负载均衡、数据持久化;自带web监控界面,方便监控。Redis轻量级,运维成本低。ZeroMQ号称最快,适合高吞吐场景。五、搜索技术介绍搜索的基本原理是“分词”和“倒排索引”。常用开源搜索软件:Lucene流行的免费java信息检索库solr基于Lucene,查询语言更丰富,查询性能更好,功能管理界面更全面。对外提供类似于Web-service的API接口。用户可以通过http请求向搜索引擎服务器提交一定格式的XML文件,生成索引;他们还可以通过httpget操作提交搜索请求,以获取XML格式的返回结果。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个基于RESTfulweb界面的分布式多用户全文搜索引擎。SphinxSphinx是一个基于Sql的全文搜索引擎。它结合了MySQL和PostgreSQL进行全文索引,可以提供比数据库本身更专业的搜索功能,使应用程序更容易实现专业化的全文索引。Sphinx专门为一些脚本语言设计了搜索API接口,如PHP、Python、Perl、Ruby等,同时也为MySQL设计了存储引擎插件。CoreSeekCoreSeek是一款中文全文索引/检索软件,基于Sphinx研发,专注于中文检索和信息处理,适用于行业/垂直搜索、论坛/站点搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可免费下载使用。Coreseek有两个核心模块Indexer和Search。Indexer:负责从mysql中拉取数据源,对数据源进行切分,建立索引Search:搜索模块的coreseek工作流程如下:Indexer模块从MySQL中拉取数据。Indexer模块对中文分词后的数据建立索引。发起搜索请求。搜索模块查找索引中的数据。Search模块获取索引中符合要求的数据的id等数据,返回给客户端。
