目前websocket技術(shù)已經(jīng)很成熟,選型Go語(yǔ)言,當(dāng)然是敏冊(cè)悄為了節(jié)省成本以及它強(qiáng)大的高并發(fā)性能。我使用的是第三方開(kāi)源的websocket庫(kù)即gorilla/websocket。

成都創(chuàng)新互聯(lián)公司專(zhuān)注于硚口企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。硚口網(wǎng)站建設(shè)公司,為硚口等地區(qū)提供建站服務(wù)。全流程按需定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
由于我們線上推送的量不小,推送后端需要部署多節(jié)點(diǎn)保持高可用,所以需要自己做集群,具體架構(gòu)方案如圖:
Auth Service:鑒權(quán)服務(wù),根據(jù)Token驗(yàn)證用戶(hù)權(quán)限。
Collect Service:消息采集服務(wù),負(fù)責(zé)收集業(yè)務(wù)系統(tǒng)消息,存入MongoDB后,發(fā)送給消息分發(fā)服務(wù)。
Dispatch Service:消息分發(fā)服務(wù),根據(jù)路由規(guī)則分發(fā)至對(duì)應(yīng)消息推送服務(wù)節(jié)點(diǎn)上。
Push Service:消息推送服務(wù),通過(guò)websocket將消息推送給用戶(hù)。
集群推送的關(guān)鍵點(diǎn)在于,web端與服務(wù)端建立長(zhǎng)連接之后,具體跟哪個(gè)推送節(jié)點(diǎn)保持長(zhǎng)連接的,如果我們能夠找到對(duì)應(yīng)的連接節(jié)點(diǎn),那么我們就可以將消息推送出去。下面講解一下集群的大致流程:
1. web端用戶(hù)登錄之后,帶上token與后端推送服務(wù)(Push Service)保持長(zhǎng)連接。
2. 推送服務(wù)收到連接請(qǐng)求之后,攜帶token去鑒權(quán)服務(wù)(Auth Service)驗(yàn)證此token權(quán)限,并返回用戶(hù)ID。
3. 把返回的用戶(hù)ID與長(zhǎng)連接存入本地緩存,保持用戶(hù)ID與長(zhǎng)連接綁定關(guān)系。
4. 再將用戶(hù)ID與本推送節(jié)點(diǎn)橋渣IP存入redis,建立用戶(hù)(即長(zhǎng)連接)與節(jié)點(diǎn)綁定關(guān)系,并設(shè)置失效時(shí)間。
5. 采集服務(wù)(Collect Service)收集業(yè)務(wù)消息,首先存入mongodb,然后將消息透?jìng)鹘o分發(fā)服務(wù)(Dispatch Service)。
6. 分發(fā)服務(wù)收到消息之后,根據(jù)消息體中的用戶(hù)ID,從redis中獲取對(duì)應(yīng)的推送服務(wù)節(jié)點(diǎn)IP,然后轉(zhuǎn)發(fā)給對(duì)應(yīng)的姿碧推送節(jié)點(diǎn)。
7. 推送服務(wù)節(jié)點(diǎn)收到消息之后,根據(jù)用戶(hù)ID,從本地緩存中取出對(duì)應(yīng)的長(zhǎng)連接,將消息推送給客戶(hù)端。
其他注意事項(xiàng):
當(dāng)您對(duì)外部模塊的存儲(chǔ)庫(kù)進(jìn)行了 fork (例如修復(fù)模塊代碼中的問(wèn)題或添加功能)時(shí),您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對(duì)于測(cè)試您自己的代碼的更改很有用。
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲(chǔ)庫(kù)中 fork 的路徑。這指示 Go 工具在編譯時(shí)使用替換路徑(fork 的位置),例如,同時(shí)允許您保留import 原始模塊路徑中的語(yǔ)句不變。
在以下 go.mod 文件示例中,當(dāng)前模塊需要外部模塊example點(diǎn)抗 /theirmodule。然后該replace指令將原始模塊路徑替換為example點(diǎn)抗 /myfork/theirmodule模塊自己的存儲(chǔ)庫(kù)的分支。
設(shè)置require/replace對(duì)時(shí),使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當(dāng)前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當(dāng)您使用該replace指令時(shí),Go 工具不會(huì)像添加依賴(lài)項(xiàng)中所述對(duì)外部模塊進(jìn)行身份驗(yàn)證。
您可以使用go get命令從其存儲(chǔ)庫(kù)中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號(hào)@指定您想要的代碼 。當(dāng)您使用go get時(shí),該命令將向您的 go.mod 文件添加一個(gè) 需要外部模塊的require指令,使用基于有關(guān)提交的詳細(xì)信息的偽版蘆逗敗本號(hào)。
以下示例提供了一些說(shuō)明。這些基于源位于 git 存儲(chǔ)庫(kù)中的模塊。
當(dāng)您的代碼不再使用模塊中的任何包時(shí),您可以停止將該模塊作為依賴(lài)項(xiàng)進(jìn)行跟蹤。
要停止跟蹤所有未使用的模塊,請(qǐng)運(yùn)行g(shù)o mod tidy 命令。此命令還可能添加在模塊中構(gòu)建包所需的缺失依賴(lài)指梁項(xiàng)。
要?jiǎng)h除特定依賴(lài)項(xiàng),請(qǐng)使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級(jí)或刪除依賴(lài)于已刪除模塊的其他依賴(lài)項(xiàng)。
當(dāng)您使用 Go 工具處理模塊時(shí),這些工具默認(rèn)從 proxy.golang.org(一個(gè)公共的 Google 運(yùn)行的模塊鏡像)或直接從模塊的存儲(chǔ)庫(kù)下載模塊。您可以指定 Go 工具應(yīng)該使用另一個(gè)代理服務(wù)器來(lái)下載和驗(yàn)證模塊。
如果您(或您的團(tuán)隊(duì))已經(jīng)設(shè)置或選擇了您想要使用的不同模塊代理服務(wù)器,您可能想要這樣做。例如,有些人設(shè)置了模塊代理服務(wù)器,以便更好地控制依賴(lài)項(xiàng)的使用方式。
要為 Go 工具指定另一個(gè)模塊代理服務(wù)器,請(qǐng)將GOPROXY 環(huán)境變量設(shè)置為一個(gè)或多個(gè)服務(wù)器的 URL。Go 工具將按照您指定的順序嘗試每個(gè) URL。默認(rèn)情況下,GOPROXY首先指定一個(gè)公共的 Google 運(yùn)行模塊代理,然后從模塊的存儲(chǔ)庫(kù)直接下載(在其模塊路徑中指定):
您可以將變量設(shè)置為其他模塊代理服務(wù)器的 URL,用逗號(hào)或管道陪顫分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務(wù)器和模塊代理上開(kāi)發(fā)和分發(fā)。您可以設(shè)置 GOPRIVATE環(huán)境變量。您可以設(shè)置GOPRIVATE環(huán)境變量來(lái)配置go命令以從私有源下載和構(gòu)建模塊。然后 go 命令可以從私有源下載和構(gòu)建模塊。
GOPRIVATE或環(huán)境變量可以設(shè)置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應(yīng)從任何代理請(qǐng)求。例如:
當(dāng)前文章:go語(yǔ)言獲取ip go語(yǔ)言調(diào)用python
文章出自:http://chinadenli.net/article23/dspjcjs.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、外貿(mào)建站、商城網(wǎng)站、動(dòng)態(tài)網(wǎng)站、網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)