《App后台开发运维与架构实践》第2章 App后台基础技术
2.1 從App業務邏輯中提煉API接口
業務邏輯思維導圖
功能-業務邏輯思維導圖
基本功能模塊關系
功能模塊接口UML(設計出API)
在設計稿標注API
編寫API文檔
2.2 設計API的要點
根據對象設計API
API的命名
API的安全性
API所返回的數據:禁止返回Null值
圖片的處理:圖片數據庫保存原圖,在App客戶端本地緩存圖片不存在時,按圖片尺寸向服務端請求動態生成。
返回的提示信息:給用戶看的提示和給程序員看的提示。
在線API測試文檔:使用Swagger-UI搭建,按TDD(測試驅動開發)原則進行開發。
在App客戶端啟動時調用一個API獲取必要的初始化信息:比如App版本
關于API的版本升級問題:V2版本的API的Controller必須要繼承V1版本的Controller,V2版本的API只重寫需要改動的API。
2.3 如何選擇合適的數據庫產品
2.3.1 Redis、MongoDB、MySQL讀寫數據的區別
Redis的數據是存放在服務器的內存,當內存用滿了后需要擴容,就只能使用Redis的分布式方案。為了防止斷電或Redis程序重啟造成內容數據的丟失,可調整Redis配置文件,按照一定的策略把數據持久化傳到硬盤。
MongoDB同時使用了硬盤和內存,其使用了操作系統提供的MMAP(內存文件映射)機制進行數據文件的讀寫,MMAP可以把文件直接映射到進程的內存空間中,這樣文件就會在內存中有對應的地址,這時對文件的讀寫是能通過操作內存進行的,而不需要使用傳統的如fread、fwrite文件操作方式。
MySQL的數據是放在硬盤中的。雖然MySQL也有緩存,但MySQL緩存的是查詢的結果,而不是緩存數據。
2.3.2 Redis、MongoDB、MySQL查找數據的區別
Redis的數據是基于“鍵值對”存儲。Redis查找數據,每次都是直奔目標,讀寫速度當然快。
MongoDB和MySQL中查找數據,有兩種模式:知道id或索引,不知道id或索引。前者直奔目標,效率高;后者逐個查找,效率低。
2.3.3 Redis、MongoDB、MySQL適用場景
Redis適用場景:讀寫頻率高的數據、熱點數據。
MongoDB適用場景:網站數據(實時的插入、更新與查詢),大尺寸、低價值的數據,高伸縮性的場景(數十或者數百臺服務器組成的數據庫),存儲地理坐標的數據;不適合高度事務性的系統、傳統的商業智能應用及需要復雜SQL的問題。
MySQL適用場景:事務性的系統(涉及金錢),需要復雜SQL的問題。
2.4 如何選擇消息隊列軟件
2.4.1 為什么使用消息隊列
將一些需要花比較多的時間,而且遲點完成不影響整個任務的完成進度的小任務,放到消息隊列中,可加快后臺請求的響應時間;比如發送郵件、發送短信、推送消息等任務就非常適合放到消息隊列中。同時消息隊列也能把大量的并發請求變成串行的請求,減輕服務器的負擔。
2.4.2 消息隊列的工作流程
App后臺(隊列生產者)把消息推入到消息隊列;
守護進程(隊列消費者)不斷地檢測消息隊列中有沒有新的消息,沒有消息就休息一會兒再檢測消息隊列中有沒有新的消息(這樣做能避免消息隊列占據過多的服務器資源),有消息的話就從消息隊列取出消息,用新的線程處理相關的業務,在主線程中繼續檢測消息隊列是否有新消息。
2.4.3 常見的一些消息隊列產品
RabbitMQ:重量級的消息隊列,適合企業級的開發,其支持大量的協議,比如AMQP、XMPP、SMTP、STOMP;同時RabbitMQ自帶了一個Web監控界面,可方便監控隊列的情況。
Redis:雖然是一個key-value系統,但其也支持隊列這種數據格式,可看作是一個輕量級的消息隊列。在App后臺架構中Redis被廣泛使用,如果把其作為消息隊列,能減少項目中的運維成本。
ZeroMQ:號稱最快的消息隊列,尤其針對大吞吐量的需求場景。
ActiveMQ
2.5 使用分布式服務實現業務的復用
隨著業務不斷增加,后臺系統由一個單一的應用慢慢膨脹為一個巨無霸系統,它聚合了大量的應用和服務,各個模塊之間由很多功能重復實現,造成了開發、運維、部署的麻煩。
2.5.1 巨無霸系統的危害
維護上的麻煩
代碼管理上的不方便
數據庫連接資源的耗盡
2.5.2 遠程服務的優點
把重復實現的模塊獨立部署為遠程服務,新增的業務調用遠程服務所提供的功能實現相關的業務,不依賴于里面具體的代碼實現。當遠程服務里面的業務需要發生變化時,只要接口的傳入參數和返回值保持不變,就不會影響到調用這些遠程服務的業務。
2.5.3 遠程服務的實現
REST
REST(Representational State Transfer),即表述性狀態傳遞,它是一組架構約束條件和原則。滿足這些約束條件的原則的應用程序或設計就是RESTful。
REST架構的特點:每一個URI代表一種資源;客戶端和App后臺之間,傳遞這種資源的某種表述;客戶端通過GET、POST、PUT、DELETE等HTTP動詞,對App后臺資源進行操作,實現“表述性狀態傳遞”。
REST設計原則中最重要的是請求是無狀態的。
RPC
RPC(Remote Procedure Call),即遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
開源的RPC庫
阿里巴巴開源Dubbo,其是一個分布式服務框架,致力于提供高性能和透明化的RPC遠程調用服務和SOA服務治理方案。
當當網在Dubbo的基礎上實現了如下的新功能,并將其命名為Dubbox。
支持REST風格遠程調用(HTTP+JSON/XML)。
支持基于Kryo和FST的Java高效序列化實現。
支持基于嵌入式Tomcat的HTTP remoting體系。
將Dubbo中Spring由2.x升級到目前常用的3.x版本。
將Dubbo中的Zookeeper客戶端升級到最新的版本,以修正老版本中包含的bug。
2.6 搜索技術入門
常見的開源搜索軟件介紹
復制代碼
<?xml version="1.0" encoding=www.venkeng.com/ "utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="IEarPhone" type="Xu.UnityDemo.Interface.IEarPhone,Xu.UnityDemo" />
<typeAlias alias="IPhone" type=www.qwert888.com"Xu.UnityDemo.Interface.IPhone,Xu.UnityDemo" />
<typeAlias alias="NubiaPhone" type="Xu.UnityDemo.Model.NubiaPhone,Xu.UnityDemo" />
<typeAlias alias="MiPhone" type="Xu.UnityDemo.Model.MiPhone,Xu.UnityDemo" />
<typeAlias alias="NubiaEarPhone" type="Xu.UnityDemo.Model.NubiaEarPhone,Xu.UnityDemo" />
<typeAlias alias="MiEarPhone" type="Xu.UnityDemo.Model.MiEarPhone,Xu.UnityDemo" />
</typeAliases>
<containers>
<container name="IOCcontainer">
<type type="IPhone" mapTo="MiPhone" name="Mi"></type >
<type type="IPhone" mapTo="NubiaPhone"></type >
<type type="IEarPhone" mapTo="NubiaEarPhone"></type >
</container>
</containers>
</unity>
</configuration>
復制代碼
主要用到兩個節點<typeAlias>和<type>。<typeAlias>節點的alias是別名在<type>節點中的type使用,type是“命名空間+對象名,所在程序集名稱”。<type>節點的type是“需要映射的對象”mapTo是“映射的目標對象”name是“標識名”在多個類繼承同個接口的時候區分使用。其余的節點如圖Unity配置文件節點圖。
代碼如下:
復制代碼
ExeConfigurationFileMap fileMap =www.yunshengyule178.com new ExeConfigurationFileMap();
fileMap.ExeConfigFilename www.fengshen157.com/= Directory.GetCurrentDirectory() + "/Config/UnityIocConfig.xml";
Configuration configuration =www.bais7.com ConfigurationManager.www.mhylpt.com/ OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
//獲取特定配置節下已命名的配置節<container name="IOCcontainer">下的配置信息
section.Configure(_container, "IOCcontainer");
復制代碼
五、三種依賴注入
1、構造函數注入
構造函數注入是最常用的一種注入方式,如下:
復制代碼
private IPhone _iPhone;
private IUnityContainer _container;
public ValuesController(www.yisengyule.com IUnityContainer container, IPhone iPhone)
{
_container = container;
_iPhone = iPhone;
Lucene
Solr
ElasticSearch
Sphinx
CoreSeek
2.7 定時任務
Linux定時任務Crontab
Java定時任務框架Quartz
《App后台开发运维与架构实践》第2章 App后台基础技术的更多相关文章
- (视频)《快速创建网站》 4.1 为啥造软件不同于造汽车,为啥是软件就一定会有Bug - 构建开发运维一体化(DevOps)
本文是<快速创建网站>系列的第9篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...
- Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成(上)
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成(上) Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 1) 开发 ...
- Devops 开发运维高级篇之容器管理
Devops 开发运维高级篇之容器管理 安装docker Dockerfile镜像脚本入门制作 Harbor镜像仓库安装及使用 不过多解释docker直接秀基操 安装docker:(jenkins服务 ...
- Devops 开发运维高级篇之微服务代码上传和代码检查
Devops 开发运维高级篇之微服务代码上传和代码检查 微服务持续集成(1)-项目代码上传到Gitlab 微服务持续集成(2)-从Gitlab拉取项目源码 微服务持续集成(3)-提交到SonarQub ...
- Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...
- App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计
一.为什么需要注册和登录? 是否需要注册和登录的关键取决于产品形态. 如果用户注册登录对于用户需求.产品功能.商业模式本身带不来任何价值的话,就没必要设计这样的功能.比如一些实用工具类的产品:计算器. ...
- App后台开发运维和架构实践学习总结(5)——App产品从需求到研发到开发到上线到产品迭代全过程
前言 如果没有做过开发,研发过产品的人,很难体会做产品的艰难,刚进公司的人,一般充当的是程序开发,我这里说的是开发,它与研发是有区别的. 一个需求下来,如果不能很好地理解产品需求,如果不能很好的驾驭需 ...
- App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
1. 争取相容性和统一性 这里就要求让API设计得是可预测的.按照这种方式写出所有接口和接口所需要的参数.现在就要确保命名是一致的,接口所需的参数顺序也是一致的.你现在应该有products,orde ...
- App后台开发运维和架构实践学习总结(2)——RESTful API设计技巧
前言 移动互联网时代,RESTful API成为越来越重要的移动端和服务器端交互的形式.尤其是在很多互联网公司或者传统行业拥抱移动互联网的时候,一套设计良好的Restful API能够帮助互联网产品支 ...
随机推荐
- Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)
principal 已经提交 已经通过 23.66% Total Submission:131 Total Accepted:31 题目描述 阿尔比恩王国潜伏着代号白鸽队''的一群间谍.在没有任务的时 ...
- 各种jar包
springframework下载地址:http://maven.springframework.org/release/org/springframework/spring/ commons开头的j ...
- Java基础之一反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- js总结:onClick=“return confirm()”实现确认以及取消表单的提交
- [转帖]震惊,用了这么多年的 CPU 利用率,其实是错的
震惊,用了这么多年的 CPU 利用率,其实是错的 2018年12月22日 08:43:09 Linuxer_ 阅读数:50 https://blog.csdn.net/juS3Ve/article/d ...
- Angular 双向数据绑定
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...
- day 7-5 生产者消费者模型
一. 生产者和消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 二. 为什么要使用生产者和消费者模式 ...
- MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])
针对Oracle不支持自增的解决方案 Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢? <insert id="addEm ...
- python语法糖/装饰器
1.python高阶函数和嵌套函数 1.1高阶函数 def func1(x): return x**2 def func2(x): return x**3 def func(x,y): return ...
- python设计模式第六天【原型模式】
1.定义 使用原型模式复制的对象与原来对象具有一样的结构和数据,有浅克隆和深克隆 2.应用场景 (1)希望复制原来对象的结构和数据胆步影响原来对象 3.代码实现 #!/usr/bin/env pyth ...