《App后台开发运维与架构实践》第2章 App后台基础技术
2.1 從App業(yè)務(wù)邏輯中提煉API接口
業(yè)務(wù)邏輯思維導(dǎo)圖
功能-業(yè)務(wù)邏輯思維導(dǎo)圖
基本功能模塊關(guān)系
功能模塊接口UML(設(shè)計(jì)出API)
在設(shè)計(jì)稿標(biāo)注API
編寫(xiě)API文檔
2.2 設(shè)計(jì)API的要點(diǎn)
根據(jù)對(duì)象設(shè)計(jì)API
API的命名
API的安全性
API所返回的數(shù)據(jù):禁止返回Null值
圖片的處理:圖片數(shù)據(jù)庫(kù)保存原圖,在App客戶(hù)端本地緩存圖片不存在時(shí),按圖片尺寸向服務(wù)端請(qǐng)求動(dòng)態(tài)生成。
返回的提示信息:給用戶(hù)看的提示和給程序員看的提示。
在線(xiàn)API測(cè)試文檔:使用Swagger-UI搭建,按TDD(測(cè)試驅(qū)動(dòng)開(kāi)發(fā))原則進(jìn)行開(kāi)發(fā)。
在App客戶(hù)端啟動(dòng)時(shí)調(diào)用一個(gè)API獲取必要的初始化信息:比如App版本
關(guān)于API的版本升級(jí)問(wèn)題:V2版本的API的Controller必須要繼承V1版本的Controller,V2版本的API只重寫(xiě)需要改動(dòng)的API。
2.3 如何選擇合適的數(shù)據(jù)庫(kù)產(chǎn)品
2.3.1 Redis、MongoDB、MySQL讀寫(xiě)數(shù)據(jù)的區(qū)別
Redis的數(shù)據(jù)是存放在服務(wù)器的內(nèi)存,當(dāng)內(nèi)存用滿(mǎn)了后需要擴(kuò)容,就只能使用Redis的分布式方案。為了防止斷電或Redis程序重啟造成內(nèi)容數(shù)據(jù)的丟失,可調(diào)整Redis配置文件,按照一定的策略把數(shù)據(jù)持久化傳到硬盤(pán)。
MongoDB同時(shí)使用了硬盤(pán)和內(nèi)存,其使用了操作系統(tǒng)提供的MMAP(內(nèi)存文件映射)機(jī)制進(jìn)行數(shù)據(jù)文件的讀寫(xiě),MMAP可以把文件直接映射到進(jìn)程的內(nèi)存空間中,這樣文件就會(huì)在內(nèi)存中有對(duì)應(yīng)的地址,這時(shí)對(duì)文件的讀寫(xiě)是能通過(guò)操作內(nèi)存進(jìn)行的,而不需要使用傳統(tǒng)的如fread、fwrite文件操作方式。
MySQL的數(shù)據(jù)是放在硬盤(pán)中的。雖然MySQL也有緩存,但MySQL緩存的是查詢(xún)的結(jié)果,而不是緩存數(shù)據(jù)。
2.3.2 Redis、MongoDB、MySQL查找數(shù)據(jù)的區(qū)別
Redis的數(shù)據(jù)是基于“鍵值對(duì)”存儲(chǔ)。Redis查找數(shù)據(jù),每次都是直奔目標(biāo),讀寫(xiě)速度當(dāng)然快。
MongoDB和MySQL中查找數(shù)據(jù),有兩種模式:知道id或索引,不知道id或索引。前者直奔目標(biāo),效率高;后者逐個(gè)查找,效率低。
2.3.3 Redis、MongoDB、MySQL適用場(chǎng)景
Redis適用場(chǎng)景:讀寫(xiě)頻率高的數(shù)據(jù)、熱點(diǎn)數(shù)據(jù)。
MongoDB適用場(chǎng)景:網(wǎng)站數(shù)據(jù)(實(shí)時(shí)的插入、更新與查詢(xún)),大尺寸、低價(jià)值的數(shù)據(jù),高伸縮性的場(chǎng)景(數(shù)十或者數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù)),存儲(chǔ)地理坐標(biāo)的數(shù)據(jù);不適合高度事務(wù)性的系統(tǒng)、傳統(tǒng)的商業(yè)智能應(yīng)用及需要復(fù)雜SQL的問(wèn)題。
MySQL適用場(chǎng)景:事務(wù)性的系統(tǒng)(涉及金錢(qián)),需要復(fù)雜SQL的問(wèn)題。
2.4 如何選擇消息隊(duì)列軟件
2.4.1 為什么使用消息隊(duì)列
將一些需要花比較多的時(shí)間,而且遲點(diǎn)完成不影響整個(gè)任務(wù)的完成進(jìn)度的小任務(wù),放到消息隊(duì)列中,可加快后臺(tái)請(qǐng)求的響應(yīng)時(shí)間;比如發(fā)送郵件、發(fā)送短信、推送消息等任務(wù)就非常適合放到消息隊(duì)列中。同時(shí)消息隊(duì)列也能把大量的并發(fā)請(qǐng)求變成串行的請(qǐng)求,減輕服務(wù)器的負(fù)擔(dān)。
2.4.2 消息隊(duì)列的工作流程
App后臺(tái)(隊(duì)列生產(chǎn)者)把消息推入到消息隊(duì)列;
守護(hù)進(jìn)程(隊(duì)列消費(fèi)者)不斷地檢測(cè)消息隊(duì)列中有沒(méi)有新的消息,沒(méi)有消息就休息一會(huì)兒再檢測(cè)消息隊(duì)列中有沒(méi)有新的消息(這樣做能避免消息隊(duì)列占據(jù)過(guò)多的服務(wù)器資源),有消息的話(huà)就從消息隊(duì)列取出消息,用新的線(xiàn)程處理相關(guān)的業(yè)務(wù),在主線(xiàn)程中繼續(xù)檢測(cè)消息隊(duì)列是否有新消息。
2.4.3 常見(jiàn)的一些消息隊(duì)列產(chǎn)品
RabbitMQ:重量級(jí)的消息隊(duì)列,適合企業(yè)級(jí)的開(kāi)發(fā),其支持大量的協(xié)議,比如AMQP、XMPP、SMTP、STOMP;同時(shí)RabbitMQ自帶了一個(gè)Web監(jiān)控界面,可方便監(jiān)控隊(duì)列的情況。
Redis:雖然是一個(gè)key-value系統(tǒng),但其也支持隊(duì)列這種數(shù)據(jù)格式,可看作是一個(gè)輕量級(jí)的消息隊(duì)列。在App后臺(tái)架構(gòu)中Redis被廣泛使用,如果把其作為消息隊(duì)列,能減少項(xiàng)目中的運(yùn)維成本。
ZeroMQ:號(hào)稱(chēng)最快的消息隊(duì)列,尤其針對(duì)大吞吐量的需求場(chǎng)景。
ActiveMQ
2.5 使用分布式服務(wù)實(shí)現(xiàn)業(yè)務(wù)的復(fù)用
隨著業(yè)務(wù)不斷增加,后臺(tái)系統(tǒng)由一個(gè)單一的應(yīng)用慢慢膨脹為一個(gè)巨無(wú)霸系統(tǒng),它聚合了大量的應(yīng)用和服務(wù),各個(gè)模塊之間由很多功能重復(fù)實(shí)現(xiàn),造成了開(kāi)發(fā)、運(yùn)維、部署的麻煩。
2.5.1 巨無(wú)霸系統(tǒng)的危害
維護(hù)上的麻煩
代碼管理上的不方便
數(shù)據(jù)庫(kù)連接資源的耗盡
2.5.2 遠(yuǎn)程服務(wù)的優(yōu)點(diǎn)
把重復(fù)實(shí)現(xiàn)的模塊獨(dú)立部署為遠(yuǎn)程服務(wù),新增的業(yè)務(wù)調(diào)用遠(yuǎn)程服務(wù)所提供的功能實(shí)現(xiàn)相關(guān)的業(yè)務(wù),不依賴(lài)于里面具體的代碼實(shí)現(xiàn)。當(dāng)遠(yuǎn)程服務(wù)里面的業(yè)務(wù)需要發(fā)生變化時(shí),只要接口的傳入?yún)?shù)和返回值保持不變,就不會(huì)影響到調(diào)用這些遠(yuǎn)程服務(wù)的業(yè)務(wù)。
2.5.3 遠(yuǎn)程服務(wù)的實(shí)現(xiàn)
REST
REST(Representational State Transfer),即表述性狀態(tài)傳遞,它是一組架構(gòu)約束條件和原則。滿(mǎn)足這些約束條件的原則的應(yīng)用程序或設(shè)計(jì)就是RESTful。
REST架構(gòu)的特點(diǎn):每一個(gè)URI代表一種資源;客戶(hù)端和App后臺(tái)之間,傳遞這種資源的某種表述;客戶(hù)端通過(guò)GET、POST、PUT、DELETE等HTTP動(dòng)詞,對(duì)App后臺(tái)資源進(jìn)行操作,實(shí)現(xiàn)“表述性狀態(tài)傳遞”。
REST設(shè)計(jì)原則中最重要的是請(qǐng)求是無(wú)狀態(tài)的。
RPC
RPC(Remote Procedure Call),即遠(yuǎn)程過(guò)程調(diào)用,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開(kāi)發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
開(kāi)源的RPC庫(kù)
阿里巴巴開(kāi)源Dubbo,其是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程調(diào)用服務(wù)和SOA服務(wù)治理方案。
當(dāng)當(dāng)網(wǎng)在Dubbo的基礎(chǔ)上實(shí)現(xiàn)了如下的新功能,并將其命名為Dubbox。
支持REST風(fēng)格遠(yuǎn)程調(diào)用(HTTP+JSON/XML)。
支持基于Kryo和FST的Java高效序列化實(shí)現(xiàn)。
支持基于嵌入式Tomcat的HTTP remoting體系。
將Dubbo中Spring由2.x升級(jí)到目前常用的3.x版本。
將Dubbo中的Zookeeper客戶(hù)端升級(jí)到最新的版本,以修正老版本中包含的bug。
2.6 搜索技術(shù)入門(mén)
常見(jiàn)的開(kāi)源搜索軟件介紹
復(fù)制代碼
<?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>
復(fù)制代碼
主要用到兩個(gè)節(jié)點(diǎn)<typeAlias>和<type>。<typeAlias>節(jié)點(diǎn)的alias是別名在<type>節(jié)點(diǎn)中的type使用,type是“命名空間+對(duì)象名,所在程序集名稱(chēng)”。<type>節(jié)點(diǎn)的type是“需要映射的對(duì)象”mapTo是“映射的目標(biāo)對(duì)象”name是“標(biāo)識(shí)名”在多個(gè)類(lèi)繼承同個(gè)接口的時(shí)候區(qū)分使用。其余的節(jié)點(diǎn)如圖Unity配置文件節(jié)點(diǎn)圖。
代碼如下:
復(fù)制代碼
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);
//獲取特定配置節(jié)下已命名的配置節(jié)<container name="IOCcontainer">下的配置信息
section.Configure(_container, "IOCcontainer");
復(fù)制代碼
五、三種依賴(lài)注入
1、構(gòu)造函數(shù)注入
構(gòu)造函數(shù)注入是最常用的一種注入方式,如下:
復(fù)制代碼
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 定時(shí)任務(wù)
Linux定時(shí)任務(wù)Crontab
Java定時(shí)任務(wù)框架Quartz
轉(zhuǎn)載于:https://www.cnblogs.com/qwangxiao/p/10688027.html
總結(jié)
以上是生活随笔為你收集整理的《App后台开发运维与架构实践》第2章 App后台基础技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java concurrent 锁_ja
- 下一篇: QFIL刷机