摘要:负责从拉取数据源,把数据源分词,建立索引搜索模块工作流程如下模块从中拉取数据模块用经过中文分词后的数据建立索引客户端向模块发起搜索请求模块查找索引中的数据模块得到索引中符合要求的数据的等数据把数据返回给客户端
一、从业务逻辑中提炼API接口(整理自《App后台开发运维和架构实践》 作者:曾健生)
业务逻辑思维导图
功能——业务逻辑思维导图
基本功能模块关系
功能模块接口UML(设计出API)
编写API文档
在设计稿中标注API
1. 业务逻辑思维导图抽象业务流程,列出结构关系,相同的元素(推送、评论、图片上传)用同一种颜色标记。
2. 功能——业务逻辑思维导图列出功能模块与业务逻辑相结合。
功能模块的划分,可以按照“人”、“事”来划分。“人”就是一个大模块,“事”要看有哪些事,相同的事就是一个模块,人和事之间的关系,就是关系模块 。
我 (我是人。“人”是一个模块)
消息 (消息是“事物”。“消息”是一个模块)
我发消息 (发消息,是事件,不是事物,是人与物的关系,是一个关系模块)
3. 基本功能模块关系理清各个模块之间的依赖调用关系
4. 功能模块接口UML (设计出API)具体分析各个模块的具体的功能(具体的API),再根据上一步骤整理的模块间的关系,画出UML图
5. 编写API文档提倡使用TDD(测试驱动)原则开发,编写在线API文档,既是一份文档,也是一个在线测试工具。
相关的开源工具:
swagger-ui
eolinker
sosoapi
http://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都是强类型语言,所以绝对不允许返回null值。
数据库设计时,所有字段都必须有默认值,不允许出现null。
app客户端必须用全局的函数处理所有API返回的数据,当返回的数据缺少某个值时,自动补上一个默认值。
使用PHP作为APP后台的开发语言存在一个问题:PHP中数组和字典都属于Array,但在java和objective-C中这两者是不一样的。
5. 图片的处理app开发中,通常需要一张图片有多种尺寸,以适应app的不同版本和各异的客户端。
建议:
App客户端本地缓存常用图片,缓存不能命中时才去请求服务器
App端需要的不同尺寸的图片时,发送带尺寸参数的请求到后台,有后台动态生成并缓存。
文件云存储服务(七牛,又拍)和CDN都提供图片的缩放功能,高速的文件上传下载,有条件的情况下,推荐使用。
6. 返回的提示信息最科学的情况是APP后台只返回信息代码,具体的文字由客户端决定。
需要给App客户端程序员返回的提示信息,要专业清晰,比如“少传了什么参数,哪个参数有问题”
App客户端做了改版后,部分API不能满足需求了,这时就需要升级API,要避免同一个App客户端调用不同版本的API,一般会全部升级。例如:原来是“xxx.com/v1/getpost”, 升级为“xxx.com/v2/getpost”。
注意:
升级版本时,V2版本的API的Controller必须要继V1版的Controller,这样V2版本的API只重写需要改动的API
完善文档,在线API测试文档中详细说明,方便客户端人员调试。
三、选择合适的数据库内存型还是硬盘型
内存的读取速度大概是硬盘的80倍。
内存容量很有限。例如Ucloud服务器最多有64G内存,硬盘可高达1000G。
Redis,MongoDB,mysql 读写数据的区别
存储服务 | 类型 | 说明 |
---|---|---|
Redis | 内存型 | 支持持久化保存到硬盘 |
mongoDB | 混合 | 使用MMAP机制,操作内存完成文件读写 |
Mysql | 硬盘型 |
Redis,MongoDB,Mysql 查询数据的区别
存储服务 | 说明 |
---|---|
Redis | “键值对”存储,读写速度快 |
MongoDB、 Mysql | 有id或索引,效率高;无id或索引,效率低 |
Redis,MongoDB,Mysql 适用场景
存储服务 | 适用场景 |
---|---|
Redis | 适合存储读写频率非常高,且知道“键”的数据,比如用户身份信息,在登录或其他操作中都能用到 |
mongoDB | 大尺寸、低价值的数据;高伸缩性场景;地理坐标查询功能强大,适用于LBS应用。劣势:不支持事务,查询功能逊于sql |
Mysql | 最常用的存储服务,支持事务,支持复杂sql |
消息队列可以把大量的并发请求变成串行请求,起到减轻服务器负担的作用。
有些小任务需要花很多时间,但是迟点完成也可以,就可以把这样的任务交给消息队列处理。比如一些不要求马上完成的发送邮件,推送消息的任务。
消息队列一般包括三个角色:队列服务端,队列生产者,队列消费者。
常见的消息队列产品:
消息队列 | 介绍 |
---|---|
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工作流程如下:
Indexer模块从MySQL中拉取数据
Indexer模块用经过中文分词后的数据建立索引
客户端向Search模块发起搜索请求
Search模块查找索引中的数据
Search模块得到索引中符合要求的数据的id等数据
把数据返回给客户端
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39593.html
摘要:负责从拉取数据源,把数据源分词,建立索引搜索模块工作流程如下模块从中拉取数据模块用经过中文分词后的数据建立索引客户端向模块发起搜索请求模块查找索引中的数据模块得到索引中符合要求的数据的等数据把数据返回给客户端 (整理自《App后台开发运维和架构实践》 作者:曾健生) 一、从业务逻辑中提炼API接口 此过程可分为六个阶段: 业务逻辑思维导图 功能——业务逻辑思维导图 基本功能模块关系 ...
摘要:本文是浅析微信支付系列文章的第三篇,主要会讲一下在开发前的一些注意事项。浅析微信支付系列已经更新两篇了哟,没有看过的朋友们可以看一下。开通微信支付需要注册登陆微信商户平台,微信支付相关的信息都需要在这个平台上进行操作。 本文是【浅析微信支付】系列文章的第三篇,主要会讲一下在开发前的一些注意事项。 浅析微信支付系列已经更新两篇了哟~,没有看过的朋友们可以看一下。 浅析微信支付:前篇大纲...
阅读 2772·2021-10-18 13:33
阅读 826·2019-08-30 14:20
阅读 2600·2019-08-30 13:14
阅读 2436·2019-08-29 18:38
阅读 2855·2019-08-29 16:44
阅读 1180·2019-08-29 15:23
阅读 3414·2019-08-29 13:28
阅读 1887·2019-08-28 18:00