?????? 擴展性是指對現有系統影響最小的情況下,系統功能可持續擴展或提升的能力。
???????設計網站可擴展架構的核心思想是**模塊化**,并在此基礎上,降低模塊間的耦合性,提供模塊的復用性。模塊通過分布式部署,獨立的模塊部署在獨立的服務器上(集群)從物理上分離模塊之間的耦合關系。
?????? 模塊分布式部署以后具體聚合方式主要有**分布式消息隊列和分布式服務**。
### 1、利用分布式消息隊列降低系統耦合性
?????? 如果模塊之間不存在直接調用,那么新增模塊或者修改模塊對其他模塊影響最小,這樣系統的可擴展性無疑更好一些。
?????? 事件驅動框架:通過在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,并借助事件消息的通信完成模塊間合作,典型的架構就是**生產者消費者模式**。在大型網站架構中,具體實現手段很多,最常用的就是分布式消息隊列,如下圖所示:

????? 消息隊列利用**發布-訂閱**模式工作,消息發送者發布消息,一個或者多個消息接收者訂閱消息。
????? 由于消息發送者不需要等待消息接受者處理數據就可以返回,系統具有更好的響應延遲;同時,在網站訪問高峰,消息可以暫時存儲在消息隊列中等待處理,減輕數據庫等后端存儲的負載壓力。
????? 目前開源的和商業的分布式消息隊列產品有很多,比較著名的有Apache ActiveMQ等,如下是分布式消息隊列的架構原理:

### ?2、利用分布式服務打造可復用的業務平臺
?????? 使用分布式服務是降低系統耦合性的另一個重要手段。如果說分布式消息隊列通過消息對象分解系統耦合性,不同子系統處理同一個消息;那么分布式服務則通過接口分解系統耦合性,不同子系統通過相同的接口描述進行服務調用。
?????? 大型網站分布式服務的需求與特點:
1. **負載均衡**
1. **失效轉移**
1. **高效的遠程通信**
1. **整合異構系統**
1. **對應用最小入侵**
1. **版本管理**
1. **實時監控**
目前國內有較多成功實施案例的開源**分布式服務框架**是阿里巴巴的Dubbo,下圖是Dubbo的架構原理:

?????? 服務消費程序通過服務接口使用服務,而服務接口通過代理加載具體服務,具體服務可以是本地的代碼模塊,也可以是遠程的服務,因此對應用較小入侵;應用程序需要調用服務接口,服務框架根據配置自動調用本地或遠程實現。
?????? 服務框架客戶端模塊通過服務注冊中心加載服務提供者列表(服務提供者啟動后主動向服務注冊中心注冊自己可提供的服務接口列表),查找需要的服務接口,并根據配置的負載均衡策略將服務調用請求發送到某臺服務提供者服務器。如果服務調用失敗,客戶端模塊會自動從服務提供者列表選擇一個可提供同樣服務的另一臺服務器重新請求服務,實現服務的自動失效轉移,保證高可用服務。
### 3、利用開放平臺建設網站生態圈
?????? 大型網站為了更好的服務自己的用戶,開放更多的增值服務,會把網站內部的服務封裝成一些調用接口開放出去,共外部的第三方開發者使用,這個提供開放接口的平臺被稱作開放平臺。
?????? 開放平臺是網站內部和外部交互的接口,外部需要面對眾多的第三方開發者,內部需要面對網站內諸多的業務服務。雖然每個網站的業務場景和需求都不相同,但開發平臺的架構設計卻大同小異,如下圖所示:

**API接口**:是開發平臺暴露給開發者使用的一組API,其形式可以是RESTfull,WebService,RPC等各種形式。
**協議轉換**:將各種API輸入轉換成內部服務可以識別的形式,并將內部服務的返回封裝成API格式。
**安全**:除了一般應用需要的身份識別、權限控制等安全手段,開放平臺還需要分級的訪問帶寬限制,以保證資源被公平合理的使用。
**審計**:記錄第三方應用的訪問情況并進行監控、計費等。
**路由**:將開放平臺的各種訪問路由映射到具體的內部的服務。
**流程**:將一組離散的服務組織成一個上下文相關的新服務,隱藏服務細節,提供統一接口供開發者調用。