一個B/S架構(gòu)的系統(tǒng)在設(shè)計時要考慮哪些要點?

? 宋人蘇軾寫過這么一首關(guān)于琴的詩:

? 若言琴上有琴聲,放在匣中何不鳴。

? 若言聲在指頭上,何不于君指上聽。


? ? 什么意思呢?就是說琴要發(fā)出美妙的聲音,是由于人的指頭撥弄琴弦,發(fā)生振動才發(fā)出動聽的琴聲,琴放在那里肯定不會響,所以說人的指頭和琴這兩種因素是琴發(fā)聲的基礎(chǔ),兩者是相輔相成的,老蘇在這里雖說用了反問,但是已經(jīng)肯定了這種關(guān)系。

? ? 那么,對于互聯(lián)網(wǎng)時代的應(yīng)用系統(tǒng)來說,也是一樣。

? ? 一個龐大的互聯(lián)網(wǎng)系統(tǒng)在初期設(shè)計的時候會有方方面面的點要考慮(數(shù)據(jù)層面,后臺層面,存儲層面,應(yīng)用層面,前端層面,安全層面,數(shù)據(jù)采集及監(jiān)控層面等),只有在設(shè)計層面考慮清楚要建設(shè)的系統(tǒng)的種種因素,然后在實施階段才能清晰的去完成開發(fā)建設(shè)工作,后期的投產(chǎn)才能達到想琴聲一樣美妙的效果。


(圖1)


? ? 其實,在做了幾年基于互聯(lián)網(wǎng)開發(fā)的工作之后,你會發(fā)現(xiàn),大多數(shù)基于B/S架構(gòu)的平臺大體上都是圖1所示的結(jié)構(gòu),可能存在的不同是每一層所用的具體的技術(shù)點不太一樣,比如在數(shù)據(jù)存儲中緩存的處理,有些人用的是Redis,有些人用的是Memcached,又比如在消息異步處理方面,有些人喜歡用RocketMq,有些人喜歡用ActiveMq,這些都沒有太大關(guān)系,具體的技術(shù)本身都存在優(yōu)缺點,關(guān)鍵點是你用的這個技術(shù)在你系統(tǒng)中確實是解決了你的實際問題。

今天我想從圖1的上面往下面談一談B/S架構(gòu)的系統(tǒng)設(shè)計時注意要點,也是我在實際項目中遇到的坑,填了之后的一些總結(jié),為啥從上面往下講,有些朋友可能比較納悶,一個系統(tǒng)不是應(yīng)該從對底層的數(shù)據(jù)層設(shè)計開始嗎?對,沒錯。正常的想法都是從最底層往上想,我這人有些怪,喜歡先想簡單的,然后慢慢的往復(fù)雜了想,越是接近用戶一層的越是簡單,比如前端展示層。

要點 一:前端架構(gòu)

? ? 前端是通常是指用戶的請求到達應(yīng)用服務(wù)器之前經(jīng)歷的環(huán)節(jié),一般不包括業(yè)務(wù)邏輯,不處理動態(tài)數(shù)據(jù)。

? ? 1.瀏覽器優(yōu)化技術(shù)

? ? 并不是優(yōu)化瀏覽器,而是通過優(yōu)化響應(yīng)頁面,加快瀏覽器頁面的加載和顯示,常用的有頁面緩存、合并HTTP減少請求次數(shù)、使用頁面壓縮等。

? ? 2.CDN

? ? 內(nèi)容分發(fā)網(wǎng)絡(luò),部署在網(wǎng)絡(luò)運營商機房,通過將靜態(tài)頁面內(nèi)容分發(fā)到離用戶最近最近的CDN服務(wù)器,使用戶可以通過最短路徑獲取內(nèi)容。

? ? 3.動靜分離,靜態(tài)資源獨立部署

? ? 靜態(tài)資源,如JS、CSS等文件部署在專門的服務(wù)器集群上,和Web應(yīng)用動態(tài)內(nèi)容服務(wù)分離,并使用專門的(二級)域名。

? ? 4.圖片服務(wù)

? ? 圖片不是指網(wǎng)站Logo、按鈕圖標(biāo)等,這些文件屬于上面提到的靜態(tài)資源,應(yīng)該和JS、CSS部署在一起。這里的圖片指用戶上傳的圖片,如產(chǎn)品圖片、用戶頭像等,圖片服務(wù)同樣適用獨立部署的圖片服務(wù)器集群,并使用獨立(二級)域名。

? 5.反向代理

? ? 部署在網(wǎng)站機房,在應(yīng)用服務(wù)器、靜態(tài)資源服務(wù)器、圖片服務(wù)器之前,提供頁面緩存服務(wù)。

? ? 6.DNS

? ? 域名服務(wù),將域名解析成IP地址,利用DNS可以實現(xiàn)DNS負載均衡,配置CDN也需要修改DNS,使域名解析后指向CDN服務(wù)器。

要點二:應(yīng)用層架構(gòu)

? ? 應(yīng)用層處理主要業(yè)務(wù)邏輯的地方。

? ? 1.開發(fā)框架

? ? 系統(tǒng)業(yè)務(wù)是多變的,系統(tǒng)的大部分軟件工程師都是在加班加點開發(fā)網(wǎng)站業(yè)務(wù),一個好的開發(fā)框架至關(guān)重要。一個好的開發(fā)框架應(yīng)該能夠分離關(guān)注面,使美工、開發(fā)工程師可以各司其事,易于協(xié)作。同時還應(yīng)該內(nèi)置一些安全策略,防護Web用攻擊。比如前后端分離技術(shù),vue.js+微服務(wù)的方式。

? ? 2.頁面渲染

? ? 將分別開發(fā)維護的動態(tài)內(nèi)容和靜態(tài)頁面模板集成起來,組合成最終顯示給用戶的完整頁面。

? ? 3.負載均衡

? ? 將多臺應(yīng)用服務(wù)器組成一個集群,通過負載均衡技術(shù)將用戶請求分發(fā)到不同的服務(wù)器上,以應(yīng)對大量用戶同時訪問時產(chǎn)生的高并發(fā)負載壓力。可采取軟件負載(nginx)或者硬件負載(F5)

4.Session管理

? ? 為了實現(xiàn)高可用的應(yīng)用服務(wù)器集群,應(yīng)用服務(wù)器通常設(shè)計為無狀態(tài),不保存用戶請求上下文信息,但是網(wǎng)站業(yè)務(wù)通常需要保持用戶會話信息,需要專門的機制管理Session,使集群內(nèi)甚至跨集群的應(yīng)用服務(wù)器可以共享Session。

? ? 5.動態(tài)頁面靜態(tài)化

? ? 對于訪問量特別大而更新又不很頻繁的動態(tài)頁面,可以將其靜態(tài)化,即生成一個靜態(tài)頁面,利用靜態(tài)頁面的優(yōu)化手段加速用戶訪問,如反向代理、CDN、瀏覽器緩存等。

? ? 6.業(yè)務(wù)拆分

? ? 將復(fù)雜而龐大的業(yè)務(wù)拆分開來,形成多個規(guī)模較小的產(chǎn)品,獨立開發(fā)、部署、維護,除了降低系統(tǒng)耦合度,也便于數(shù)據(jù)庫業(yè)務(wù)分庫。按業(yè)務(wù)對關(guān)系數(shù)據(jù)庫進行拆分,技術(shù)難度相對較小,而效果又相對較好。

? 7.虛擬化服務(wù)器

? ? 將一臺物理服務(wù)器虛擬化成多態(tài)虛擬服務(wù)器,對于并發(fā)訪問較低的業(yè)務(wù),更容易用較少的資源構(gòu)架高可用的應(yīng)用服務(wù)器集群。

要點三:服務(wù)層架構(gòu)

? ? 提供基礎(chǔ)服務(wù),供應(yīng)用層調(diào)用,完成網(wǎng)站業(yè)務(wù)。

? 1.分布式消息

? ? 利用消息隊列機制,實現(xiàn)業(yè)務(wù)和業(yè)務(wù)、業(yè)務(wù)和服務(wù)之間的異步消息發(fā)送及低耦合的業(yè)務(wù)關(guān)系。

? 2.微服務(wù)

? ? 提供高性能、低耦合、易復(fù)用、易管理的分布式服務(wù),在網(wǎng)站實現(xiàn)面向微服務(wù)架構(gòu)(可采用SpringCloud,Dubbo)。

? 3.分布式緩存

通過可伸縮的服務(wù)器集群提供大規(guī)模熱點數(shù)據(jù)的緩存服務(wù),是網(wǎng)站性能優(yōu)化的重要手段。(比如Redis,Memcached)

4.分布式配置

? ? 系統(tǒng)運行需要配置許多參數(shù),如果這些參數(shù)需要修改,比如分布式緩存集群加入新的緩存服務(wù)器,需要修改應(yīng)用程序客戶端的緩存服務(wù)器列表配置,并重啟應(yīng)用程序服務(wù)器。分布式配置在系統(tǒng)運行期提供配置動態(tài)推送服務(wù),將配置修改實時推送到應(yīng)用系統(tǒng),無需重啟服務(wù)器。

要點四:存儲層架構(gòu)

? ? 提供數(shù)據(jù)、文件的持久化存儲訪問與管理服務(wù)。

? ? 1.分布式文件

? ? 網(wǎng)站在線業(yè)務(wù)需要存儲的文件大部分都是圖片、網(wǎng)頁、視頻等比較小的文件,但是這些文件的數(shù)量非常龐大,而且通常都在持續(xù)增加,需要伸縮性設(shè)計比較好的分布式文件系統(tǒng)。

? 2.關(guān)系數(shù)據(jù)庫

? ? 大部分萬丈的主要業(yè)務(wù)是基于關(guān)系數(shù)據(jù)庫開發(fā)的,但是關(guān)系數(shù)據(jù)庫對集群伸縮性的支持表較差。通過在應(yīng)用程序的數(shù)據(jù)訪問層增加數(shù)據(jù)庫訪問的路由功能,根據(jù)業(yè)務(wù)配置將數(shù)據(jù)庫訪問路由到不同的物理數(shù)據(jù)庫上,可實現(xiàn)關(guān)系數(shù)據(jù)庫的分布式訪問。

? ? 3.NoSQL數(shù)據(jù)庫

目前各種NoSQL數(shù)據(jù)庫層出不窮,在內(nèi)存管理、數(shù)據(jù)模型、集群分布式管理等方面各有優(yōu)勢,不過從社區(qū)活動性角度看,HBase無疑是目前最好的。

? ? 4.數(shù)據(jù)同步

? ? 在支持全球范圍內(nèi)數(shù)據(jù)共享的分布式數(shù)據(jù)庫技術(shù)成熟之前,擁有多個數(shù)據(jù)中心的網(wǎng)站必須在多個數(shù)據(jù)中心之間進行數(shù)據(jù)同步,以保證每個數(shù)據(jù)中心都擁有完整的數(shù)據(jù)。在實踐中,為了減輕數(shù)據(jù)庫壓力,將數(shù)據(jù)庫的事物日志(或者NoSQL的寫操作Log)同步到其他數(shù)據(jù)中心,根據(jù)Log進行數(shù)據(jù)重演,實現(xiàn)數(shù)據(jù)同步。

要點五:后臺架構(gòu)

? ? B/S架構(gòu)應(yīng)用中,除了要處理用戶的實時訪問請求外,還有一些后臺非實時數(shù)據(jù)分析要處理。

? 1.搜索引擎

即使是網(wǎng)站內(nèi)部的搜索引擎,也需要進行數(shù)據(jù)增量更新及全量更新、構(gòu)建索引等。這些操作通過后臺系統(tǒng)定時執(zhí)行。

? 2.數(shù)據(jù)倉庫

根據(jù)離線數(shù)據(jù),提供數(shù)據(jù)分析與數(shù)據(jù)挖掘服務(wù)。

? ? 3.推薦系統(tǒng)

? ? 社交網(wǎng)站及購物網(wǎng)站通過挖掘人與人之間的關(guān)系,人和商品之間的關(guān)系,發(fā)展?jié)撛诘娜穗H關(guān)系和購物興趣,為用戶提供個性化推薦服務(wù)。

要點六:數(shù)據(jù)采集與監(jiān)控

? ? 監(jiān)控系統(tǒng)訪問情況與系統(tǒng)運行情況,為業(yè)務(wù)運營決策和運維管理提供支持保障。

1.瀏覽器數(shù)據(jù)采集

? ? 通過在網(wǎng)站頁面中嵌入JS腳本采集用戶瀏覽器環(huán)境與操作記錄,分析用戶行為。

2.服務(wù)器業(yè)務(wù)數(shù)據(jù)采集

? ? 服務(wù)器業(yè)務(wù)數(shù)據(jù)包括兩種,一種是采集在服務(wù)器端記錄的用戶請求操作日志;一種是采集應(yīng)用程序運行期業(yè)務(wù)數(shù)據(jù),比如待處理消息數(shù)目等。

? ? 3.服務(wù)器性能數(shù)據(jù)采集

? ? 采集服務(wù)器性能數(shù)據(jù),如系統(tǒng)負載、內(nèi)存使用率、網(wǎng)卡流量等。

? ? 4.系統(tǒng)監(jiān)控

? ? 將前述采集的數(shù)據(jù)以圖表的方式展示,以便運營和運維人員監(jiān)控網(wǎng)站運行狀況,做到這一步僅僅是系統(tǒng)監(jiān)視。更先進的做法是根據(jù)采集的數(shù)據(jù)進行自動化運維,自動處理系統(tǒng)異常狀況,是吸納自動化控制。

? ? 5.系統(tǒng)報警

? ? 如果采集來的數(shù)據(jù)超過預(yù)設(shè)的正常情況的閥值,比如系統(tǒng)負載過高,就通過郵件、短信、語音電話等方式發(fā)出警報信號,等待工程師干預(yù)。

要點七:安全架構(gòu)

? ? 保護互聯(lián)網(wǎng)網(wǎng)站免遭攻擊及敏感信息泄露。

1.Web攻擊

? ? 以HTTP請求的方式發(fā)起的攻擊,危害最大的就是XSS和SQL注入攻擊。但是只要措施得當(dāng),這兩種攻擊都是比較容易防范的。

2.數(shù)據(jù)保護

? ? 敏感信息加密傳輸與存儲(比如用戶的四要素信息),保護系統(tǒng)和用戶資產(chǎn)。這個在系統(tǒng)安全等級保護評定中有相應(yīng)的要求。

3.防護設(shè)備

? ? 根據(jù)業(yè)務(wù)應(yīng)用的性質(zhì)和公司的實際情況,必要時可以用一些安全設(shè)備比如WAF,比如數(shù)據(jù)庫審計設(shè)備,運維審計設(shè)備等。

4.安全證書

? 無論內(nèi)部系統(tǒng)之間的調(diào)用還是與第三方的系統(tǒng)的服務(wù)調(diào)用都盡量采用https方式。

5.安全認證

接口設(shè)計要考慮簽名認證機制;

要點八:數(shù)據(jù)中心機房架構(gòu)

? ? 大型網(wǎng)站需要的服務(wù)器規(guī)模數(shù)以十萬計,機房物理架構(gòu)也需要關(guān)注。

? ? 1.機房架構(gòu)

? ? 對于一個擁有十萬臺服務(wù)器的大型網(wǎng)站,每臺服務(wù)器耗電(包括服務(wù)器本身耗電及空調(diào)耗電)都是很驚人的,Google、Facebook選擇數(shù)據(jù)中心地理位置的時候趨向選擇散熱良好,供電充裕的地方。

? 2.機柜架構(gòu)

? ? 包括機柜大小,網(wǎng)線布局、指示燈規(guī)格、不間斷電源、電壓規(guī)格(是48V直流電還是220V民用交流電)等一系列問題。

? ? 3.虛擬化

? ? 奔著服務(wù)器資源的最大化利用的原則,虛擬化是不得不考慮的一個問題(可以用VmWare),當(dāng)然這個要根據(jù)公司實際情況來看(有些公司就是財大氣粗)。

? ? 這八項注意要點基本就說完了,說得也比較淺,只是針對平時系統(tǒng)設(shè)計時容易忽略的一些 key point做了一些歸納,具體技術(shù)我基本是提了一下,有興趣的朋友可以去研究,要特別說明一下,我今天說的僅僅是“注意要點”,不是說就按照這八點來建設(shè)系統(tǒng)了,你如果這樣理解,那就有些偏激了,一個大型的互聯(lián)網(wǎng)系統(tǒng),比如電商平臺,互聯(lián)網(wǎng)金融平臺是非常龐大的業(yè)務(wù)系統(tǒng),里面涉及到的點要遠遠大于今天提到這幾點,要根據(jù)自己的系統(tǒng)規(guī)模選擇合適的一些點進行參考。


? 一開頭我提到了蘇軾的那首關(guān)于琴的詩,琴聲縱使美妙,但做到珠落玉盤,高山流水的境界也需要一番功夫。

? 其實老蘇還有一首詩:

? 橫看成嶺側(cè)成峰,遠近高低各不同。

? 不識廬山真面目,只緣身在此山中。

? 大家不妨閉目體會一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容