一、概述
WebSocket 應(yīng)用場(chǎng)景非常廣泛,例如社交聊天策幼、彈幕邑时、多玩家游戲、協(xié)同編輯特姐、股票基金實(shí)時(shí)報(bào)價(jià)晶丘、體育實(shí)況更新、視頻會(huì)議/聊天唐含、實(shí)時(shí)定位铣口、在線教育、智能家居等觉壶,這些場(chǎng)景都與我們的生活息息相關(guān)脑题。
ANY-IM 2.0 是基于 Spring Boot 2.X 框架開(kāi)發(fā)的 WEB 在線即時(shí)通信應(yīng)用,混合使用了 Spring MVC 及 Spring WebFLux铜靶,支持點(diǎn)對(duì)點(diǎn)通信叔遂、群通信、系統(tǒng)群發(fā)消息等多種方式争剿。由于單體應(yīng)用的局限性已艰,又在單體應(yīng)用的基礎(chǔ)上設(shè)計(jì)了集群方案,解決資源合理利用的問(wèn)題蚕苇。
演示地址:https://anoyi.com/
二哩掺、系統(tǒng)架構(gòu)
高清圖地址:http://on-img.com/chart_image/5a0e8e5de4b0143a78b3d509.png
架構(gòu)簡(jiǎn)單說(shuō)明:
- KeepAlived:配合VIP,實(shí)現(xiàn)高可用
- 通信服務(wù):基于 Spring Boot 及 Spring Framework 開(kāi)發(fā)的 WebSocket 后端服務(wù)
- 用戶服務(wù):基于 Spring Boot 及 Spring Security 開(kāi)發(fā)的用戶服務(wù)
- MongoDB:用于存儲(chǔ) Http Session 信息涩笤,實(shí)現(xiàn) Http Session 共享嚼吞,還用于存儲(chǔ)用戶消息
- Nats:優(yōu)雅的發(fā)布訂閱模型,用于服務(wù)間通信蹬碧,負(fù)責(zé)消息轉(zhuǎn)發(fā)
- 日志系統(tǒng):ELK搭建舱禽,可視化所有組件日志內(nèi)容
- 監(jiān)控系統(tǒng):容器級(jí)別的可視化監(jiān)控及報(bào)警
三、基于 Spring Boot 的 WebSocket 應(yīng)用實(shí)現(xiàn)
作為一名 Java 工程師恩沽,使用 Spring Boot 來(lái)構(gòu)建單體應(yīng)用無(wú)疑是最好的選擇誊稚,簡(jiǎn)潔、高效罗心、穩(wěn)定里伯!
1、工欲善其事必先利其器
- IntelliJ IDEA:https://www.jetbrains.com/idea/download/#section=mac
- Docker:http://get.daocloud.io/
- Docker 鏡像倉(cāng)庫(kù):https://dev.aliyun.com/search.html
2渤闷、創(chuàng)建 Spring Boot 應(yīng)用
快速創(chuàng)建疾瓮,參考官方文檔 https://projects.spring.io/spring-boot/ ,為了加快開(kāi)發(fā)速度肤晓,使用到 Lombok
爷贫、Jsoup
、Fastjson
等第三方依賴补憾,開(kāi)發(fā)時(shí)使用熱部署漫萄,避免頻繁地重啟應(yīng)用。
3盈匾、集成 WebSocket
<!-- 通信 websocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
前端需要使用 sockjs.js
腾务、stomp.js
來(lái)連接 WebSocket, 推薦使用 Vue.js 來(lái)渲染前端頁(yè)面削饵。
入門(mén) DEMO:https://spring.io/guides/gs/messaging-stomp-websocket/
STOMP協(xié)議詳解:https://www.cnblogs.com/my_life/articles/7002138.html
4岩瘦、集成 Spring Security 、Spring Session 及 MongoDB
需求 | 參考資料 | 官方文檔 |
---|---|---|
Spring Security | Spring Security Demo | Spring Security |
Spring Session | Spring Session Data MongoDB | Spring Session |
MognoDB | Spring Boot 集成 MongoDB | docker 安裝方式 |
MongoDB Web可視化工具:Mongo Express
四窿撬、基于 Redis 的跨容器 WebSocket Session 共享
如圖所示启昧,小明和服務(wù)A建立了長(zhǎng)連接,小紅和服務(wù)B建立了長(zhǎng)連接劈伴。此時(shí)密末,小明想給小紅發(fā)消息,但是服務(wù)A和服務(wù)B之間互不關(guān)聯(lián)跛璧,所以小明發(fā)給小紅的消息會(huì)丟失严里。要想小明能聯(lián)系到小紅,就要實(shí)現(xiàn)服務(wù)A和服務(wù)B之間的通信追城。
- 〇 客戶端和服務(wù)器端建立連接時(shí)需要將自己的身份ID和服務(wù)器ID寫(xiě)到數(shù)據(jù)庫(kù)刹碾,斷開(kāi)連接時(shí)刪除記錄
- 〇 每個(gè)服務(wù)上線時(shí),根據(jù)服務(wù)唯一ID在Redis上訂閱對(duì)應(yīng)的Topic
- ① 小明發(fā)送給小紅的消息先被傳輸?shù)椒?wù)A
- ② 服務(wù)A收到消息從數(shù)據(jù)庫(kù)中查到小紅所連接的服務(wù)器是服務(wù)B
- ③ 服務(wù)A將小明的消息轉(zhuǎn)發(fā)到Redis中服務(wù)B的Topic
- ④ 服務(wù)B收到Redis發(fā)來(lái)的消息
- ⑤ 服務(wù)B將消息發(fā)送給小紅
至此座柱,小明就能到把消息發(fā)送給小紅了迷帜。
五、基于 Docker Swarm 的集群解決方案
Docker Swarm 是 Docker 官網(wǎng)維護(hù)的集群管理工具色洞,應(yīng)用 Docker Swarm 可以很便捷地解決跨主機(jī)網(wǎng)絡(luò)瞬矩、動(dòng)態(tài)擴(kuò)容等問(wèn)題。
入門(mén)文章可以參考:http://www.reibang.com/p/096244610e15
如圖所示锋玲,實(shí)現(xiàn)任意容器之間的網(wǎng)絡(luò)互通景用,只需要兩步即可。
1惭蹂、在Docker Swarm 集群的 Manager 上創(chuàng)建網(wǎng)絡(luò)
docker network create -d overlay --attachable [networkName]
2伞插、啟動(dòng)容器時(shí),帶上網(wǎng)絡(luò)參數(shù)
- 啟動(dòng)單個(gè)容器:
docker run --net [networkName] IMAGE
- 啟動(dòng)服務(wù):
docker service create --network [networkName] IMAGE
動(dòng)態(tài)擴(kuò)容盾碗,也比較簡(jiǎn)單媚污。
1、將 Spring Boot 應(yīng)用構(gòu)建成鏡像
參考文章:http://www.reibang.com/p/b06de710c109
2廷雅、在 Swarm 集群中啟動(dòng)
docker service create --name anyim --network [networkName] IMAGE
3耗美、動(dòng)態(tài)擴(kuò)容
docker service scale anyim=[擴(kuò)容數(shù)量]
六京髓、基于 Registrator 和 Consul 的服務(wù)注冊(cè)與發(fā)現(xiàn)
Registrator:https://gliderlabs.com/registrator/latest/
Consul:https://www.consul.io/
1、啟動(dòng)服務(wù)注冊(cè)中心 Consul
docker run -d --name=consul -p 8500:8500 --net [networkName] consul
啟動(dòng)完畢后商架,可以訪問(wèn) http://localhost:8500/ 查看服務(wù)信息
2堰怨、啟動(dòng) Registrator 監(jiān)聽(tīng) Docker 容器
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--net [networkName] \
--link consul:consul \
registrator \
-cleanup=true \
-internal \
-resync=60 \
consul://consul:8500
額外說(shuō)明: 需要在每臺(tái)主機(jī)上部署
3、使用 Consul Template 刷新 HAProxy 配置
此處蛇摸,已封裝好鏡像备图,直接啟動(dòng)即可:
docker run -d \
--name consul-template-haproxy \
-p 8080:8080 \
--link consul:consul \
--net [networkName] \
registry.cn-hangzhou.aliyuncs.com/anoy/consul-template-haproxy
獲取鏡像:
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/consul-template-haproxy
七、基于 HAProxy 和 KeepAlived 的負(fù)載均衡與高可用
詳見(jiàn)文章:http://www.reibang.com/p/83036a320036
八赶袄、AB 測(cè)試
詳見(jiàn)文章:http://www.reibang.com/p/43d04d8baaf7
九揽涮、常見(jiàn)問(wèn)題總結(jié)
1、 WebSocket 協(xié)議詳解
https://tools.ietf.org/html/rfc6455#section-1.9
2饿肺、STOMP 協(xié)議詳解
https://stomp.github.io/stomp-specification-1.2.html
3蒋困、NATS 官方文檔
https://nats.io/documentation/
如有疑問(wèn),可以“評(píng)論”或者通過(guò)“簡(jiǎn)信”聯(lián)系作者
版權(quán)聲明:未經(jīng)許可敬辣,不得轉(zhuǎn)載