大型主機缺點:
非常貴,一般的小企業用不起。
比較復雜,培養人才的成本比較高。
單點一旦故障,整個系統停轉,損失非常大。
個人PC電腦的性能越來越高,成本也越來越低。
Web時代
c/s時代:
富客戶端方案。賣軟件可賺錢。qq、影音、游戲。早期流行。
Web 1. 0
特色
主要是單向信息的發布,即信息門戶---> 廣大瀏覽器客戶端互聯網內容是由少數編輯人員(或站長)定制的。 代表:三大門戶,新浪/網易/搜狐。新浪以新聞+廣告為主,網易拓展游戲為主,搜狐延伸門戶矩陣。
一般的雛型如下圖,用戶通過瀏覽器輸入網址進行域名解析,然后從CDN上獲得靜態資源,從后臺服務器獲得html文件,這些信息拼裝組成顯示的網頁。
Web 2.0
特色
注重用戶的交互。每個人都是內容的供稿者。 RSS訂閱扮演一個很重要的作用。 代表:博客、播客、維基、P2P下載、社區、分享服務
集群跟分布式
橫向復制的集群跟縱向切分的分布式環境。
架構演進史
1. 早期雛形
特征:
應用程序主要做靜態文件讀取,返回內容給瀏覽器。 瀏覽器加載本地的若干資源 跟 瀏覽器解析從服務器獲取到的資源是一樣的!
2. 數據庫開發(LAMP特長)
linux + Apache + MySQL + php 特征:
應用程序主要主要讀取數據表值,填充html模塊。業務邏輯簡單,寫sql處理。
3. JAVAWeb雛型
特征:
Tomcat + servlet + jsp + mysql。一個war包打天下 項目結構:ssh/ssm三層結構。
4. JavaWeb的集群發展
特征:
在3的基礎上進行多個war包的復制啟動 。 硬件機器的橫向復制,對整個項目結構無影響。
5. JavaWeb分布式
特征:
將Service層單獨分離出去,成為一個單獨的項目jar。單獨運行。 Web服務器通過rpc框架,對分離出去的service進行調用。分布式是按照組件拆分。
6. JavaWeb微服務
特征:
從業務角度,細分業務為微服務,每一個微服務是一個完整的服務(從http請求到返回)。在微服務內部,將需要對外提供的接口,包裝成rpc接口,對外部開放。微服務按照 業務拆分。
后端問題
后端的不斷演進就會導致出現服務治理需求的出現。
跨系統的RPC: RMI、webservice、Http請求,
dubbo的引入, SpringCloud
服務器集群的負載路由,服務的注冊跟發現 ZooKeeper
數據量超級大時引發的
分庫/分表,需要修改業務sql語句,有侵入型,MyCat的引入。
分區,對sql語句是沒有侵入性的,但是對庫是沒辦法減輕壓力的。
單庫的MySQL承載容量一般在700W左右。
前端發展史
1.%20整頁提交
特征:
瀏覽器請求皆為頁面級請求,每次請求都是一次頁面跳轉/刷新。
2. 頁面+ ajax
特征:
瀏覽器請求主要為頁面級請求,有局部刷新使用ajax刷新,頁面體驗更好。
3. mvvm模式
MVVM是Model-View-ViewModel的簡寫。它本質上就是MVC 的改進版 特征:
首次請求返回頁面html,后續請求皆為restful返回json。
前端人員將js/css/img 資源開發完畢后 打包到apache或者Nginx上,供瀏覽器訪問 3 瀏覽器 訪問靜態資源服務器,獲得HTML資源。
HTML頁面JS發起·ajax·請求后臺服務器,得到業務數據 然后進行渲染整個頁面。跨域問題可用nginx解決。
架構思路及常見解決方案
1、緩存(list/redis/memached) 2、橫向拓展(集群負載) 3、拆分高負載服務,獨立為一模塊 4、大表數據切片( mysql分庫分區分表) 5、使用搜索中間件: solr/elasticsearch 6、全局性網站搜索跟mysql指定型搜索不一樣,只能用上面的中間件搞定 like 搜索。 7、tomcat一般在500以下為好。 8、mysql單表一般700萬以內。
session跨域共享
cookie、session、token 形象說, 跨域問題:
方案1:負載使用 hash(ip) 方案2:使用redis共享session 方案3: tomcat 插件實現共享 方案4: spring session 實現共享
常見解決方案
1. 緩沖方案
Redis 的引入。 一般緩存方案
1、先到緩存中查,有值直接返回 2、無值(緩存穿透、擊穿)則調用接口或者查庫,并將值補入緩存區 3、緩存區數據與db中可能不一致,使用過期時間調節 4、若緩存區數據集中在某一短時刻失效,將導致大量的緩存擊穿(雪崩)
永不過期方案
1、不設置過期時間,數據永久有效,避免雪崩 2、需要額外機制來實現數據的同步更新(參照數據同步)
2. 消息中間件
Kafka,RocketMQ,RabbitMQ,ActiveMQ
1、每個應用啟動時,主動注冊隊列 2、后續收/發信息,只管收/發隊列中數據 3、隊列中數據的路由策略, 由mq管理者來配置,跟應用程序無關。類似傳話筒
3. 同步異步
同步調度:
1、調度期間,主調和被調線程被同時占用。 2、被調執行完成前,主調等待。 3、程序內部的調度,則為一單線程。
異步調度:
1、主調與被調只是一次消息發送,信息到達即返回。 2、被調執行完成后,回調一次主調方,發送結果回來。 3、程序內部的調度,則回調函數是由被調線程執行。
4. 同步轉異步
同步轉異步:空間換時間,JDK Future Task模式
5. 數據切片
實現集群的動態擴容,Redis/es/fastdfs,將數據按片切分:
1、切成6個片,每個片存儲總量1/6數據 2、則兩個庫每個庫分擔三個片 3、若三個庫,則每個庫只需要承擔兩個片 4、路由管理,只記錄數據與片柱的關系