輕量級(jí)微服務(wù)架構(gòu)實(shí)踐之 ANOYI-IM

一、概述

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、工欲善其事必先利其器

2渤闷、創(chuàng)建 Spring Boot 應(yīng)用

快速創(chuàng)建疾瓮,參考官方文檔 https://projects.spring.io/spring-boot/ ,為了加快開(kāi)發(fā)速度肤晓,使用到 Lombok爷贫、JsoupFastjson 等第三方依賴补憾,開(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ù)節(jié)點(diǎn)建立長(zhǎng)連接

如圖所示启昧,小明和服務(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ù) WebSocket 通信實(shí)現(xiàn)
  • 〇 客戶端和服務(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)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末家破,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子购岗,更是在濱河造成了極大的恐慌汰聋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喊积,死亡現(xiàn)場(chǎng)離奇詭異烹困,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乾吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)髓梅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绎签,你說(shuō)我怎么就攤上這事枯饿。” “怎么了诡必?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵奢方,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我爸舒,道長(zhǎng)蟋字,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任扭勉,我火速辦了婚禮鹊奖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涂炎。我一直安慰自己忠聚,他們只是感情好设哗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著两蟀,像睡著了一般网梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垫竞,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天澎粟,我揣著相機(jī)與錄音蛀序,去河邊找鬼欢瞪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徐裸,可吹牛的內(nèi)容都是我干的遣鼓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼重贺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骑祟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起气笙,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤次企,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后潜圃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缸棵,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谭期,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堵第。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隧出,死狀恐怖踏志,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胀瞪,我是刑警寧澤针余,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站凄诞,受9級(jí)特大地震影響涵紊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幔摸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一摸柄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧既忆,春花似錦驱负、人聲如沸嗦玖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宇挫。三九已至,卻和暖如春酪术,著一層夾襖步出監(jiān)牢的瞬間器瘪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工绘雁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橡疼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓庐舟,卻偏偏與公主長(zhǎng)得像欣除,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挪略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345