程模型)
從單體到集群簡(jiǎn)介單體撐不住業(yè)務(wù)增長(zhǎng)時(shí)先演進(jìn)為集群再逐步走向分布式架構(gòu)演進(jìn)路線圖中紅色節(jié)點(diǎn)是現(xiàn)階段要完成的演進(jìn)架構(gòu)總是和業(yè)務(wù)發(fā)展相關(guān)聯(lián)發(fā)展到什么階段就用什么架構(gòu)不要過(guò)度設(shè)計(jì)架構(gòu)初創(chuàng)團(tuán)隊(duì)用單體就能滿足需求不可能一上來(lái)就做分布式單體部署兩個(gè) Tomcat前端項(xiàng)目、后端項(xiàng)目和數(shù)據(jù)庫(kù) MariaDB 都是單節(jié)點(diǎn)前期為了節(jié)省成本可以放在同一臺(tái)云服務(wù)器上分開(kāi)部署到三臺(tái)服務(wù)器后它們各自仍然是獨(dú)立的單體單體架構(gòu)的優(yōu)點(diǎn)小團(tuán)隊(duì)成型即可完成開(kāi)發(fā)、測(cè)試、上線溝通成本低迭代周期短速度快停機(jī) 10~30 分鐘即可完成維護(hù)線上 bug 可以立即修復(fù)打包方便運(yùn)維省事直接打成一個(gè) war 包交給運(yùn)維發(fā)布單體架構(gòu)面臨的挑戰(zhàn)挑戰(zhàn)說(shuō)明解決方向單節(jié)點(diǎn)宕機(jī)造成所有服務(wù)不可用用戶量增長(zhǎng)后系統(tǒng)承載量成為瓶頸宕機(jī)或卡頓對(duì)企業(yè)是毀滅性打擊集群實(shí)現(xiàn)高可用耦合度太高迭代、測(cè)試、部署代碼越來(lái)越臃腫可讀性、可維護(hù)性、可擴(kuò)展性變差每次發(fā)布都要把耦合的功能重新測(cè)一遍業(yè)務(wù)拆分分布式或微服務(wù)單節(jié)點(diǎn)并發(fā)能力有限并發(fā)能力取決于自身優(yōu)化和硬件配置單機(jī)總會(huì)碰到天花板負(fù)載均衡把請(qǐng)求分發(fā)到其他節(jié)點(diǎn)集群概念計(jì)算機(jī)以“群體”的方式構(gòu)成整個(gè)系統(tǒng)由多臺(tái)計(jì)算機(jī)節(jié)點(diǎn)共同組成每臺(tái)計(jì)算機(jī)服務(wù)器稱為一個(gè)節(jié)點(diǎn)這個(gè)“群體”是一個(gè)整體對(duì)用戶透明用戶不知道后臺(tái)有多少臺(tái)計(jì)算機(jī)只知道有一個(gè)服務(wù)器在處理請(qǐng)求“人多力量大”群體提升并發(fā)能力與可用性也就是負(fù)載均衡和高可用各節(jié)點(diǎn)運(yùn)行相同的業(yè)務(wù)是集群運(yùn)行不同的業(yè)務(wù)是分布式圖示理解圖中紅色節(jié)點(diǎn)部署的業(yè)務(wù)一模一樣這樣才能稱為集群訂單、商品的訪問(wèn)流量大單獨(dú)抽出來(lái)并增加節(jié)點(diǎn)整體是一個(gè)分布式的集群系統(tǒng)類比組裝汽車輪子和底盤 4 個(gè)人一起做是集群方向盤和座椅 1 個(gè)人做是單機(jī)使用集群的優(yōu)勢(shì)提高系統(tǒng)性能流量分發(fā)到各個(gè)節(jié)點(diǎn)提高系統(tǒng)可用性一兩個(gè)節(jié)點(diǎn)宕機(jī)剩余節(jié)點(diǎn)仍可提供服務(wù)即高可用可擴(kuò)展、可伸縮預(yù)測(cè)到高流量時(shí)提前增加節(jié)點(diǎn)流量平緩后再減少使用集群的注意點(diǎn)注意點(diǎn)問(wèn)題解決用戶會(huì)話會(huì)話保存在 Tomcat 里不能跨 Tomcat使用分布式會(huì)話通過(guò) Redis 實(shí)現(xiàn)定時(shí)任務(wù)到時(shí)間點(diǎn)后每個(gè)節(jié)點(diǎn)都會(huì)跑一遍相同的任務(wù)浪費(fèi)資源單獨(dú)部署一個(gè)定時(shí)任務(wù)服務(wù)或使用 MQ 延時(shí)任務(wù)內(nèi)網(wǎng)互通節(jié)點(diǎn)之間 ping 不通就無(wú)法組成集群所有節(jié)點(diǎn)保證在同一個(gè)局域網(wǎng)內(nèi)網(wǎng)不互通集群就實(shí)現(xiàn)不了集群、分布式、微服務(wù)都是如此什么是 Nginx 與常見(jiàn) Web 服務(wù)器簡(jiǎn)介Nginx 是高性能的 HTTP 和反向代理 Web 服務(wù)器主要功能是反向代理核心定義Nginxengine x是一個(gè)高性能的 HTTP 和反向代理 Web 服務(wù)器同時(shí)也提供 IMAP / POP3 / SMTP 服務(wù)IMAP / POP3 / SMTP 都和郵件相關(guān)俄羅斯人開(kāi)發(fā)的開(kāi)源服務(wù)器2004 年出現(xiàn)主要功能反向代理實(shí)現(xiàn)集群、負(fù)載均衡、URL 路由通過(guò)配置文件就能實(shí)現(xiàn)集群和負(fù)載均衡配置簡(jiǎn)單支持熱加載不需要重啟服務(wù)器避免用戶請(qǐng)求丟失靜態(tài)資源虛擬化把本地的 HTML、CSS、JS、圖片、視頻、音頻虛擬化成服務(wù)通過(guò) URL 訪問(wèn)在架構(gòu)中的位置客戶端的請(qǐng)求最先到達(dá) Nginx再由它分發(fā)到內(nèi)部的計(jì)算機(jī)節(jié)點(diǎn)充當(dāng)負(fù)載均衡器、反向代理器也可以稱為網(wǎng)關(guān)常見(jiàn)的服務(wù)器服務(wù)器適用場(chǎng)景MS IIS發(fā)布 ASP.NET 項(xiàng)目WebLogic、JBoss傳統(tǒng)行業(yè)的 ERP、物流、電信、金融服務(wù)收費(fèi)Tomcat、JettyJ2EEJava 項(xiàng)目以 Tomcat 為主Apache、Nginx靜態(tài)服務(wù)、反向代理Netty高性能通過(guò)編碼開(kāi)發(fā) Web Server、WebSocket Server例如聊天室Apache 與 Nginx 對(duì)比維度ApacheNginx出現(xiàn)時(shí)間更早早期占有率很高2004 年后起之秀并發(fā)能力并發(fā)超過(guò)百萬(wàn)后性能逐漸下降支持的并發(fā)更高市場(chǎng)趨勢(shì)Netcraft 2019 年 6 月統(tǒng)計(jì)占有率持續(xù)下降穩(wěn)步上升與 Apache 的差距越來(lái)越小Nginx 成本低、配置簡(jiǎn)單互聯(lián)網(wǎng)環(huán)境下絕大多數(shù)項(xiàng)目都采用 Nginx正向代理與反向代理簡(jiǎn)介兩者都位于客戶端和目標(biāo)服務(wù)器之間反向代理由代理服務(wù)器決定請(qǐng)求落到哪個(gè)節(jié)點(diǎn)對(duì)比圖圖中紅色節(jié)點(diǎn)是代理服務(wù)器第二行文字是對(duì)應(yīng)的生活例子維度正向代理反向代理定義請(qǐng)求先經(jīng)過(guò)代理服務(wù)器再轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器獲得內(nèi)容后響應(yīng)給客戶端用戶請(qǐng)求目標(biāo)服務(wù)器由代理服務(wù)器決定訪問(wèn)哪個(gè)計(jì)算機(jī)節(jié)點(diǎn)、哪個(gè) IP生活例子在家上網(wǎng)先經(jīng)過(guò)電信、移動(dòng)、聯(lián)通等運(yùn)營(yíng)商網(wǎng)吧服務(wù)器控制網(wǎng)速、屏蔽非法網(wǎng)站交報(bào)名表給教務(wù)處由教務(wù)處安排去哪個(gè)班級(jí)上課特點(diǎn)可以檢測(cè)和控制客戶端的請(qǐng)求后端如何處理對(duì)用戶透明所有請(qǐng)求都由它轉(zhuǎn)發(fā)驗(yàn)證反向代理多次執(zhí)行ping www.taobao.com一段時(shí)間內(nèi)請(qǐng)求都落在同一個(gè) IP過(guò)一兩分鐘再請(qǐng)求落到了另一個(gè) IP用戶一直訪問(wèn)同一個(gè)站點(diǎn)最終落到哪臺(tái)目標(biāo)服務(wù)器由反向代理服務(wù)器決定集群、負(fù)載均衡的原理就是反向代理反向代理之路由圖中紅色節(jié)點(diǎn) Nginx 按配置的規(guī)則把請(qǐng)求轉(zhuǎn)發(fā)到特定的服務(wù)器虛擬主機(jī)shop、center是不同的域名按域名把請(qǐng)求轉(zhuǎn)到對(duì)應(yīng)的 Tomcat路由域名后面的/image類似 Controller 里的路徑匹配后到靜態(tài)資源服務(wù)器取圖片對(duì)現(xiàn)有項(xiàng)目的作用規(guī)避域名后面帶的端口用 Nginx 發(fā)布圖片替代 Tomcat 虛擬目錄Nginx 安裝與運(yùn)行簡(jiǎn)介L(zhǎng)inux 下載到的是源碼包需要先裝依賴、配置、編譯再安裝安裝流程圖中橙色節(jié)點(diǎn)最容易漏綠色節(jié)點(diǎn)是安裝成功的標(biāo)志版本選擇官網(wǎng)http://nginx.org/的 download 頁(yè)面版本說(shuō)明Mainline version開(kāi)發(fā)版 / 預(yù)覽版可能不穩(wěn)定不推薦Stable version最新的穩(wěn)定版推薦使用例如nginx-1.16.1Legacy versions曾經(jīng)發(fā)布過(guò)的歷史版本學(xué)習(xí)階段用虛擬機(jī)里的 LinuxCentOS即可熟練后再到云服務(wù)器上使用安裝命令# 1. 安裝依賴環(huán)境yuminstall gcc-c# gcc 環(huán)境Nginx 源碼用 C 語(yǔ)言開(kāi)發(fā)yuminstall-ypcre pcre-devel# PCRE 庫(kù)用于解析正則表達(dá)式y(tǒng)uminstall-yzlib zlib-devel# zlib 壓縮和解壓縮依賴yuminstall-yopenssl openssl-devel# SSL 安全套接字層用于 HTTPS# 2. 解壓得到的是源碼需要編譯后才能安裝tar-zxvfnginx-1.16.1.tar.gz# 3. 創(chuàng)建 Nginx 臨時(shí)目錄mkdir/var/temp/nginx-p# 4. 在 nginx 源碼目錄下進(jìn)行配置目的是創(chuàng)建 Makefile 文件./configure\--prefix/usr/local/nginx\--pid-path/var/run/nginx/nginx.pid\--lock-path/var/lock/nginx.lock\--error-log-path/var/log/nginx/error.log\--http-log-path/var/log/nginx/access.log\--with-http_gzip_static_module\--http-client-body-temp-path/var/temp/nginx/client\--http-proxy-temp-path/var/temp/nginx/proxy\--http-fastcgi-temp-path/var/temp/nginx/fastcgi\--http-uwsgi-temp-path/var/temp/nginx/uwsgi\--http-scgi-temp-path/var/temp/nginx/scgi# 5. 編譯、安裝makemakeinstall# 6. 查看安裝位置即 --prefix 指定的目錄whereisnginx\代表命令換行用于提高可讀性編譯之前要先創(chuàng)建臨時(shí)目錄否則啟動(dòng) Nginx 時(shí)會(huì)報(bào)錯(cuò)configure參數(shù)說(shuō)明參數(shù)說(shuō)明--prefix指定 Nginx 安裝目錄--pid-path指向 Nginx 的 pid--lock-path鎖定安裝文件防止被惡意篡改或誤操作--error-log-path錯(cuò)誤日志--http-log-pathHTTP 日志--with-http_gzip_static_module啟用 gzip 模塊在線實(shí)時(shí)壓縮輸出數(shù)據(jù)流--http-*-temp-path設(shè)定客戶端請(qǐng)求、HTTP 代理、fastcgi、uwsgi、scgi 的臨時(shí)目錄安裝目錄/usr/local/nginx目錄說(shuō)明conf配置文件其中nginx.conf是核心配置文件html靜態(tài)資源index.html是默認(rèn)首頁(yè)50x.html是出錯(cuò)頁(yè)面sbin可執(zhí)行文件nginx常用命令在sbin目錄下執(zhí)行./nginx# 啟動(dòng)./nginx-sstop# 停止./nginx-sreload# 重新加載配置文件啟動(dòng)后用瀏覽器訪問(wèn)服務(wù)器的內(nèi)網(wǎng) IP看到Welcome to nginx!表示安裝成功修改html/index.html后刷新頁(yè)面就能看到變化注意點(diǎn)在云服務(wù)器安裝需要開(kāi)啟 Nginx 默認(rèn)端口 80在虛擬機(jī)安裝需要關(guān)閉防火墻本地 Windows 或 Mac 也需要關(guān)閉防火墻保證內(nèi)網(wǎng)互通Nginx 顯示默認(rèn)首頁(yè)的過(guò)程簡(jiǎn)介請(qǐng)求依次經(jīng)過(guò)端口、server、location、root、index一步步找到首頁(yè)文件請(qǐng)求過(guò)程圖中紅色節(jié)點(diǎn)是匹配的關(guān)鍵綠色節(jié)點(diǎn)是最終結(jié)果瀏覽器輸入 IP 時(shí)默認(rèn)使用 HTTP 協(xié)議和 80 端口所以兩者都可以省略內(nèi)網(wǎng)環(huán)境輸入內(nèi)網(wǎng) IP云服務(wù)器輸入公網(wǎng) IP末尾的/代表根路由類似 Controller 里的根路徑核心配置conf/nginx.confserver { listen 80; # 監(jiān)聽(tīng)的端口 server_name localhost; # 請(qǐng)求的 IP 或域名 location / { # 映射根路由 / root html; # 相對(duì)目錄html 和 conf 在同一級(jí) index index.html index.htm; # 默認(rèn)首頁(yè) } error_page 500 502 503 504 /50x.html; location /50x.html { root html; } }一個(gè)server塊代表一臺(tái)服務(wù)器要監(jiān)聽(tīng)多個(gè)端口可以配置多個(gè)server域名解析到本機(jī)后server_name可以寫域名例如www.example.com注意點(diǎn)修改配置文件后必須重新加載才生效把listen改成 88 后直接訪問(wèn)IP:88沒(méi)有任何內(nèi)容執(zhí)行./nginx -s reload后頁(yè)面才在 88 端口展示Nginx 進(jìn)程模型簡(jiǎn)介一個(gè) master 進(jìn)程管理多個(gè) worker 進(jìn)程worker 負(fù)責(zé)處理客戶端請(qǐng)求兩種進(jìn)程進(jìn)程角色職責(zé)master主進(jìn)程相當(dāng)于老板只有一個(gè)接收外界的信號(hào)并分發(fā)給 worker監(jiān)控 worker異常退出時(shí)重新啟動(dòng)新的 worker讀取并驗(yàn)證配置文件worker工作進(jìn)程相當(dāng)于員工默認(rèn)一個(gè)連接并處理大量客戶端請(qǐng)求、響應(yīng)數(shù)據(jù)、與后端服務(wù)通信執(zhí)行 master 傳來(lái)的重啟、關(guān)閉等指令進(jìn)程模型圖圖中紅色節(jié)點(diǎn) master 不處理請(qǐng)求信號(hào)由 master 接收再傳遞給 worker 去執(zhí)行每個(gè) worker 都有很多連接處理很多 client 的請(qǐng)求配置 worker 進(jìn)程數(shù)worker_processes 2; # 在 nginx.conf 開(kāi)頭默認(rèn)為 1./nginx-t# 檢測(cè)配置文件是否正確./nginx-sreload# 重新加載ps-ef|grepnginx# master 仍是 1 個(gè)worker 變成 2 個(gè)信號(hào)./nginx -s stop停止./nginx -s quit退出./nginx -s reload重新加載./nginx -t檢測(cè)配置收到停止信號(hào)時(shí)沒(méi)有連接的 worker 直接關(guān)閉正在處理請(qǐng)求的 worker 等請(qǐng)求處理完、連接釋放后再關(guān)閉不需要中斷服務(wù)就可以平滑地?zé)嶂貑?、熱加載多進(jìn)程模型的好處進(jìn)程之間相互獨(dú)立互不影響多線程的開(kāi)銷比進(jìn)程小但共用內(nèi)存、相互影響需要開(kāi)發(fā)人員自己維護(hù)內(nèi)存管理容易出錯(cuò)一個(gè) worker 異常退出其他 worker 繼續(xù)正常運(yùn)作master 只需再 fork 一個(gè)新的 worker更安全黑客攻擊到的可能只是某一個(gè) worker把它關(guān)閉即可其他 worker 不受影響面試/考試記憶點(diǎn)多個(gè)節(jié)點(diǎn)運(yùn)行相同的業(yè)務(wù)是集群運(yùn)行不同的業(yè)務(wù)是分布式架構(gòu)跟著業(yè)務(wù)走先單體再集群最后分布式不過(guò)度設(shè)計(jì)集群提升性能和可用性但要處理分布式會(huì)話、定時(shí)任務(wù)重復(fù)執(zhí)行、內(nèi)網(wǎng)互通Nginx 是高性能的 HTTP 和反向代理 Web 服務(wù)器可以做負(fù)載均衡、路由、靜態(tài)資源服務(wù)正向代理請(qǐng)求經(jīng)代理服務(wù)器轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器反向代理由代理服務(wù)器決定請(qǐng)求落到哪個(gè)節(jié)點(diǎn)后端對(duì)用戶透明源碼安裝四步安裝依賴、configure生成 Makefile、make編譯、make install安裝請(qǐng)求先按端口找到server再由location映射到root目錄下的index頁(yè)面修改nginx.conf后先用./nginx -t檢測(cè)再用./nginx -s reload生效master 接收信號(hào)、管理 workerworker 處理請(qǐng)求多進(jìn)程相互獨(dú)立一個(gè) worker 出問(wèn)題不影響其他 worker