日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

大型網(wǎng)站技術(shù)架構(gòu)核心原理剖析

 timtxu 2019-08-21

什么是軟件架構(gòu)

維基百科定義: 軟件架構(gòu)是指有關(guān)軟件整體結(jié)構(gòu)與組件的抽象描述,用于指導大型軟件系統(tǒng)各個方面的設(shè)計 。

軟件架構(gòu)5大要素:

大型網(wǎng)站技術(shù)架構(gòu)核心原理剖析
  • 性能

  • 可用性

  • 伸縮性

  • 擴展性

  • 安全性

可以通過考察這5大要素來衡量一個軟件架構(gòu)設(shè)計的優(yōu)劣。

高性能

網(wǎng)站性能是客觀的指標,具體體現(xiàn)到 響應(yīng)時間 、 吞吐量 等技術(shù)指標。

性能優(yōu)化的最終目的: 改善用戶體驗 。

網(wǎng)站性能測試是性能優(yōu)化的前提和基礎(chǔ),也是性能優(yōu)化結(jié)果的檢查和度量標準。

下面從三個視角來看看網(wǎng)站性能的不同標準:

用戶視角

網(wǎng)站響應(yīng)速度快慢(通信時間,處理時間、解析響應(yīng)數(shù)據(jù)的時間)。

開發(fā)人員視角

關(guān)注程序本身及其相關(guān)子系統(tǒng)的性能,包括響應(yīng)延遲、系統(tǒng)吞吐量、并發(fā)處理能力、系統(tǒng)穩(wěn)定性等技術(shù)指標。

運維人員視角

關(guān)注基礎(chǔ)設(shè)施性能和資源利用率,如網(wǎng)絡(luò)運營商的帶寬能力、服務(wù)器硬件配置、數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)、服務(wù)器和網(wǎng)路帶寬的資源利用率等。

性能測試指標

網(wǎng)站性能測試的主要指標主要有:

  • 響應(yīng)時間:應(yīng)用執(zhí)行一個操作需要的時間(從發(fā)出請求開始到收到最后響應(yīng)數(shù)據(jù)所需要的時間)。

  • 并發(fā)數(shù):系統(tǒng)能夠同時處理請求的數(shù)目,反映了系統(tǒng)的負載特性。。

  • 吞吐量:單位時間內(nèi)系統(tǒng)處理的請求數(shù)量,體現(xiàn)系統(tǒng)的整體處理能力。存在一個極限值。

  • TPS:每秒事務(wù)數(shù)

  • HPS:每秒HTTP請求數(shù)

  • QPS:每秒查詢數(shù)

  • 性能計數(shù)器:描述服務(wù)器或操作系統(tǒng)的一些數(shù)據(jù)指標。主要包括:

  • System Load:系統(tǒng)負載,指當前正在被CPU執(zhí)行和等待被CPU執(zhí)行的進程數(shù)目總和(反映系統(tǒng)忙閑程度的重要指標)。

  • 對象與線程數(shù)

  • 內(nèi)存使用

  • CPU使用

  • 磁盤與網(wǎng)絡(luò)I/O

性能測試方法

性能測試是一個不斷對系統(tǒng)增加訪問壓力,以 獲得系統(tǒng)性能指標、最大負載能力、最大壓力承受能力的過程。性能測試主要包括以下幾種方法:

  • 性能測試:對系統(tǒng)不斷施壓,驗證系統(tǒng)在資源可以接受范圍內(nèi),是否能達到預期。

  • 負載測試:對系統(tǒng)不斷增加并發(fā)請求,直到系統(tǒng)的某項或多項性能指標達到安全臨界值。

  • 壓力測試:在超過安全負載的情況下,對系統(tǒng)繼續(xù)施壓,直到系統(tǒng)崩潰或不能再處理請求,已獲得系統(tǒng)最大承受能力。

  • 穩(wěn)定性測試:系統(tǒng)在特定的硬件、軟件、網(wǎng)路環(huán)境條件下,給系統(tǒng)加載一定壓力,使系統(tǒng)運行一段較長時間,以檢查系統(tǒng)是否穩(wěn)定。

性能分析與優(yōu)化

排查網(wǎng)站的性能瓶頸的方法:檢查請求處理的各個環(huán)節(jié)的日志,分析哪個環(huán)節(jié)響應(yīng)時間不合理、超過預期;然后檢查監(jiān)控數(shù)據(jù),分析影響性能的主要因素是內(nèi)存、磁盤、網(wǎng)絡(luò)還是 CPU,時代嗎問題還是架構(gòu)設(shè)置不合理,或者系統(tǒng)資源確實不足。

定位到了性能具體問題后,然后根據(jù)性能產(chǎn)生的原因進行性能優(yōu)化。性能優(yōu)化主要從三個方面進行優(yōu)化:

  • Web前端性能優(yōu)化

  • 應(yīng)用服務(wù)器性能優(yōu)化

  • 存儲服務(wù)器性能優(yōu)化

性能優(yōu)化策略

Web前端優(yōu)化

1. 瀏覽器訪問優(yōu)化

  • 減少HTTP請求:分別合并CSS、JS、圖片等資源,減少瀏覽器的請求次數(shù)。

  • 使用瀏覽器緩存:瀏覽器將CSS、JS、圖標等靜態(tài)資源緩存在瀏覽器中,那樣就不用每次都去請求服務(wù)器,可以極好地改善性能。設(shè)置HTTP頭中 Cache-Control 和 Expires 屬性。

  • 啟用壓縮:在服務(wù)器端對文件進行壓縮,在瀏覽器端對文件進行解壓,可有效減少通信傳輸?shù)臄?shù)據(jù)量。壓縮比80%以上。壓縮和解壓縮會消耗服務(wù)器和瀏覽器所在的系統(tǒng)的CPU資源。

  • CSS放在頁面最上面,JS放在頁面最下面:加載JS后會立即執(zhí)行,可能會阻塞頁面渲染。

  • 減少Cookie傳輸:減少Cookie中傳輸?shù)臄?shù)據(jù)量,請求靜態(tài)資源沒有必要發(fā)送Cookie。

2. CDN加速

CDN(Content Distribute Network,內(nèi)容分發(fā)網(wǎng)絡(luò)),是指將數(shù)據(jù)緩存在離用戶最近的地方,使用戶以最快的速度獲取數(shù)據(jù),提升網(wǎng)頁的打開速度。

CDN適合緩存 靜態(tài)資源 ,如圖片、文件、CSS、腳本、靜態(tài)文件等。

3. 反向代理

反向代理是指服務(wù)器根據(jù)客戶端的請求,從其關(guān)聯(lián)的一組或多組后端服務(wù)器上獲取資源,然后再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理服務(wù)器后面具體的真實服務(wù)器的存在。

反向代理的作用:

  • 安全功能

  • 通過緩存配置加速Web請求(靜態(tài)資源)

  • 負載均衡,通過構(gòu)建集群,提高系統(tǒng)總體處理能力

應(yīng)用服務(wù)器優(yōu)化

1. 分布式緩存

網(wǎng)站性能優(yōu)化第一定律: 優(yōu)先考慮使用緩存優(yōu)化性能

原理:將數(shù)據(jù)存儲在訪問速度較高的存儲介質(zhì)中,加快訪問速度。

緩存作用:

  • 緩存訪問速度快,減少數(shù)據(jù)訪問時間

  • 緩存計算結(jié)果,節(jié)省計算的時間

合理使用緩存:

  • 緩存讀寫比高,變化少的數(shù)據(jù)

  • 盡量緩存熱點數(shù)據(jù)

  • 確保數(shù)據(jù)有效性,根據(jù)業(yè)務(wù)場景,選擇是否能容忍數(shù)據(jù)一定時間內(nèi)不一致,還是及時更新

  • 對緩存設(shè)置失效時間,緩存數(shù)據(jù)丟失或者不可用,會從數(shù)據(jù)庫直接獲取數(shù)據(jù)

  • 緩存預熱:在緩存啟動的時候就把熱點數(shù)據(jù)加載好。

  • 避免緩存穿透:將不存的數(shù)據(jù)也緩存起來。

2. 異步操作

使用消息隊列將調(diào)用異步化,以改善網(wǎng)站的性能。

使用消息隊列后,用戶請求的數(shù)據(jù)發(fā)送給消息隊列后就立即返回,再由消息隊列的消費者從消息隊列中獲取數(shù)據(jù),再進行邏輯處理(如寫入數(shù)據(jù)庫)。

3. 使用集群

使用負載均衡技術(shù)為應(yīng)用構(gòu)建一個由多臺服務(wù)器組成的服務(wù)器集群,將并發(fā)訪問請求分發(fā)到多臺服務(wù)器上處理,避免單一服務(wù)器因負載壓力過大而響應(yīng)緩存,降低用戶請求響應(yīng)延遲,提升用戶體驗。

4. 代碼優(yōu)化

代碼優(yōu)化主要關(guān)注以下幾個方面:

  • 多線程:涉及線程安全問題,多線程并發(fā)對某個資源進行修改,解決辦法:

  • 將對象設(shè)計為無狀態(tài)對象

  • 使用局部對象

  • 并發(fā)訪問資源時使用鎖

  • 資源復用:減少開銷較大的系統(tǒng)資源的創(chuàng)建和銷毀,如數(shù)據(jù)庫連接、網(wǎng)絡(luò)通信連接、線程、復雜對象等。

  • 單例(Singleton)

  • 對象池(Object Pool)

  • 數(shù)據(jù)結(jié)構(gòu)

  • 垃圾回收

存儲性能優(yōu)化

磁盤是系統(tǒng)最嚴重的瓶頸。

1. 機械硬盤 & 固態(tài)硬盤

在網(wǎng)站應(yīng)用中,大部分應(yīng)用訪問數(shù)據(jù)都是隨機的,機械硬盤由于需要移動磁頭臂,所以性能較差。SSD具有更好的性能。

2. B+樹 & LSM樹

為了改善數(shù)據(jù)訪問特性,文件系統(tǒng)或數(shù)據(jù)庫系統(tǒng)通常會對數(shù)據(jù)排序后存儲,以加快檢索速度,這樣就需要保證數(shù)據(jù)在不斷更新、插入、刪除后依然有序。

傳統(tǒng)關(guān)系數(shù)據(jù)庫使用B+樹,B+樹是一種專門針對磁盤而優(yōu)化的N叉排序樹,以樹節(jié)點為單位存儲在磁盤中,從根開始查找所需數(shù)據(jù)所在的節(jié)點編號和磁盤位置,將其加載到內(nèi)存中然后繼續(xù)查找,直到找到所需的數(shù)據(jù)。

LSM樹是一個N階合并樹。數(shù)據(jù)的插入、修改和刪除都是在內(nèi)存中進行,并且都會創(chuàng)建一個新記錄,這些數(shù)據(jù)在內(nèi)存中以樹結(jié)構(gòu)排序,當數(shù)據(jù)量超過設(shè)定的閾值后,會和磁盤上最新的的排序樹合并。在合并的過程中,會用最新更新的數(shù)據(jù)覆蓋舊的數(shù)據(jù)。讀操作先從內(nèi)存中排序樹開始搜索,如未找到,再從磁盤上排序樹順序查找。

在LSM樹上進行一次數(shù)據(jù)更新不需要磁盤訪問,在內(nèi)存即可完成,速度遠快于B+樹。

對于寫多,集中讀最近寫入數(shù)據(jù)的場景,使用LSM樹可以極大的減少磁盤的訪問次數(shù),加快訪問速度。

3. RAID & HDFS

RAID

廉價磁盤冗余陣列,主要是為了改善磁盤的訪問延遲,增強磁盤的可用性和容錯能力。

多塊磁盤通過使用RAID技術(shù),實現(xiàn)數(shù)據(jù)在多塊磁盤上的并發(fā)讀寫和數(shù)據(jù)備份。

常用RAID技術(shù):

  • RAID0:在寫的時候,根據(jù)磁盤數(shù)量將數(shù)據(jù)分成N份,并發(fā)寫入N塊磁盤。在讀的時候,從N塊磁盤上并發(fā)讀。RAID0具有極快的數(shù)據(jù)讀取速度,但是未做備份。

  • RAID1:數(shù)據(jù)寫入的時候,將一份數(shù)據(jù)同時寫入兩塊磁盤,一塊磁盤損壞不會導致數(shù)據(jù)丟失,插入新磁盤可以通過復制數(shù)據(jù)方式自動修復,可靠性高。

  • RAID10:將所有磁盤平均分成兩份,數(shù)據(jù)同時在兩份磁盤寫入,結(jié)合RAID0和RAID1兩種方案,既提高了可靠性又改善了性能,但是RAID10的磁盤利用率較低,一般磁盤用來備份數(shù)據(jù)。

  • RAID3:數(shù)據(jù)寫入的時候,將數(shù)據(jù)分成N-1份,并發(fā)寫入N-1塊磁盤,并在第N塊磁盤記錄校驗數(shù)據(jù),任何一塊磁盤損壞(包括校驗數(shù)據(jù)磁盤),都可以利用其它N-1塊磁盤的數(shù)據(jù)修復。在數(shù)據(jù)修改較多的場景,會導致第N塊磁盤頻繁重寫校驗數(shù)據(jù),容易造成磁盤損壞,所以一般少在實踐中使用。

  • RAID5:與RAID3類似,但是校驗數(shù)據(jù)是螺旋寫入所有磁盤,避免頻繁寫一塊盤。

  • RAID6:與RAID5類似,數(shù)據(jù)值寫入N-2塊磁盤,螺旋式地在兩塊磁盤中寫入校驗信息(不同算法),數(shù)據(jù)可靠性最高。

HDFS

系統(tǒng)在整個存儲集群的多臺服務(wù)器上進行數(shù)據(jù)并發(fā)讀寫和備份。HDFS以塊(Block)為單位管理文件內(nèi)容,一個文件被切分成多個Block,當應(yīng)用程序?qū)懳募r,每寫完一個Block,HDFS會將其自動復制到另外兩臺機器上,保證3副本(默認)。在處理文件的時候(MapReduce),可以同時啟動多個任務(wù)并行讀取文件的不同Block,并發(fā)處理,提升讀取效率。

HDFS配置MapReduce等并行計算框架進行大數(shù)據(jù)處理時,可以在整個集群上并發(fā)讀寫訪問所有的磁盤安,無需RAID支持。

高可用

網(wǎng)站的可用性描述 網(wǎng)站可有效訪問 的特性。

可用性度量:服務(wù)7*24可用,可用性超過99.99%。

網(wǎng)站不可用時間(故障時間) = 故障修復時間點 - 故障發(fā)現(xiàn)(報告)時間點網(wǎng)站年度可用性指標=(1-網(wǎng)站不可用時間/年度總時間)*100%

硬件故障是常態(tài),網(wǎng)站的高可用架構(gòu)設(shè)計主要目的: 保證服務(wù)器硬件故障時服務(wù)依然可用、數(shù)據(jù)依然能保存并能被訪問 。

高可用架構(gòu)的主要手段:數(shù)據(jù)和服務(wù) 冗余備份失效轉(zhuǎn)移 。

一個典型的網(wǎng)站設(shè)計通常遵循三層架構(gòu)模型:

  • 應(yīng)用層:負責具體業(yè)務(wù)邏輯處理

  • 服務(wù)層:負責提供可復用的服務(wù)

  • 數(shù)據(jù)層:負責數(shù)據(jù)的存儲于訪問

高可用的應(yīng)用

應(yīng)用的顯著特點:無狀態(tài)性。

無狀態(tài)應(yīng)用是指應(yīng)用服務(wù)器不保存業(yè)務(wù)的上下文信息,僅根據(jù)每次請求提交的數(shù)據(jù)進行相應(yīng)的業(yè)務(wù)邏輯處理。多個服務(wù)器實力之間完全對等,請求提交到任意服務(wù)器,處理結(jié)果都是完全一樣的。

通過負載均衡進行無狀態(tài)服務(wù)的失效轉(zhuǎn)移

通過負載均衡手段,將流量和數(shù)據(jù)均勻分配到一個集群組成的多臺服務(wù)器上,以提高系統(tǒng)的整體負載處理能力。

應(yīng)用服務(wù)器集群的Session管理

Session管理手段:

1. Session復制應(yīng)用服務(wù)器開啟Web容器的Session復制功能,在集群中的幾臺服務(wù)器之間同步Session對象,使得每臺服務(wù)器上都保存所有用戶的Session信息,這樣任何一臺機器宕機都不會導致Session數(shù)據(jù)的丟失。適合小規(guī)模集群。當集群比較大時,集群服務(wù)器間需要大量的通信進行Session復制,會占用大量服務(wù)器和網(wǎng)絡(luò)資源。

2. Session綁定利用負載均衡的源地址Hash算法實現(xiàn),負載均衡服務(wù)器總是將來源于同一IP的請求分發(fā)到同一臺服務(wù)器上,也可以根據(jù)Cookie信息將同一個用戶的請求總是分發(fā)到同一臺機器上,這樣在整個會話期間沒用戶所有的請求都在同一臺服務(wù)器上處理,即Session綁定在某臺特定服務(wù)器上,又稱 會話黏滯

缺點:不符合對系統(tǒng)高可用的需求,某臺服務(wù)器宕機,那么該機器上的Session會丟失。很少使用。

3. 利用Cookie記錄Session

利用瀏覽器支持的Cookie記錄Session。每次請求的時候,將Session放在請求中發(fā)送到服務(wù)器,服務(wù)器處理完請求之后再將修改過的Session響應(yīng)給客戶端。

缺點:受Cookie大小限制,記錄信息有限;每次請求都需傳輸Cookie,影響性能;如用戶關(guān)閉Cookie,訪問就會異常。

4. Session服務(wù)器

利用獨立部署的Session服務(wù)器集群統(tǒng)一管理Session,應(yīng)用服務(wù)器每次讀寫Session時,都訪問Session服務(wù)器。

將應(yīng)用服務(wù)器的狀態(tài)分離,分為無狀態(tài)的應(yīng)用服務(wù)器和有狀態(tài)的Session服務(wù)器,針對這兩種服務(wù)器的不同特性分別設(shè)計其架構(gòu)。

Session服務(wù)器實現(xiàn):分布式緩存、數(shù)據(jù)庫等。

高可用的服務(wù)

高可用的服務(wù)模塊為業(yè)務(wù)產(chǎn)品提供 基礎(chǔ)公共服務(wù) ,一般是 獨立部署 。

高可用的服務(wù)策略:

1. 負載均衡

通過負載均衡的失效轉(zhuǎn)移策略實現(xiàn)高可用。

2. 分級管理

根據(jù)應(yīng)用和服務(wù)的重要程度進行分級管理,不同重要程序的服務(wù)使用不同的硬件資源,越重要的的服務(wù)使用越好的硬件資源。核心服務(wù)和數(shù)據(jù)部署在不同地域的數(shù)據(jù)中心。

3. 超時設(shè)置

設(shè)置服務(wù)調(diào)用的超時時間,一旦超時,通信框架拋出異常,應(yīng)用程序根據(jù)服務(wù)調(diào)度策略,選擇繼續(xù)重試或?qū)⒄埱筠D(zhuǎn)移到相同服務(wù)的其他服務(wù)器上。

4. 異步調(diào)用

應(yīng)用對服務(wù)的調(diào)用通過消息隊列等異步方式完成,避免一個服務(wù)失敗導致整個應(yīng)用請求失敗。

5. 服務(wù)降級

網(wǎng)站訪問高峰期,服務(wù)可能因為大量的并發(fā)調(diào)用而性能下降,嚴重時可能會導致服務(wù)宕機。為了保證核心應(yīng)用和功能的正常運行,對服務(wù)進行降級。

降級手段:

  • 拒絕服務(wù):拒絕低優(yōu)先級應(yīng)用的調(diào)用,減少服務(wù)調(diào)用并發(fā)數(shù),確保核心應(yīng)用正常使用;或隨機拒絕部分請求調(diào)用,節(jié)約資源。

  • 關(guān)閉服務(wù):關(guān)閉部分不重要的服務(wù),或者服務(wù)內(nèi)部關(guān)閉部分不重要的功能,節(jié)約系統(tǒng)開銷,重要功能讓出資源。

6. 冪等性設(shè)計

服務(wù)層必須保證重復調(diào)用和調(diào)用一次產(chǎn)生的結(jié)果相同,即服務(wù)具有冪等性。

高可用的數(shù)據(jù)

1. CAP

為了保證數(shù)據(jù)的高可用,會犧牲 數(shù)據(jù)一致性 。

高可用的數(shù)據(jù)含義:

  • 數(shù)據(jù)持久性:保證數(shù)據(jù)持久存儲,不會出現(xiàn)數(shù)據(jù)丟失的問題。

  • 數(shù)據(jù)可訪問性:在多份數(shù)據(jù)副本分別存放在不同存儲設(shè)備的情況下,一個數(shù)據(jù)存儲設(shè)備損壞需要將數(shù)據(jù)訪問切換到其他數(shù)據(jù)存儲設(shè)備上。

  • 數(shù)據(jù)一致性:多副本之間數(shù)據(jù)一致。

CAP原理:一個提供數(shù)據(jù)服務(wù)的存儲系統(tǒng)無法同時滿足 數(shù)據(jù)一致性(Consistency) 、 數(shù)據(jù)可用性(Availibility) 、**分區(qū)耐受性(Partition Tolerance,系統(tǒng)具有跨網(wǎng)絡(luò)分區(qū)的伸縮性)**這三個條件。

在大型網(wǎng)站應(yīng)用中,數(shù)據(jù)規(guī)??偸强焖贁U張的,因此可伸縮即分區(qū)耐受性必不可少,規(guī)模變大以后,機器數(shù)量也會變得龐大,這是網(wǎng)路和服務(wù)器故障會頻繁吹安,要想保證應(yīng)用可用,就必須保證分布式處理系統(tǒng)的高可用。所以在大型網(wǎng)站中,通常會選擇強化分布式存儲系統(tǒng)的可用性(A)和伸縮性(P),而在某種程度上放棄一致性(C)。

數(shù)據(jù)不一致出現(xiàn)原因:系統(tǒng)高并發(fā)寫操作或者集群狀態(tài)不穩(wěn)定(故障恢復、集群擴容)。

數(shù)據(jù)一致性分為:

  • 數(shù)據(jù)強一致:各副本的數(shù)據(jù)在物理存儲中總是一致的;數(shù)據(jù)更新操作結(jié)果和操作響應(yīng)總是一致的,即操作響應(yīng)通知更新失敗,那么數(shù)據(jù)一定沒有被更新,而不是出于不確定狀態(tài)。

  • 用戶數(shù)據(jù)一致:數(shù)據(jù)在物理存儲中的各個副本的數(shù)據(jù)可能是不一致的,但終端用戶訪問時,通過糾錯和校驗機制,可以確定一個一直的且正確的數(shù)據(jù)返回給用戶。

  • 數(shù)據(jù)最終一致:物理存儲的數(shù)據(jù)可能不一致,終端用戶訪問到數(shù)據(jù)可能不一致,但系統(tǒng)經(jīng)過一段時間的自我恢復和修正,數(shù)據(jù)最終達到一直。

保證數(shù)據(jù)存儲高可用的手段:

2. 數(shù)據(jù)備份

保證數(shù)據(jù)有多個副本,任意副本的失效都不會導致數(shù)據(jù)的永久丟失,從而實現(xiàn)數(shù)據(jù)完全的持久化。

數(shù)據(jù)備份方式:

  • 冷備:簡單、廉價、成本和技術(shù)難度低。缺點不能保證數(shù)據(jù)最終一致。

  • 熱備:

  • 異步熱備:多份數(shù)據(jù)副本的寫入操作異步完成。

  • 同步熱備:多份數(shù)據(jù)副本的下入操作同步完成。

3. 失效轉(zhuǎn)移機制

保證當一個數(shù)據(jù)副本不可訪問時,可以快速切換訪問數(shù)據(jù)的其他副本,保證系統(tǒng)可用。

失效轉(zhuǎn)移操作組成:

  • 失效確認:通過 心跳檢測應(yīng)用程序訪問失敗報告 判斷服務(wù)器是否宕機

  • 訪問轉(zhuǎn)移:將數(shù)據(jù)的讀寫訪問重新路由到其他服務(wù)器(不路由到宕機的服務(wù)器)

  • 數(shù)據(jù)恢復:從健康的服務(wù)器復制數(shù)據(jù),將數(shù)據(jù)副本數(shù)目恢復到設(shè)定值

高可用網(wǎng)站的軟件質(zhì)量保證

為了保證線上系統(tǒng)的可用性采取的一些質(zhì)量保證手段:

  • 網(wǎng)站發(fā)布:每次關(guān)閉服務(wù)器中的一小部分,并在發(fā)布完成后立即可以訪問。

  • 自動化測試:Selenium自動化測試工具。

  • 預發(fā)布驗證:先發(fā)布到預發(fā)布機器上,然后進行預發(fā)布驗證,驗證典型的業(yè)務(wù)流程,確認沒有問題后正式發(fā)布。

  • 代碼控制:主干開發(fā)、分支發(fā)布;分支開發(fā),主干發(fā)布。工具:SVN,Git。

  • 自動化發(fā)布:火車發(fā)布模型。

  • 灰度發(fā)布:將集群服務(wù)器分成若干部分,每天只發(fā)布一部分服務(wù)器,觀察運行是否穩(wěn)定,第二天繼續(xù)發(fā)布一部分服務(wù)器。

網(wǎng)站運行監(jiān)控

監(jiān)控數(shù)據(jù)采集

  • 用戶行為日志收集

  • 服務(wù)器端日志收集

  • 客戶端瀏覽器日志收集

  • 服務(wù)器性能監(jiān)控

  • 系統(tǒng)Load

  • 內(nèi)存占用

  • 磁盤

  • 網(wǎng)絡(luò)IO

  • 運行數(shù)據(jù)報告:監(jiān)控一些與具體業(yè)務(wù)場景相關(guān)的技術(shù)和業(yè)務(wù)指標。

監(jiān)控管理

需要根據(jù)實時監(jiān)控數(shù)據(jù)進行風險預警,并對服務(wù)器進行失效轉(zhuǎn)移,自動負載調(diào)整,最大化利用集群所有機器資源。

  • 系統(tǒng)報警:對超過閾值的指標進行報警,如郵件、短信、語音等。

  • 失效轉(zhuǎn)移:發(fā)現(xiàn)故障主動通知應(yīng)用,進行失效轉(zhuǎn)移。

  • 自動優(yōu)雅降級:為應(yīng)對訪問高峰,主動關(guān)閉部分功能,釋放部分系統(tǒng)資源,保證網(wǎng)站核心功能正常訪問。

可伸縮

伸縮性是指通過不斷向集群中加入服務(wù)器的手段來緩解不斷上升的用戶并發(fā)訪問壓力和不斷增長大數(shù)據(jù)存儲需求。

衡量架構(gòu)伸縮性標準:

  • 是否可以用多臺服務(wù)器構(gòu)建集群

  • 是否容易向集群中添加新的服務(wù)器

  • 加入新的服務(wù)器后是否可以提供和原來的服務(wù)無差別的服務(wù)

  • 集群中可容納的服務(wù)器數(shù)量是否有限制

網(wǎng)站的伸縮性設(shè)計分類

網(wǎng)站的伸縮性設(shè)計主要分成以下兩類:

1. 根據(jù)功能進行物理分離實現(xiàn)伸縮

通過物理上分離不同的網(wǎng)站功能,實現(xiàn)網(wǎng)站伸縮性的手段,可以在網(wǎng)站發(fā)展的任何階段使用。不同服務(wù)器部署不同的服務(wù),提供不同的功能。

分離主要分為兩種情況:

  • 縱向分離(分層后分離):將業(yè)務(wù)處理流程上的不同部分分離部署,實現(xiàn)系統(tǒng)伸縮性。

  • 橫向分離(業(yè)務(wù)分割后分離):將不同的業(yè)務(wù)模塊分離部署,實現(xiàn)系統(tǒng)伸縮性。

2. 單一功能通過集群實現(xiàn)伸縮

隨著網(wǎng)站訪問量的逐步增加,單一的服務(wù)器也不同滿足業(yè)務(wù)規(guī)模的要求,需要使用服務(wù)器集群,將相同服務(wù)部署在多臺服務(wù)器上構(gòu)成一個集群整體對外提供服務(wù)。

應(yīng)用服務(wù)器集群的伸縮性設(shè)計

負載均衡技術(shù)

1. HTTP重定向負載均衡

利用HTTP重定向協(xié)議實現(xiàn)負載均衡。

HTTP重定向服務(wù)器會根據(jù)用戶的HTTP請求計算一臺真實的Web服務(wù)器地址,并將該Web服務(wù)器地址寫入HTTP重定向響應(yīng)(響應(yīng)狀態(tài)碼302)中返回給用戶瀏覽器,瀏覽器自動重新請求實際物理服務(wù)器。

優(yōu)缺點:

  • 優(yōu)點:實現(xiàn)簡單

  • 缺點:瀏覽器需要兩次請求服務(wù)器才能完成一次訪問,性能較差;重定向服務(wù)器自身處理能力會成為瓶頸;使用302重定向,可能會讓搜索引擎判斷為SEO作弊,降低搜索排名。

HTTP重定向負載均衡在實際生產(chǎn)環(huán)境中很少使用。

2. DNS域名解析負載均衡

通過DNS處理域名解析請求的同時進行負載均衡處理的一種方案。

每次域名解析請求都會根據(jù)負載均衡算法計算一個不同的IP地址返回,可以將請求分布到多臺服務(wù)器上,實現(xiàn)負載均衡。

優(yōu)缺點:

  • 優(yōu)點:將負載均衡的工作轉(zhuǎn)交給DNS,省去了網(wǎng)站管理維護負載服務(wù)器的麻煩;DNS還支持基于地理位置的域名解析,會將域名解析成距離用戶地理最近的一個服務(wù)器地址,從而加快用戶訪問速度,改善性能。

  • 缺點:DNS是多級解析,每級DNS都會緩存服務(wù)器配置,修改了DNS配置,需要較長時間才能生效。

DNS域名解析一般作為第一級負載均衡。

3. 反向代理負載均衡

利用反向代理服務(wù)器進行負載均衡。

優(yōu)缺點:

  • 優(yōu)點:和代理服務(wù)器集成簡單

  • 缺點:反向代理服務(wù)器是所有請求和響應(yīng)的中轉(zhuǎn)站,其性能可能會成為瓶頸。

4. IP負載均衡

在網(wǎng)絡(luò)層通過修改請求目標地址進行負載均衡。在內(nèi)核進程中完成數(shù)據(jù)分發(fā),性能較好。集群的最大響應(yīng)數(shù)據(jù)吞吐量受制于負載均衡服務(wù)器網(wǎng)卡帶寬。

5. 數(shù)據(jù)鏈路層負載均衡

在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進行負載均衡。Linux平臺最好的鏈路層負載均衡開源產(chǎn)品 LVS 。

負載均衡算法

1. 輪詢(Round Robin,RR)

所有請求被依次分發(fā)到每臺應(yīng)用服務(wù)器上,即每臺服務(wù)器需要處理的請求數(shù)目都相同,適合于所有服務(wù)器硬件都相同的場景。

2. 加權(quán)輪詢(Weight Round Robin,WRR)

根據(jù)應(yīng)用服務(wù)器硬件性能的情況,在輪詢的基礎(chǔ)上,按照配置的權(quán)重將請求分發(fā)到每個服務(wù)器,性能高的服務(wù)器分配更多請求。

3. 隨機(Random)

請求被隨機分配到各個應(yīng)用服務(wù)器。實現(xiàn)簡單。

4. 最少連接(Least Connections)

記錄每個應(yīng)用服務(wù)器正在處理的連接數(shù)(請求數(shù)),將新到的請求分發(fā)到最少連接的服務(wù)器上。最符合負載均衡定義的算法。

5. 源地址散列(Source Hashing)

根據(jù)請求來源IP地址進行Hash計算,得到應(yīng)用服務(wù)器,這樣來自同一個IP地址的請求總在同一個服務(wù)器上處理,該請求的上下文信息可以存儲在這臺服務(wù)器上,在一個會話內(nèi)重復使用,從而實現(xiàn)會話黏滯。

分布式緩存集群的伸縮性設(shè)計

分布式緩存服務(wù)器集群中不同服務(wù)器中緩存的數(shù)據(jù)各不相同,緩存訪問請求不可以在緩存服務(wù)器集群中的任意一臺處理,必須先找到緩存有需要數(shù)據(jù)的服務(wù)器,然后才能訪問。

緩存的目的: 加速數(shù)據(jù)讀取的速度減輕數(shù)據(jù)存儲服務(wù)器的負載壓力 。

分布式緩存集群伸縮性設(shè)計的主要目標:新加入緩存服務(wù)器應(yīng)使整個緩存服務(wù)器集群中已經(jīng)緩存的數(shù)據(jù)盡可能還被訪問到。

一致性哈希算法

一致性Hash算法通過一致性Hash環(huán)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)Key到緩存服務(wù)器的Hash映射。

算法過程:先構(gòu)造一個長度為 0~的整數(shù)環(huán)(一致性Hash環(huán)),根據(jù)節(jié)點名稱的Hash值( 范圍0~)將緩存服務(wù)器節(jié)點放置在這個Hash環(huán)上。然后根據(jù)需要緩存的數(shù)據(jù)的Key值計算得到其Hash值,然后再Hash環(huán)上順時針找距離這個Key的Hash值(范圍 0~)最近的緩存服務(wù)節(jié)點,完成Key到服務(wù)器的Hash映射查找。

擴容的時候,將新加入的節(jié)點的Hash放入一致性Hash環(huán)中,由于Key是順時針查找距離最近的節(jié)點,因此新加入的節(jié)點只影響整個換中的一小段。

解決一致性Hash算法帶來的負載不均衡的問題

將每臺物理緩存服務(wù)器虛擬為一組虛擬緩存服務(wù)器,將虛擬服務(wù)器的Hash值放置在Hash環(huán)上,Key在換上先找到虛擬服務(wù)器節(jié)點,在得到物理服務(wù)器的信息。這樣新加入的物理服務(wù)器節(jié)點是一組虛擬節(jié)點,如果虛擬節(jié)點足夠多的,這組虛擬節(jié)點將會影響同樣多數(shù)目的已經(jīng)在環(huán)上存在的虛擬節(jié)點。

物理節(jié)點對應(yīng)的虛擬節(jié)點越多,各個物理節(jié)點之間的負載越均衡,新加入物理服務(wù)器對原有的物理服務(wù)器的影響越保持一致。

根據(jù)經(jīng)驗,一臺物理服務(wù)器虛擬為150個虛擬服務(wù)器節(jié)點。

數(shù)據(jù)存儲服務(wù)器集群的伸縮性設(shè)計

數(shù)據(jù)存儲層必須保證數(shù)據(jù)的可靠存儲,任何情況下都必須保證數(shù)據(jù)的 可用性正確性 。

1. 關(guān)系數(shù)據(jù)庫集群的伸縮性設(shè)計

架構(gòu)設(shè)計:主從架構(gòu)、主從讀寫分離、主從復制、分庫

分庫:不同業(yè)務(wù)數(shù)據(jù)表部署在不同的數(shù)據(jù)庫集群上。缺點:夸庫不能Join。

2. NoSQL數(shù)據(jù)庫的伸縮性設(shè)計

NoSQL數(shù)據(jù)庫產(chǎn)品都放棄了關(guān)鍵數(shù)據(jù)庫的兩大重要基礎(chǔ):

  • 以關(guān)系代數(shù)為基礎(chǔ)的結(jié)構(gòu)化查詢語言(SQL)

  • 事務(wù)一致性保證(ACID)

NoSQL更關(guān)注: 高可用性可伸縮性

可擴展

軟件設(shè)計的終極目標: 低耦合 系統(tǒng)。

低耦合系統(tǒng)更容易擴展,低耦合模塊更容易復用,低耦合的系統(tǒng)設(shè)計會讓開發(fā)過程和維護變得更加輕松和容易管理。

主要目的:網(wǎng)站的架構(gòu)能夠快速響應(yīng)需求變化。

可擴展架構(gòu)的核心思想: 模塊化,并在此基礎(chǔ)之上,降低模塊間的耦合性,提高模塊的復用性。

衡量標準:網(wǎng)站增加新的業(yè)務(wù)產(chǎn)品時,是否可以實現(xiàn)對現(xiàn)有產(chǎn)品透明無影響,不需要任何改動或者很少鈣能既有業(yè)務(wù)功能就可以上線新產(chǎn)品。不同產(chǎn)品之間低耦合。

網(wǎng)站可伸縮架構(gòu)主要手段是 事件驅(qū)動架構(gòu)分布式服務(wù)

利用分布消息隊列降低系統(tǒng)耦合性

事件驅(qū)動架構(gòu)

事件驅(qū)動架構(gòu)(Event Driven Architecture):通過在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,并借助事件消息的通信完成模塊間合作。如生產(chǎn)者消費者模式。

常用的事件驅(qū)動架構(gòu):分布式消息隊列。

利用消息隊列,將用戶請求和其他業(yè)務(wù)事件構(gòu)造成消息發(fā)布到消息隊列,消息的處理者作為消費者從消息隊列中獲取消息進行處理。通過這種方式將消息產(chǎn)生和消息處理分離開來,可以透明地增加新的消息生產(chǎn)者任務(wù)或者新的消息消費者任務(wù)。

分布式消息隊列

消息 生產(chǎn)者 應(yīng)用程序通過遠程訪問接口將 消息 推送消息隊列服務(wù)器 ,消息隊列服務(wù)器將消息寫入本地內(nèi)存隊列后即立即返回成功響應(yīng)給消息生產(chǎn)者。消息隊列服務(wù)器根據(jù)消息訂閱列表查找訂閱該消息的消息消費者應(yīng)用程序,將消息隊列中的消息按照 先進先出 的原則將 消息 通過遠程通信接口發(fā)送給消息 消費者 程序。

利用分布式服務(wù)打造可復用的業(yè)務(wù)平臺

將業(yè)務(wù)和可復用服務(wù)分離開來,通過分布式服務(wù)框架調(diào)用。

巨無霸應(yīng)用存在問題:

  • 編譯、部署困難

  • 代碼分支管理困難

  • 數(shù)據(jù)庫連接耗盡

  • 新增業(yè)務(wù)困難

解決方案就是 拆分 ,將模塊獨立部署,降低系統(tǒng)耦合性。

  • 縱向拆分:將一個大應(yīng)用拆分為多個小應(yīng)用,如果新增業(yè)務(wù)比較獨立,那么就直接將其部署為一個獨立的應(yīng)用系統(tǒng)。

  • 橫向拆分:將復用的業(yè)務(wù)拆分開來,獨立部署為分布式服務(wù),新增業(yè)務(wù)只需調(diào)用這些分布式服務(wù),不需要依賴具體的模塊代碼。

大型網(wǎng)站分布式服務(wù)的需求和特點

  • 服務(wù)注冊與發(fā)現(xiàn)

  • 服務(wù)調(diào)用

  • 負載均衡

  • 失效轉(zhuǎn)移

  • 高效的遠程通信

  • 整合異構(gòu)系統(tǒng)

  • 對應(yīng)用最少侵入

  • 版本管理

  • 實時監(jiān)控

利用開放平臺建設(shè)網(wǎng)站生態(tài)圈

  • API接口:Restful、WebService、RPC等

  • 協(xié)議轉(zhuǎn)換:將各種API輸入轉(zhuǎn)換成內(nèi)部服務(wù)可以識別的形式,并將內(nèi)部服務(wù)的返回封裝成API的格式。

  • 安全:身份識別、權(quán)限控制、分級的訪問帶寬限制。

  • 審計:記錄第三方應(yīng)用的訪問情況,并進行監(jiān)控、計費等。

  • 路由:將開放平臺的耕種訪問路由映射到具體的內(nèi)部服務(wù)。

  • 流程:將一組離散的服務(wù)組織成一個上下文相關(guān)的新服務(wù),隱藏服務(wù)細節(jié),提供統(tǒng)一接口供開發(fā)者調(diào)用。

安全性

安全性是指保護網(wǎng)站不受惡意訪問和攻擊,保護網(wǎng)站的重要數(shù)據(jù)不被竊取。

衡量標準:針對現(xiàn)存和潛在的各種攻擊與竊密手段,是否有可靠的應(yīng)對策略。

網(wǎng)站攻擊和防御

XSS攻擊

XSS攻擊即 跨站點腳本攻擊 (Cross Site Script),指黑客通過篡改網(wǎng)頁,注入惡意HTML腳本,在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。常見攻擊類型有:

  • 反射型:攻擊者誘使用戶點擊一個嵌入惡意腳本的連接,達到攻擊目的。

  • 持久型:黑客提交含有惡意腳本的請求,保存在被攻擊的Web站點的數(shù)據(jù)庫中,用戶瀏覽網(wǎng)頁時,惡意腳本被包含在正常頁面中,達到攻擊的目的。

XSS防攻擊手段:

  • 消毒:對html危險字符進行轉(zhuǎn)義。消毒幾乎是所有網(wǎng)站最必備的XSS防攻擊手段。

  • HttpOnly:瀏覽器進制頁面JavaScript訪問帶有HttpOnly屬性的Cookie。HttpOnly主要是防止XSS攻擊者竊取Cookie。

注入攻擊

注入攻擊主要由 SQL注入攻擊OS注入攻擊 兩種。

SQL注入攻擊

攻擊者在HTTP請求中注入惡意SQL命令,服務(wù)器用請求參數(shù)構(gòu)造數(shù)據(jù)庫SQL命令(如刪除數(shù)據(jù)庫表)時,惡意SQL被一起構(gòu)造,并在數(shù)據(jù)庫中執(zhí)行。

SQL注入攻擊前提:攻擊者需要對要攻擊的數(shù)據(jù)庫結(jié)構(gòu)有所了解。

攻擊者獲取數(shù)據(jù)庫表結(jié)構(gòu)信息手段:

  • 開源:開源軟件搭建的網(wǎng)站數(shù)據(jù)結(jié)構(gòu)是公開的。

  • 錯誤回顯:攻擊者可以通過服務(wù)端返回的異常信息,猜測數(shù)據(jù)庫表結(jié)構(gòu)。

  • 盲注:攻擊者根據(jù)頁面變化情況判斷SQL語句的執(zhí)行情況,猜測數(shù)據(jù)庫表結(jié)構(gòu)。

防御

首先應(yīng)避免被攻擊者猜測到表名等數(shù)據(jù)庫表結(jié)構(gòu)信息。

除此之外還有以下兩種方式:

  • 消毒:通過正則匹配過濾請求數(shù)據(jù)中可能注入的SQL。請求參數(shù)消毒是一種比較簡單粗暴又有效的手段。

  • 參數(shù)綁定:使用預編譯手段,綁定參數(shù)是最好的防SQL注入方法。

CSRF攻擊

CSRF(Cross Site Request Forgery, 跨站點請求偽造 ),指的是攻擊者通過跨站請求,以合法用戶的身份進行非法操作,如轉(zhuǎn)賬交易、發(fā)表評論等。

CSRF攻擊的主要手法:利用跨站請求,在用戶不知情的情況下,以用戶的身份偽造請求。

核心是利用了瀏覽器Cookie或服務(wù)器Session策略,盜取用戶身份。

CSRF攻擊防御主要手段是 識別請求者身份 。主要有下面幾種方法:

  • 表單Token:通過在請求參數(shù)中增加隨機數(shù)的方法來阻止攻擊者獲得所有請求參數(shù)。正常請求會包含token隨機數(shù),每次請求都不一樣,偽造請求無法獲得該值,服務(wù)器檢查請求參數(shù)中token的值是否存在并且正確以確定請求提交者是否合法。

  • 驗證碼:在請求提交時,需要用戶輸入驗證碼,以避免在用戶不知情的情況下被攻擊者偽造請求。但是輸入驗證碼是一個很糟糕的用戶體驗。

  • Referer Check:通過檢查HTTP請求的Referer域中記錄的請求來源,驗證其是否合法。常見場景如:圖片防盜鏈。

其他攻擊和漏洞

1. Error Code

錯誤回顯,指的是服務(wù)器端未處理異常堆棧信息直接輸出到客戶端瀏覽器。

防御:配置web服務(wù)器參數(shù),跳轉(zhuǎn)500頁面到指定的錯誤頁面,避免將異常堆棧信息直接返回給用戶。

2. HTML注釋

在瀏覽器中是可以看到HTML代碼中注釋的部分,這樣會給黑客造成攻擊便利。

防御:程序在最終發(fā)布前需要進行代碼review或自動掃描,避免HTML注釋漏洞。

3. 文件上傳

攻擊方式:上傳一個可執(zhí)行的程序,并通過該程序獲得服務(wù)器端命令執(zhí)行能力。

防御:設(shè)置上傳文件白名單,只允許上傳可靠的文件類型。此外還可以修改文件名、使用專門的存儲等手段,保護服務(wù)器免受上傳文件攻擊。

4. 路徑遍歷

攻擊方式:攻擊者在請求的URL中使用相對路徑,遍歷系統(tǒng)為開放的目錄和文件。

防御:將JS、CSS等資源文件部署在獨立服務(wù)器,使用獨立域名,其他文件不適用靜態(tài)URL訪問,動態(tài)參數(shù)不包含文件路徑信息。

信息加密技術(shù)及密鑰安全管理

為了保護網(wǎng)站的敏感數(shù)據(jù),需要對這些敏感數(shù)據(jù)進行加密處理,信息加密技術(shù)分為三類:

單向散列加密

通過對不同輸入長度的信息進行散列計算,得到固定長度的輸出,散列計算是單向的,即不能對固定長度的輸出進行計算從而獲得輸入信息。

使用場景:密碼加密保存,生成信息摘要,計算具有高離散程度的隨機數(shù)等。

常用單向散列算法:MD5、SHA等。

對稱加密

加密和解密使用的密鑰是同一密鑰(或者可以互相推算)。

使用場景:Cookie加密,通信加密等。

優(yōu)缺點:

  • 優(yōu)點:算法簡單,加密效率高,系統(tǒng)開銷小,適合對大量數(shù)據(jù)加密。

  • 缺點:加解密使用同一個密鑰。

常用對稱加密算法:DES、RC算法。

非對稱加密

加密和解密使用的密鑰不同,其中一個對外界公開,叫做 公鑰 ,另一個只有所有者知道,被稱為 私鑰 。用公鑰加密的信息必須用私鑰才能解開,反之,用私鑰加密的信息只有公鑰才能解開。理論上不可能通過公鑰計算獲得私鑰。

使用場景:信息安全傳輸,數(shù)字簽名等。

常用非對稱加密算法:RSA算法。

HTTPS傳輸中瀏覽器使用的數(shù)字證書就是經(jīng)過權(quán)威機構(gòu)認證的非對稱加密的公鑰。

信息過濾與反垃圾

常用的信息過濾與反垃圾手段有以下幾種:

文本匹配

主要用來解決敏感詞過濾問題。

快速判斷信息中是否包含敏感詞方法:

  • 正則匹配:適用于敏感詞較少,信息文本較短場景。正則表達式的效率一般較差。

  • Trie樹及變種:算法本質(zhì)是確定一個有限狀態(tài)的自動機,根據(jù)輸入數(shù)據(jù)進行狀態(tài)轉(zhuǎn)移。

分類算法

算法原理:先將批量已經(jīng)分好類的樣本數(shù)據(jù)輸入分類算法進行訓練,可以得到一個分類模型,然后再利用分類算法結(jié)合分類模型對待處理郵件進行識別。

簡單實用的分類算法:貝葉斯分類

實用場景:反垃圾、信息自動分類等

黑名單

將需要過濾的內(nèi)容加入到黑名單中,然后從黑名單中進行查找,如果找到,就過濾掉。

常用數(shù)據(jù)結(jié)構(gòu):Hash表、BloomFilter。

電子商務(wù)風險控制

交易安全是電子商務(wù)網(wǎng)站的底線。

風險

主要風險:

  • 賬戶風險:如賬戶被黑客盜用、惡意注冊賬號等。

  • 買家風險:買家惡意下單占用庫存進行不正當競爭;黃牛利用促銷搶購低價商品。

  • 賣家風險:不良賣家進行惡意欺詐。

  • 交易風險:信用卡盜刷、支付欺詐、洗錢套現(xiàn)等。

風控

風控手段包括 自動人工 兩種。

自動風控技術(shù):

  • 規(guī)則引擎:將 業(yè)務(wù)規(guī)則規(guī)則處理邏輯 分離的技術(shù)。缺點:規(guī)則沖突,難以維護,規(guī)則越多性能越差。

  • 統(tǒng)計模型:使用統(tǒng)計模型進行風險控制。分類算法或者更復雜的機器學習算法。

關(guān)注作者:JAVA高級程序員

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多