Django Web应用开发实战第十六章
一、即時(shí)通信
- AJAX技術(shù):通過AJAX實(shí)現(xiàn)網(wǎng)頁與服務(wù)器的無刷新交互,在網(wǎng)頁上每隔一段時(shí)間就通過AJAX從服務(wù)器中獲取數(shù)據(jù)。然后將數(shù)據(jù)更新并顯示在網(wǎng)頁上,這種方法簡單明了,實(shí)時(shí)性不高。
- Comet(Pushlet)技術(shù):Comet是一種Web應(yīng)用架構(gòu),服務(wù)器以異步方式向?yàn)g覽器推送數(shù)據(jù),無須瀏覽器發(fā)送請(qǐng)求。Comet架構(gòu)非常適合事件驅(qū)動(dòng)的Web應(yīng)用,以及對(duì)交互性和實(shí)時(shí)性要求較高的應(yīng)用,如股票交易行情分析、聊天室和Web版在線游戲等。
- XMPP協(xié)議:XMPP(可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議)基于XML的協(xié)議,是專為即時(shí)通信系統(tǒng)設(shè)計(jì)的通信協(xié)議。用于即時(shí)消息以及在線現(xiàn)場(chǎng)探測(cè),這個(gè)協(xié)議允許用戶向其他用戶發(fā)送即時(shí)消息。
- Flash的XmlSocket:Flash Media Server是一個(gè)強(qiáng)大的流媒體服務(wù)器,基于RTMP協(xié)議,提供了穩(wěn)定的流媒體交互功能。內(nèi)置遠(yuǎn)程共享對(duì)象(shared object)的機(jī)制。是瀏覽器創(chuàng)建并連接服務(wù)器的遠(yuǎn)程共享對(duì)象。。
- WebSocket協(xié)議:WebSocket是通過單個(gè)TCP連接提供全雙工(雙向通信)通信信道的計(jì)算機(jī)通信協(xié)議,可在瀏覽器和服務(wù)器之間進(jìn)行雙向通信,允許多個(gè)用戶連接到同一個(gè)服務(wù)器,并通過API進(jìn)行通信并立即獲得響應(yīng)。WebSocket不僅限于聊天/消息傳遞應(yīng)用程序,還適用于實(shí)時(shí)更新和即時(shí)消息交換的應(yīng)用程序。比如現(xiàn)場(chǎng)體育更新、股票行情、多人游戲、聊天應(yīng)用、社交媒體等。
二、前后端分離與微服務(wù)架構(gòu)
- vue:一套用于構(gòu)建用戶界面的漸進(jìn)式框架,它被設(shè)計(jì)為可以自底向上逐層應(yīng)用。Vue的核心只關(guān)注視圖層,不僅易上手,還便于與第三方庫或已有的項(xiàng)目整合。另一方面,當(dāng)Vue與現(xiàn)代化的工具鏈以及各種類庫結(jié)合使用時(shí),Vue完全能夠?yàn)閺?fù)雜的單頁應(yīng)用提供驅(qū)動(dòng)。
- axios.js:一個(gè)HTTP庫,用于實(shí)現(xiàn)前端的AJAX異步請(qǐng)求,從Vue2.0開始,官方推薦使用axios發(fā)送AJAX異步請(qǐng)求。
設(shè)置跨域訪問
# Vue和Django各自部署在不同服務(wù)器,兩者的協(xié)議+域名+端口號(hào)各不相同,因此Vue的AJAX請(qǐng)求訪問不到Django的API。為了實(shí)現(xiàn)兩者之間的數(shù)據(jù)傳輸,后端服務(wù)器系統(tǒng)必須設(shè)置跨域訪問。可通過第三方DjangoCors Headers實(shí)現(xiàn)。
pip install django-cors-headers INSTALLED_APPS = [
...
'corsheaders',
] MIDDLEWARE = [
...
# 跨域訪問
'corsheaders.middleware.CorMiddleware',
] # 設(shè)置HTTP請(qǐng)求是否允許攜帶Cookies信息,默認(rèn)值為False
CORS_ALLOW_CREDENTIALS = True # 只允許白明白設(shè)置的域名列表發(fā)送HTTP請(qǐng)求,默認(rèn)False,若設(shè)置True允許所有域名發(fā)送HTTP請(qǐng)求。
CORS_ORIGIN_ALLOW_ALL = True # 設(shè)置允許發(fā)送HTTP請(qǐng)求的域名列表
CORS_ORIGIN_WHITELIST = () # 設(shè)置HTTP請(qǐng)求方式
CORS_ALLOW_METHODS = (
'GET',
'DELETE',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
) # 設(shè)置非標(biāo)準(zhǔn)HTTP請(qǐng)求頭
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
...
)
微服務(wù)架構(gòu)
微服務(wù)(Microservice Architecture)是一種架構(gòu)概念,它將功能分解成不同的服務(wù),降低系統(tǒng)的耦合性,提供更加靈活的服務(wù)支持,各個(gè)服務(wù)之間通過API接口進(jìn)行通信。
微服務(wù)實(shí)現(xiàn)原理:
- 傳統(tǒng)的微服務(wù)使用單體式開發(fā),即所有網(wǎng)頁功能在一個(gè)web應(yīng)用中實(shí)現(xiàn),然后在某個(gè)服務(wù)器部署上線。
- 當(dāng)網(wǎng)站的訪問量或數(shù)據(jù)量過大時(shí),將導(dǎo)致單體式系統(tǒng)的某個(gè)功能出現(xiàn)異常,整個(gè)網(wǎng)站也隨之癱瘓。
- 對(duì)于大型網(wǎng)站來說,微服務(wù)架構(gòu)可以將網(wǎng)站功能拆分為多個(gè)不同的服務(wù),每個(gè)服務(wù)部署在不同的服務(wù)器,每個(gè)服務(wù)之間通過API通信,從而構(gòu)建網(wǎng)站功能。
- 服務(wù)之間的通信需要考慮服務(wù)的部署方式。比如重試機(jī)制
- 限流、熔斷機(jī)制、負(fù)載均衡和緩存機(jī)制等。保證每個(gè)服務(wù)的穩(wěn)健性。
- 微服務(wù)架構(gòu)一共有6種設(shè)計(jì)模式。
- (1)聚合器微服務(wù)設(shè)計(jì)模式:聚合器調(diào)用多個(gè)微服務(wù)實(shí)現(xiàn)應(yīng)用或網(wǎng)頁所需功能,每個(gè)微服務(wù)有自己的緩存和數(shù)據(jù)庫,這是一種常見的、簡單的設(shè)計(jì)模式
(2)代理微服務(wù)設(shè)計(jì)模式:是聚合微服務(wù)設(shè)計(jì)模式的演變模式,應(yīng)用程序或網(wǎng)頁根據(jù)業(yè)務(wù)需求的差異調(diào)用不同的微服務(wù),代理可以委派HTTP請(qǐng)求,也可以進(jìn)行數(shù)據(jù)轉(zhuǎn)換工作
(3)鏈?zhǔn)轿⒎?wù)設(shè)計(jì)模式:每個(gè)微服務(wù)之間通過鏈?zhǔn)椒绞竭M(jìn)行調(diào)用,如微服務(wù)A接收到請(qǐng)求后會(huì)與B進(jìn)行通信,類似地,微服務(wù)B會(huì)與微服務(wù)C進(jìn)行通信,所有微服務(wù)都使用同步消息傳遞。在整個(gè)鏈?zhǔn)秸{(diào)用完成之間,瀏覽器會(huì)一直處于等待狀態(tài)(4)分支微服務(wù)設(shè)計(jì)模式:聚合器微服務(wù)設(shè)計(jì)模型的擴(kuò)展模式,允許微服務(wù)之間相互調(diào)用
- (4)數(shù)據(jù)共享微服務(wù)設(shè)計(jì)模式:部分微服務(wù)可能會(huì)共享緩存和數(shù)據(jù)庫,即兩個(gè)或兩個(gè)以上的微服務(wù)共用一個(gè)緩存和數(shù)據(jù)庫。這種情況只有在兩個(gè)微服務(wù)之間存在強(qiáng)耦合關(guān)系時(shí)才能使用,對(duì)于使用微服務(wù)實(shí)現(xiàn)的應(yīng)用程序或網(wǎng)頁而言,這是一種反設(shè)計(jì)模式
- (5)異步消息傳遞微服務(wù)設(shè)計(jì)模式:由于API接口使用同步模式,如果API接口執(zhí)行的程序耗時(shí)過長,就會(huì)增加用戶的等待時(shí)間,因此某些微服務(wù)可以選擇使用消息隊(duì)列(異步請(qǐng)求)代替API接口的請(qǐng)求和響應(yīng)
summary:微服務(wù)設(shè)計(jì)模式不是唯一的,具體還需要根據(jù)項(xiàng)目需求、功能和應(yīng)用場(chǎng)景等多方面綜合考慮。對(duì)于微服務(wù)架構(gòu),架構(gòu)的設(shè)計(jì)意識(shí)比技術(shù)開發(fā)更為重要,整個(gè)架構(gòu)設(shè)計(jì)需要考慮多個(gè)微服務(wù)的運(yùn)維難度、系統(tǒng)部署依賴、微服務(wù)之間通信成本、數(shù)據(jù)一致性、系統(tǒng)集成測(cè)試和性能監(jiān)控等。
功能拆分
功能拆分一般遵從以下原則:
- 單一職責(zé)、高內(nèi)聚低耦合
- 服務(wù)粒度適中
- 以業(yè)務(wù)模型切入
- 演進(jìn)式拆分
- 避免環(huán)形依賴與雙向依賴
微服務(wù)各階段實(shí)現(xiàn)功能
- 開發(fā)階段:根據(jù)微服務(wù)架構(gòu)設(shè)計(jì)模式進(jìn)行功能拆分,將功能拆分成多個(gè)微服務(wù),并且統(tǒng)一規(guī)范設(shè)計(jì)每個(gè)微服務(wù)的API接口,每個(gè)API接口符合RESTful設(shè)計(jì)規(guī)范。如果服務(wù)之間不同服務(wù)器,就需要考慮跨域訪問。
- 測(cè)試階段:用于驗(yàn)證各個(gè)服務(wù)之間的API接口否輸入輸出是否符合開發(fā)需求,還需要驗(yàn)證各個(gè)API接口之間的調(diào)用邏輯是否合理。
- 部署階段:根據(jù)部署方案執(zhí)行,部署方案需要考慮服務(wù)的重試機(jī)制、緩存機(jī)制、負(fù)載均衡和集群等部署方式。
- 運(yùn)維監(jiān)控階段:需要對(duì)網(wǎng)站系統(tǒng)實(shí)時(shí)監(jiān)控,監(jiān)控內(nèi)容包括:日志收集、事故預(yù)警、故障定位和性能跟蹤等,并且還需要根據(jù)監(jiān)測(cè)結(jié)構(gòu)適當(dāng)調(diào)整部署方式。
部署啟動(dòng)
目前部署Django項(xiàng)目有兩種主流方案:Nginx+uWSGI+Django或者Apache+uWSGI+Django。
- Nginx或Apache作為服務(wù)器最前端,負(fù)責(zé)接收瀏覽器所有HTTP請(qǐng)求并統(tǒng)一管理。
- 靜態(tài)資源的HTTP請(qǐng)求由Nginx或Apache自己處理
- 非靜態(tài)資源的HTTP請(qǐng)求則由Nginx或Apache傳遞給uWSGI服務(wù)器,然后傳遞給Django應(yīng)用,最后由Django進(jìn)行處理并做出響應(yīng),從而完成一次Web請(qǐng)求。
# 啟動(dòng)nginx
systemctl start nginx # 重新讀取nginx配置文件
cd /etc/nginx/
sudo nginx -c nginx.conf
sudo nginx -s reload # 通過配置文件啟動(dòng)uWSGI服務(wù)器
uwsgi --ini nusic_uwsgi.ini
總結(jié)
以上是生活随笔為你收集整理的Django Web应用开发实战第十六章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 头抖到底是怎么回事?
- 下一篇: jenkins的搭建及问题处理