作為一個(gè)移動(dòng)端開(kāi)發(fā)人員來(lái)講,是很難接觸到后端項(xiàng)目架構(gòu)的,所幸,從2015年開(kāi)始,負(fù)責(zé)部分管理工作,參與了項(xiàng)目架構(gòu)相關(guān)的工作。項(xiàng)目從小到大,架構(gòu)也越來(lái)越復(fù)雜,特別是最近做的一個(gè)跨國(guó)型項(xiàng)目,涉及到國(guó)內(nèi)國(guó)外服務(wù)器的部署,尤為復(fù)雜。本文結(jié)合這些項(xiàng)目實(shí)踐,介紹基于阿里云的后端架構(gòu)設(shè)計(jì)。(部分內(nèi)容為引用他人的文章,文中已有說(shuō)明,咱是尊重版權(quán)的)

1.基礎(chǔ)架構(gòu):
2015年初,團(tuán)隊(duì)做了一個(gè)美食項(xiàng)目,業(yè)務(wù)邏輯比較簡(jiǎn)單,主要是實(shí)現(xiàn)用戶、餐館、美食三元素的增刪改查及三者之間的關(guān)聯(lián)查詢。后端程序采用的是php,前端面對(duì)的是iOS和Android兩款A(yù)pp。當(dāng)時(shí)購(gòu)買了一臺(tái)阿里云ECS服務(wù)器,在該服務(wù)器上安裝了MySQL以用于數(shù)據(jù)存儲(chǔ)。應(yīng)用程序、數(shù)據(jù)庫(kù)、文件等所有資源都在一臺(tái)服務(wù)器上,網(wǎng)站架構(gòu)如下圖所示:

此架構(gòu)簡(jiǎn)單,適用于項(xiàng)目初期,訪問(wèn)量比較小情況。這里著重要說(shuō)一下的是,此項(xiàng)目中涉及到資源文件的存儲(chǔ)但并沒(méi)有用到OSS服務(wù)器,我們的做法是在客戶端在上傳圖片文件的時(shí)候,接口程序會(huì)將圖片壓縮為所需的多種尺寸,并保存在對(duì)應(yīng)的文件夾下,前端再取圖片的時(shí)候在URL后拼接對(duì)于的尺寸即可訪問(wèn)。如客戶端上傳了一張圖片,程序會(huì)壓縮為3030,120120,240*240三種尺寸,客戶端根據(jù)界面需要采用xxxxx_30.png的方式訪問(wèn),這個(gè)功能在阿里云的OSS服務(wù)器上有現(xiàn)成的服務(wù),無(wú)需自己壓縮。
2.應(yīng)用與數(shù)據(jù)分離架構(gòu):
2015年底,團(tuán)隊(duì)開(kāi)始做了一個(gè)圖片社交項(xiàng)目,其功能是全部模仿Instagram,但是內(nèi)容主要針對(duì)的是服裝、奢侈品。用戶通過(guò)手機(jī)拍攝一些奢侈品、服裝相關(guān)的視頻、圖片,并添加對(duì)應(yīng)的下載鏈接,發(fā)布到平臺(tái)后,用戶可以看到其他所有人發(fā)布的內(nèi)容,并可以根據(jù)鏈接購(gòu)買。
這個(gè)項(xiàng)目中涉及到大量視頻、圖片的處理,這里我們實(shí)現(xiàn)了應(yīng)用服務(wù)、數(shù)據(jù)服務(wù)、資源服務(wù)的分離。我們購(gòu)買了四臺(tái)阿里云服務(wù)器,分別是兩臺(tái)ECS、一臺(tái)OSS、一臺(tái)RDS,其結(jié)構(gòu)如下圖:

3.集群式部署初級(jí)架構(gòu)
2016年我們開(kāi)始做一個(gè)大型的在線教育平臺(tái)項(xiàng)目,經(jīng)歷一年的磨合,項(xiàng)目趨于穩(wěn)定,我們的服務(wù)器架構(gòu)也日臻完善。本想總結(jié)一下服務(wù)器的架構(gòu),在下筆之前在網(wǎng)上看到了他人總結(jié)的一篇文章,項(xiàng)目架構(gòu)設(shè)計(jì)總結(jié),再此先向作者表示敬意,以下是引用的這篇文章的部分內(nèi)容:
項(xiàng)目背景
項(xiàng)目的前端主要為ios應(yīng)用以及一些web管理系統(tǒng),后端的職能主要為前端提供數(shù)據(jù)接口。我個(gè)人在項(xiàng)目中主要負(fù)責(zé)整個(gè)后端的架構(gòu)設(shè)計(jì)、服務(wù)器運(yùn)維、php開(kāi)發(fā)等一系列后端工作,因?yàn)橹饕俏乙粋€(gè)人負(fù)責(zé),在一定程度上也減少了許多溝通成本。
總體架構(gòu)
項(xiàng)目后端架構(gòu)使用阿里云服務(wù)搭建,其中RDS為主從集群,并配備災(zāi)備實(shí)例。ECS可根據(jù)業(yè)務(wù)量動(dòng)態(tài)彈性伸縮,其余服務(wù)均采用單實(shí)例的方式遠(yuǎn)程調(diào)用。
2104726472.png
VPC
搭建VPC的原因有以下幾點(diǎn)
1.可以將業(yè)務(wù)數(shù)據(jù)庫(kù)和業(yè)務(wù)服務(wù)器放置在可以自己掌握的同一內(nèi)網(wǎng),可以提高一些安全性。
2.阿里云服務(wù)之間通過(guò)內(nèi)網(wǎng)訪問(wèn)的流量是不收費(fèi)的。所以在選購(gòu)服務(wù)時(shí),帶寬可以選擇流量版,這樣在保證帶寬速率的同時(shí),還可以極大的減少運(yùn)維費(fèi)用。
舉個(gè)例子:同樣一臺(tái)ECS,在同為百兆帶寬的情況下,每月的費(fèi)用如下圖:按固定帶寬
[圖片上傳中...(4282504957.png-8d5eea-1513671576852-0)]
按使用流量
4282504957.png
當(dāng)然,能這樣的做的原因也是因?yàn)樵谶@個(gè)架構(gòu)中,ECS僅處理業(yè)務(wù)邏輯,幾乎不存儲(chǔ)文件資源。大部分靜態(tài)資源,如視頻圖片等,都是存儲(chǔ)在OSS上。如果存放靜態(tài)資源,比如下視頻或圖片什么的,流量一多那就很虧了。
3.內(nèi)網(wǎng)訪問(wèn),穩(wěn)定而且速度快。業(yè)務(wù)數(shù)據(jù)層
RDS
項(xiàng)目一開(kāi)始,RDS選購(gòu)的是共享型單實(shí)例的,隨著業(yè)務(wù)量的提升,可以多區(qū)域部署只讀實(shí)例。另外,保險(xiǎn)起見(jiàn),主實(shí)例可以配有一個(gè)災(zāi)備實(shí)例,防止意外發(fā)生。
Redis
提到阿里云的這個(gè)Redis,不得不吐槽一句,它竟然是不支持主從的,只能單實(shí)例,不過(guò),用它做數(shù)據(jù)緩存,還真是蠻不錯(cuò)的選擇,響應(yīng)速度非常快。而且,因?yàn)槭欠胖迷趦?nèi)網(wǎng)的且只能內(nèi)網(wǎng)訪問(wèn),所以安全性也很高。
MongoDB
結(jié)構(gòu)型數(shù)據(jù),主要存儲(chǔ)檔案式的數(shù)據(jù),比如每個(gè)用戶的操作行為,以檔案式記錄并進(jìn)行統(tǒng)計(jì)分析,方便下一階段的項(xiàng)目做個(gè)性化服務(wù)。另外一些關(guān)聯(lián)復(fù)雜的數(shù)據(jù),也可以用MongoDb存儲(chǔ),可以提高訪問(wèn)速度。還有,一些對(duì)軟件應(yīng)用版本比較敏感的數(shù)據(jù)也可以存在MongoDB中,比如a版本拿到A數(shù)據(jù),b版本拿到B數(shù)據(jù),而這個(gè)AB數(shù)據(jù)都是由很多關(guān)聯(lián)關(guān)系復(fù)雜的數(shù)據(jù)所組成,如果把這些數(shù)據(jù)根據(jù)版本號(hào)存儲(chǔ)在不同的MongoDB檔案中,需要時(shí),直接根據(jù)版本號(hào)拿就可以了,這樣就避免了很多的mysql查詢。
靜態(tài)資源
OSS + CDN
OSS存儲(chǔ)靜態(tài)資源,CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))可以加速靜態(tài)資源的下載速度。至于資源鏈接地址,客戶端可以通過(guò)接口訪問(wèn)從后端業(yè)務(wù)數(shù)據(jù)庫(kù)中拿到。
服務(wù)器安全運(yùn)維層面
1.選購(gòu)了阿里云的web防火墻和態(tài)勢(shì)感知的服務(wù)。這兩個(gè)服務(wù)可以實(shí)時(shí)監(jiān)控服務(wù)器狀態(tài),識(shí)別并跟蹤攻擊來(lái)源和類型,可以說(shuō),用這兩個(gè)工具也節(jié)省了很多人力成本。阿里云還有其它安全類產(chǎn)品,可以根據(jù)項(xiàng)目選購(gòu),使用起來(lái)也都很方便。
2.配置firewalld。業(yè)務(wù)層面
針對(duì)接口訪問(wèn)的安全性,主要做了以下工作
1.簽名驗(yàn)證:防止偽造請(qǐng)求
2.訪問(wèn)頻次限制:計(jì)數(shù)器是用phpredis制作的毫秒級(jí)計(jì)數(shù)器
3.https訪問(wèn)
4.部分敏感數(shù)據(jù),使用RSA非對(duì)稱加密服務(wù)器集群
主ECS
通過(guò)這臺(tái)ECS,可以管理其它從屬的ECS,并查看狀態(tài)。安裝的主要工具為ansible。
如果不需要用這臺(tái)ECS來(lái)做負(fù)載均衡的話,可以配置白名單連接,只允許管理員ip才能訪問(wèn)。從屬ECS
這類ECS服務(wù)器只存放邏輯代碼,所以當(dāng)需求量增加時(shí),只需增加此類服務(wù)器的個(gè)數(shù)即可。而且,在增加個(gè)數(shù)時(shí),可以使用之前制作好的鏡像,創(chuàng)建多臺(tái)相同環(huán)境的ECS服務(wù)器。每臺(tái)ECS的web環(huán)境為nginx1.10和php7,微服務(wù)容器環(huán)境用的docker。
負(fù)載均衡
負(fù)載均衡可以采用兩種方式
1.購(gòu)買阿里云的負(fù)載均衡實(shí)例(注意要買帶公網(wǎng)ip的)。由該負(fù)載均衡實(shí)例接收請(qǐng)求后,會(huì)分發(fā)到內(nèi)部服務(wù)器。
2.在某臺(tái)具有外網(wǎng)ip的ECS上使用nginx部署負(fù)載均衡服務(wù)。個(gè)人更傾向第一種,畢竟管理起來(lái)比較方便,節(jié)省人力。
使用到的第三方服務(wù)
Coding
后端的所有代碼都是放在Coding上的,喜歡Coding的原因有三個(gè)。
1.私有g(shù)it倉(cāng)庫(kù)沒(méi)有個(gè)數(shù)限制。
2.有ios客戶端且比較好用。
3.操作界面好看。后端代碼的自動(dòng)部署是通過(guò)Coding的webhook實(shí)現(xiàn)的
具體操作可以去看這篇博客《利用Coding的webhook自動(dòng)部署項(xiàng)目》。實(shí)現(xiàn)的場(chǎng)景:代碼的自動(dòng)部署與持續(xù)集成。
當(dāng)我提交代碼到開(kāi)發(fā)分支上時(shí),測(cè)試服務(wù)器上會(huì)自動(dòng)更新開(kāi)發(fā)分支上的代碼。
當(dāng)我把開(kāi)發(fā)代碼合并到主分支上時(shí),正式服務(wù)器會(huì)自動(dòng)拉取master分支上的代碼,可謂是方便快捷。
jenkins 之類的工具雖然也嘗試過(guò),但是感覺(jué)部署起來(lái)很不方便,不夠定制化,而且還消耗了一部分服務(wù)器資源。后端邏輯層架構(gòu)
接口
項(xiàng)目起初的接口是基于phalapi框架開(kāi)發(fā),現(xiàn)在逐步過(guò)渡到基于laravel5.3開(kāi)發(fā)。
項(xiàng)目起初選擇phalapi的原因1.phalapi框架是輕量級(jí)的接口發(fā)框架,開(kāi)發(fā)起來(lái)比較便捷、快速,尤其是那個(gè)依賴注入挺好用的。
2.phalapi框架有很多現(xiàn)成的擴(kuò)展可以使用,不用去找,而且這些也能基本滿足業(yè)務(wù)的需要。我個(gè)人還基于這個(gè)框架開(kāi)發(fā)了兩個(gè)擴(kuò)展,一個(gè)是關(guān)于使用workman的,一個(gè)是關(guān)于使用gearman的。
其中g(shù)earman是用來(lái)異步處理請(qǐng)求的,詳細(xì)介紹可以看這篇博客《基于Phalapi框架的gearman擴(kuò)展(異步并發(fā))》
根據(jù)業(yè)務(wù)量提高性能http請(qǐng)求的并發(fā)性能可以通過(guò)增加ECS實(shí)現(xiàn),針對(duì)部分耗時(shí)較長(zhǎng)且無(wú)須即時(shí)回調(diào)的請(qǐng)求,可以用gearman異步處理。
數(shù)據(jù)庫(kù)的并發(fā)連接數(shù)可以通過(guò)增加配置來(lái)提高,也可以通過(guò)創(chuàng)建只讀實(shí)例進(jìn)行讀寫(xiě)分離,提高數(shù)據(jù)處理能力。再往后,可能需要搭建hadoop管理數(shù)據(jù)庫(kù)集群,不過(guò)等用上hadoop的時(shí)候,應(yīng)該已經(jīng)不是項(xiàng)目初期了,至少數(shù)據(jù)量得是TB級(jí)的了。
其它還可以采用優(yōu)化nginx配置,優(yōu)化linux內(nèi)核,采用高速固態(tài)硬盤(pán)等等的手段。總結(jié)評(píng)價(jià)
這套架構(gòu)基本上可以完全滿足項(xiàng)目初期的業(yè)務(wù)需要,而且所有的云服務(wù)費(fèi)用總和也非常少(相比于自建服務(wù)器機(jī)房)。隨著業(yè)務(wù)量的提升,可以逐步升級(jí)配置以應(yīng)對(duì)需求,還可以在短時(shí)間內(nèi)臨時(shí)性的提高并發(fā)處理能力??偨Y(jié)起來(lái)就是省錢、省時(shí)、省力氣。
4.集群式部署國(guó)際化架構(gòu)
隨著業(yè)務(wù)的擴(kuò)展,最近我們的項(xiàng)目需要發(fā)布到海外市場(chǎng),原有的服務(wù)器架構(gòu)已經(jīng)不能滿足市場(chǎng)的需求。由于之前并未接觸如此大的項(xiàng)目,對(duì)海外市場(chǎng)服務(wù)器的部署非常不了解,在跟阿里云架構(gòu)師溝通的基礎(chǔ)上,我們得出兩種解決方案:
方案一:
阿里云有一款叫全球加速的產(chǎn)品,該產(chǎn)品不用購(gòu)買和部署海外服務(wù)器,只需購(gòu)買全球加速服務(wù),阿里云接入其自建的全球骨干網(wǎng)絡(luò),據(jù)說(shuō)可實(shí)現(xiàn)海外訪問(wèn)100ms的延時(shí)。不過(guò)此種方式,成本較高,我們選擇了放棄,其結(jié)構(gòu)如下圖:

方案二:
第二種方案就是在海外部署服務(wù)器,其結(jié)構(gòu)如下圖:

在上一種架構(gòu)的基礎(chǔ)上,在所需要的點(diǎn)購(gòu)買ECS服務(wù)器,海外節(jié)點(diǎn)通過(guò)香港入口訪問(wèn)國(guó)內(nèi)的RDS和Redis。同時(shí)在海外對(duì)應(yīng)的節(jié)點(diǎn)部署CDN,用于訪問(wèn)OSS服務(wù)器時(shí)的加速,海外用戶訪問(wèn)對(duì)應(yīng)節(jié)點(diǎn)的CDN,CDN通過(guò)香港入口訪問(wèn)OSS服務(wù)器,并將所訪問(wèn)的對(duì)象文件緩存到對(duì)應(yīng)的節(jié)點(diǎn),當(dāng)用戶下次再次訪問(wèn)該對(duì)象時(shí),直接從對(duì)應(yīng)的CDN節(jié)點(diǎn)緩存中獲取,以此方式提高訪問(wèn)速度。


