精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個注解實現 WebSocket 集群方案,這樣玩才爽!

開發 前端
只不過使用自身的協議就可以不用依賴其他的庫或是中間件了,當然如果你對消息的丟失率有比較嚴格的要求也可以使用MQ?作為消息轉發的中介,而以我之前參與過的項目來說,一般普通的WebSocket場景基本上還是能忍受一定的丟失率的。

WebSocket大家應該是再熟悉不過了,如果是單體應用確實不會有什么問題,但是當我們的項目使用微服務架構時,就可能會存在問題

比如服務A有兩個實例A1和A2,前端的WebSocket客戶端C通過網關的負載均衡連到了A1,這個時候當A2觸發消息發送的邏輯,需要將某個消息發送給所有的客戶端時,C就接受不到消息

這個時候我們很快就能想到一種最簡單的解決方案,就是把A2的消息轉發給A1,A1再把消息發送給C,這樣C就能收到A2發送的消息了

圖片圖片

用法

接下來讓我們看看這個庫的用法

首先我們需要在啟動類上添加一個注解@EnableWebSocketLoadBalanceConcept

@EnableWebSocketLoadBalanceConcept
@EnableDiscoveryClient
@SpringBootApplication
public class AServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(AServiceApplication.class, args);
    }
}

接著我們在需要發送消息的地方注入WebSocketLoadBalanceConcept就可以愉快的跨實例發消息啦

@RestController
@RequestMapping("/ws")
public class WsController {

    @Autowired
    private WebSocketLoadBalanceConcept concept;

    @RequestMapping("/send")
    public void send(@RequestParam String msg) {
        concept.send(msg);
    }
}

是不是很簡單,有沒有覺得比自己集成單體應用的WebSocket還要簡單!

當你的同事還在頭疼要實現手動轉發時你已經通過一個配置注解實現了功能并開始泡茶喝

你的同事肯定對你刮目相看啊(又能開始摸魚了)

不知道大家看了之后是不是對具體實現已經有了一些思路呢

接下來我就來講講這個庫的實現流程

抽象思路

其實我之前有專門針對WebSocket實現過類似功能的模塊,只是當時的一些場景都是基于項目定死的,所以相對來說實現比較簡單,但是過于定制化不好擴展;

有一天在和我的一個前同事聊天的過程中得知,他們在考慮讓設備和服務直連,并且服務要部署成多實例

設備和服務直連無非就是通過TCP這種長連接來實現,可以使用緩存來保存連接和服務地址的映射關系來實現點對點轉發的功能需求

聽到這里,是不是感覺似曾相識?當時就有一道光穿過我的腦瓜子,真相只有一個!這不就和WebSocket在集群模式下的問題一樣么

于是我從原來針對WebSocket的思考,變成了對各種長連接的思考,最終我將這個問題抽象成了:長連接的集群方案

而不管是WebSocket還是TCP都是長連接的一種具體實現

所以我們可以抽象一個頂級接口Connection,然后實現WebSocketConnection或者是TCPConnection

其實從抽象的角度來說不僅僅是長連接,短連接也在我們的抽象范圍之內,只不過類似HTTP等協議并不存在上述的問題,但是并不妨礙你實現一個HTTPConnection用于轉發消息,所以大家不要被先入為主的思維束縛住了

轉發思路

之前講到,這個庫的主要思路就是將消息轉發給其他的服務實例來達到一個單播或廣播的效果

所以消息轉發的設計就非常重要了

首先消息轉發需要憑借一些支持數據交互的技術手段

比如HTTP,MQ,TCP,WebSocket

說到這里。。。大家是不是。。。你TM原來自己就能搞定啊(掀桌)

長連接不就是用來交互數據的嗎,所以完全可以自給自足啊

于是就有一個精妙的想法在我腦子里形成:

如果每個服務實例都把自己作為一個客戶端,連接到其他服務上呢?

WebSocket的場景下,我們將當前服務實例作為一個WebSocket客戶端去連接其他服務實例的WebSocket服務端

TCP的場景下,我們將當前服務實例作為一個TCP的客戶端去連接其他服務實例的TCP服務端

這樣其他服務實例就可以把消息發到這些偽裝的客戶端上,當服務實例上偽裝的客戶端接收到消息之后就可以再轉發給自己管理的真正的客戶端

撒花家人們,自閉(自我閉環)了屬于是

所以我們首先需要先讓服務實例之間相互連接上

連接流程

讓我們來看看互相建立連接是怎么設計的

圖片圖片

我定義了一個ConnectionSubscriber的接口,大家可以理解為我們的服務實例要去訂閱監聽其他服務發送的消息

同時提供了默認實現,就是基于自身的協議進行連接和消息的發送

當然也能夠靈活的支持其他方式,只需要自定義一個ConnectionSubscriber就可以了,如果使用MQ的方式就可以實現一個MQConnectionSubscriber或者使用HTTP就可以實現一個HTTPConnectionSubscriber

只不過使用自身的協議就可以不用依賴其他的庫或是中間件了,當然如果你對消息的丟失率有比較嚴格的要求也可以使用MQ作為消息轉發的中介,而以我之前參與過的項目來說,一般普通的WebSocket場景基本上還是能忍受一定的丟失率的

獲取服務實例信息

那么我們怎么知道要去連接哪些實例呢

我定義了一個ConnectionServerManager的接口用來管理服務信息

當然我們完全可以自己實現一個,比如通過配置文件來配置服務實例信息

不過我們有更方便的方式,那就是依賴Spring Cloud的服務發現組件了,不管是Eureka還是Nacos還是其他的注冊中心相當于都支持了,這就是抽象的魅力啊

我們可以通過DiscoveryClient##getInstances(Registration.getServiceId())來獲得所有的實例,排除掉自身就是需要連接的服務實例了

當我們的服務實例連接上其他的服務實例之后,發送一個自身實例信息的消息過去,其他的服務實例接收到對應的消息之后反過來連接我們的服務實例,保證一定的連接及時性,這樣雙方的連接就搭建起來了,可以互相轉發消息了

同時我還添加了心跳檢測和自動重連,當一段時間沒有收到心跳回復后就會斷開連接,并且每隔一段時間就會重新查詢一遍實例信息,如果發現存在某個服務實例沒有對應的連接,就會重新進行連接,這樣就能在某些偶爾網絡不好的情況下有一定的容錯

到目前為止,我們基本的框架已經建立了,當我們啟動服務之后,服務間就會自動建立連接

連接區分和管理

基于上述的思路,我們肯定需要區分真實的客戶端和用來轉發的客戶端

于是我就把這些連接做了一個分類

類別

說明

Client

普通的連接

Subscriber

服務實例偽裝的連接,用于接受需要轉發的消息

Observable

服務實例偽裝的連接,用于發送需要轉發的消息

然后對于這些連接進行一個統一的管理

圖片圖片

通過連接工廠ConnectionFactory我們可以將任意的連接適配成Connection對象,并實現各種連接間的消息轉發

每個連接都會配置一個MessageEncoder和MessageDecoder用于消息的編碼和解碼,而且不同類別的連接對應的編碼器和解碼器肯定是不一樣的,比如轉發的消息和發給真實客戶端的消息很大程度上都是有區別的,所以額外定義了一個MessageCodecAdapter用來適配不同類型的編解碼器,也能讓大家在自定義時方便管理

消息發送

現在當我們發送某條消息之后,消息就會被轉發到其他的服務實例,所有的客戶端就都能收到了

不對啊,在有些情況下我們不想讓所有客戶端都收到啊,能不能我們想讓誰收到就讓誰收到啊

真麻煩,來,我把所有的連接都給你,你自己選吧

連接選擇

我們需要在消息發送時確定發送給哪些連接

圖片圖片

于是我就定義了一個連接選擇器ConnectionSelector

每次要發送消息的時候,我都會匹配一個連接選擇器,然后通過選擇器來獲得需要發送消息的連接,而我們可以通過自定義連接選擇器來實現我們消息的精準發送

這里其實就是我為什么會取名WebSocketLoadBalanceConcept的原因,為什么要叫LoadBalance呢

Ribbon`通過`IRule`來選擇一個`Server

我通過ConnectionSelector來選擇一個Connection集合

是不是有異曲同工之妙

繼續來說自定義選擇器

準備工作:

  • 我們的Connection有一個metadata字段用于存放自定義屬性
  • 我們的Message有一個headers字段用于存放消息頭

給指定用戶發送消息

很多場景下我們需要給指定的用戶發送消息

首先當客戶端連接上來時,可以通過參數或者主動發送一個消息將userId發給服務端,然后服務端將得到的userId存在Connection的metadata中

接著我們給需要發送的Message添加一個header,將對應的userId作為消息頭

這樣我們就可以自定義一個連接選擇器通過判斷Message是否包含userId消息頭來作為匹配的條件,當Message的headers中存在userId時,對Connection中的metadata進行userId的匹配來篩選需要發送消息的連接

由于userId是唯一的,當我們自身服務連上來的客戶端中已經匹配到就不需要再轉發了,如果沒有匹配到就通過其他服務實例的客戶端進行消息轉發

庫中已經實現了對應的UserSelector和UserMessage,可以使用配置開啟并通過在連接路徑上添加userId參數來標記用戶

當然我們也可以借用緩存來精確的判斷需不需要轉發或者是需要轉發給哪幾個服務,把userId和服務的instanceId等一些具有唯一性的數據緩存在Redis中,當給用戶發送消息時,從Redis中獲得用戶對應的服務實例的instanceId或是具有唯一性的數據,如果經過匹配就是當前服務就可以直接下發,如果是其他服務就轉發給那個對應的服務就行了

給指定路徑發送消息

還有一種場景也比較常見就是類似主題訂閱,如訂閱設備狀態更新的數據,就要給每一個對應路徑的連接發送消息了

我們可以使用不同的路徑來表示不同主題,然后自定義一個連接選擇器來匹配連接的路徑和消息頭中指定的路徑

當然庫中也已經實現了對應的PathSelector和PathMessage,可以通過配置開啟

總結

最后請允許我發表一點對于抽象的拙見

抽象其實就和 “道生一,一生二,二生三,三生萬物” 一樣,根據你的頂級接口(也就是核心功能)不斷的向外展開,你的頂級接口就是道(狹義的來講)

以這個庫為例,ConnectionLoadBalanceConcept就是這個庫的道,他的核心功能就是發送消息,至于怎么發,發給誰,不確定,像是一個混沌的狀態

那么什么是一,二,三呢,我們發送消息需要載體于是就有了Connection和Message,我們需要對Connection進行管理于是就有了ConnectionRepository, 我們需要轉發消息于是就有了ConnectionSubscriber等等

而萬物就像是具體的實現,是能落實的,基于Spring Cloud服務發現的連接管理器DiscoveryConnectionServerManager,基于路徑的連接選擇器PathSelector,基于Reactive的WebSocket連接ReactiveWebSocketConnection

就像是你創造的世界,不斷的衍生出各種各樣的規則,這些規則相輔相成,讓你的世界平穩的運行

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2023-08-01 08:54:02

接口冪等網絡

2025-03-11 01:23:11

AIRetrofit框架

2022-08-21 14:00:11

消息中間件MQ

2022-06-10 13:03:44

接口重試while

2020-11-16 13:38:31

PostMessage

2024-11-07 10:55:26

2024-11-08 15:56:36

2022-06-21 14:44:38

接口數據脫敏

2021-09-05 07:55:37

前端Emoji 表情

2021-07-28 06:10:47

拖拽設計器 transmat

2025-02-23 08:00:00

冪等性Java開發

2022-05-26 10:42:30

數據權限注解

2017-07-27 16:18:18

開源項目使用

2024-08-02 08:38:20

Controller接口地址

2020-08-25 07:48:17

Kubernetes集群系統

2022-06-14 10:47:27

項目日志PUT

2025-09-22 04:00:00

2020-10-25 19:58:04

Pythonic代碼語言

2021-05-04 16:38:54

Linux數學游戲

2023-11-30 22:54:15

點贊
收藏

51CTO技術棧公眾號

欧美大尺度激情区在线播放| 亚洲一区二区三区四区在线免费观看 | 91久久人澡人人添人人爽欧美| 欧美日韩精品免费观看| 亚洲一卡二卡在线观看| 亚洲精品中文字幕乱码| 亚洲а∨天堂久久精品9966| 日日噜噜夜夜狠狠| 麻豆福利在线观看| 久久青草欧美一区二区三区| 国产欧美一区二区三区久久人妖| 久久精品国产亚洲AV无码麻豆 | 日韩黄色三级视频| 国产国产精品| 亚洲精品中文字幕女同| 伊人国产精品视频| 国产免费不卡| 亚洲午夜在线观看视频在线| 日韩av一区二区三区在线| 国产高清视频免费| 日本不卡一区二区| 91国在线精品国内播放| 懂色av粉嫩av蜜臀av一区二区三区| 国产精品xxx在线观看| 精品视频一区 二区 三区| 亚洲国产精品成人天堂| 日本中文字幕视频在线| 久久综合999| 国产精品theporn88| 中文字幕资源网| 免费在线欧美黄色| 欧美精品18videos性欧美| 欧美激情视频二区| 亚洲制服欧美另类| 亚洲成人av片| 女教师高潮黄又色视频| 午夜av成人| 欧美性猛交xxxx乱大交蜜桃| 黄色成人在线免费观看| 久久五月精品| 国产精品第四页| 亚洲v国产v| 国产在线视频网址| 久久女同精品一区二区| 精品综合久久| 天天干天天色天天| 成人精品一区二区三区中文字幕| 91在线观看免费观看| 91九色蝌蚪91por成人| 奇米亚洲午夜久久精品| 日本电影亚洲天堂| aaaaaa毛片| 日韩精品成人一区二区三区| 日av在线播放中文不卡| 6080午夜伦理| 丝袜亚洲精品中文字幕一区| 日韩av电影国产| 国产真人无遮挡作爱免费视频| 亚洲免费综合| 日韩av片电影专区| 无码人妻精品一区二| 快she精品国产999| 国产精品第二页| 亚洲天堂中文网| 精品一区二区三区欧美| 成人免费午夜电影| 国产欧美综合视频| 福利视频网站一区二区三区| 国产精品12| 男同在线观看| 久久精品亚洲精品国产欧美kt∨| 日本一区二区在线视频观看| 国产福利第一视频在线播放| 国产精品视频在线看| 五月天男人天堂| 色yeye免费人成网站在线观看| 夜夜操天天操亚洲| 国产视频九色蝌蚪| 成人做爰视频www| 欧美二区在线观看| 美女久久久久久久久| 亚欧日韩另类中文欧美| 在线日韩中文字幕| 青青青在线免费观看| 激情偷拍久久| 国产精品wwww| 国产黄色一区二区| www.一区二区| 亚洲精品一区二区三| 老司机精品视频在线观看6| 亚洲综合在线第一页| 久草资源站在线观看| 欧美xxxx网站| 亚洲第一精品夜夜躁人人爽| 国产女主播喷水高潮网红在线| 99久久婷婷| 91精品国产精品| 91国偷自产中文字幕久久| 成人丝袜视频网| 色综合影院在线观看| 欧美xxxx免费虐| 欧美亚洲一区二区在线观看| gogo亚洲国模私拍人体| 国产一区二区亚洲| 欧美黄色免费网站| 中文字幕在线日亚洲9| 成人美女视频在线观看18| 五月天丁香综合久久国产| 欧美videosex性欧美黑吊| 色88888久久久久久影院野外| www激情五月| 啪啪亚洲精品| 欧美精品video| 国产伦精品一区二区三区四区| 91小视频在线| 国产亚洲精品久久久久久久| 日本美女久久| 日韩av网址在线观看| 东方av正在进入| 日本视频一区二区三区| 精品视频高清无人区区二区三区| 麻豆网站在线| 欧美三级视频在线播放| 国产 中文 字幕 日韩 在线| 真实国产乱子伦精品一区二区三区| 日本一区二区在线播放| 涩涩视频免费看| 一区二区三区国产豹纹内裤在线 | 激情五月婷婷小说| 久久99国内精品| 日韩欧美在线观看强乱免费| 国产精品xx| 精品国产99国产精品| 免费精品在线视频| 美女视频一区二区三区| 日本一区二区三区免费看| 国产美女精品写真福利视频| 在线播放视频一区| 免费91在线观看| 香蕉成人久久| 国产精品自拍偷拍| 国产三区四区在线观看| 亚洲成人tv网| wwwxxxx在线观看| 日产午夜精品一线二线三线| 欧美极品在线播放| 亚洲第一天堂影院| 中文字幕日韩av资源站| 亚洲综合色在线观看| 亚洲肉体裸体xxxx137| 久久免费视频网| www日本高清| 亚洲三级在线免费| www.成年人| 欧美残忍xxxx极端| 国产精品视频精品| 精品欧美不卡一区二区在线观看| 五月综合激情网| 国产av一区二区三区传媒| 五月精品视频| 91久久精品国产91性色| 日本蜜桃在线观看| 日韩免费一区二区| 手机在线免费看毛片| 激情欧美一区二区| 91午夜在线观看| 北条麻妃一区二区三区在线| 九九精品在线播放| 成 人 黄 色 片 在线播放 | 免费看日韩毛片| 99久久精品国产网站| 欧美视频在线观看网站| 国产精品x8x8一区二区| 久久6精品影院| 特黄视频在线观看| 亚洲二区视频在线| 先锋资源av在线| 亚洲综合国产激情另类一区| 欧美尤物一区| 国产精品亚洲d| 欧美另类暴力丝袜| 天堂网在线中文| 色综合久久99| 人与动物性xxxx| 久久99蜜桃精品| 黄色成人在线看| 国产九一精品| 成人黄色av免费在线观看| caoporn免费在线| 精品国产免费一区二区三区香蕉| 国产午夜精品一区二区理论影院| 99re视频精品| 网站一区二区三区| 欧美freesextv| 99久久99久久精品国产片| h片在线观看视频免费| 亚洲欧美中文字幕| 蜜臀尤物一区二区三区直播| 亚洲免费在线电影| 91精品小视频| 久久精品国产亚洲a| 日本一二三区视频在线| 九热爱视频精品视频| 国产综合久久久久久| 日本三级在线观看网站| 亚洲九九九在线观看| 中文字字幕在线中文乱码| 一区二区在线观看视频| 国产精品无码午夜福利| 激情综合网最新| 日韩av片在线看| 亚洲最大av| 色视频一区二区三区| 国语精品视频| 国产成人精品免高潮在线观看| 成人福利在线观看视频| 亚洲奶大毛多的老太婆| 免费观看成年人视频| 欧美视频精品在线| 日干夜干天天干| 成人免费在线播放视频| 日本不卡视频一区| 激情综合亚洲精品| 国产成人无码一二三区视频| 亚洲人成免费网站| 日韩福利视频| 日本精品影院| 99re视频在线| 免费一级欧美在线观看视频| 欧美亚洲视频在线看网址| 中国av在线播放| 亚洲免费av网址| 内射后入在线观看一区| 在线综合+亚洲+欧美中文字幕| 秋霞精品一区二区三区| 午夜精品福利久久久| 国产这里有精品| 最新中文字幕一区二区三区| 白白色免费视频| 国产亚洲精久久久久久| 日本一区二区在线免费观看| 国产一区不卡在线| 久久国产这里只有精品| 久久国产免费| 国产自偷自偷免费一区 | 色噜噜狠狠狠综合曰曰曰88av| 天天干视频在线观看| 亚洲成人xxx| 蜜桃久久一区二区三区| 日韩视频永久免费| 国产a级免费视频| 欧美一区二区二区| 亚洲精品国产欧美在线观看| 欧美无砖专区一中文字| 国产精品乱码一区二区视频| 色综合久久久久久久久| 亚洲精品中文字幕乱码三区91| 日韩欧美精品网址| 男人日女人网站| 欧美日韩亚洲国产一区| 国产精品99精品| 色综合久久中文综合久久97| 你懂的国产在线| 在线视频亚洲一区| 无码人妻丰满熟妇奶水区码| 欧美日韩亚洲国产一区| 四虎精品永久在线| 日韩欧美aaa| 精品久久久久久久久久久国产字幕| 亚洲国产三级在线| 永久免费无码av网站在线观看| 色av综合在线| 影音先锋国产在线| 在线成人av网站| 国产成人自拍一区| 亚洲国产精品成人精品| 四虎精品成人影院观看地址| 亚洲日本成人女熟在线观看| 日韩子在线观看| 欧美成人午夜激情视频| 国产精品一区hongkong| 欧美日本黄视频| 日韩精品99| 国产在线播放不卡| 亚洲码欧美码一区二区三区| 99久久精品免费看国产四区 | 美女写真久久影院| 91精品久久久久久综合乱菊| 粉嫩av国产一区二区三区| 国产福利一区二区三区在线观看| 日韩三级视频| 亚洲国产日韩综合一区| 伊人久久大香线蕉综合热线| 精品中文字幕av| 久久成人免费网| 中文字幕人妻一区| 国产精品每日更新在线播放网址| 国产成人av免费在线观看| 亚洲图片欧美综合| 亚洲av无码精品一区二区| 欧美一区二区成人| 免费在线性爱视频| 九九视频这里只有精品| 国产传媒av在线| 99国产超薄丝袜足j在线观看| 中国av一区| 日韩精品福利片午夜免费观看| 影音先锋久久久| 国产一级做a爰片久久| 成人免费观看av| 91社区视频在线观看| 精品久久香蕉国产线看观看gif| 中文字幕在线观看高清| 精品成人私密视频| 日本黄色片在线观看| 欧美日韩成人在线观看| 欧美日韩免费电影| 快播亚洲色图| 亚洲视频福利| 制服.丝袜.亚洲.中文.综合懂| 久久久久久久久久久久久女国产乱| 五月天av网站| 欧美专区亚洲专区| 色av男人的天堂免费在线 | 日韩av影片| 国产精品偷伦视频免费观看国产 | 亚洲黄色免费av| 国产精品日韩一区二区免费视频| 日韩精品一区二区久久| 一本大道熟女人妻中文字幕在线| 国产成人av资源| 欧美极品视频在线观看| 精品视频1区2区3区| 欧美中文在线| 秋霞成人午夜鲁丝一区二区三区| 亚洲一区二区电影| 一区二区三区四区在线视频| 国产视频一区在线观看一区免费| 一级黄色电影片| 1024国产精品| 中文字幕一二区| 日韩精品免费在线视频| 精品众筹模特私拍视频| 亚洲xxx自由成熟| 一区二区三区网站| 99999精品| 亚洲色图一区二区三区| 亚洲天堂中文网| 亚洲欧美第一页| 亚洲wwww| 日本一区二区三区精品视频| 老司机精品久久| 亚洲女人毛茸茸高潮| 欧洲在线/亚洲| 成人动漫在线免费观看| 国产精品久久久久久影视| 国产欧美亚洲精品a| 亚洲熟妇av一区二区三区| 91网上在线视频| 99re热视频| 中文字幕日韩av综合精品| 一区在线影院| 国产盗摄视频在线观看| 激情综合色综合久久| www色aa色aawww| 精品女同一区二区| 电影在线观看一区| 精品国产_亚洲人成在线| 中文字幕亚洲精品乱码| 18深夜在线观看免费视频| 一区二区三区精品| 人成网站在线观看| 国产v综合ⅴ日韩v欧美大片| 免费黄色成人| 午夜宅男在线视频| 国产精品久久久久久久久免费樱桃 | 国产精品丝袜视频| 偷拍欧美精品| 亚洲v在线观看| 亚洲成人1区2区| 国产视频福利在线| 91啪国产在线| 亚洲国产日韩欧美一区二区三区| 亚洲综合色一区| 欧美精品在线一区二区| 2024最新电影免费在线观看| 欧美精品久久久| 麻豆91精品视频| 免费中文字幕视频| 亚洲天堂男人的天堂| 日韩av懂色| 精品一区二区三区无码视频| 久久五月婷婷丁香社区| 在线观看中文字幕码| 久久久久久久久久av| 不卡在线一区二区| 韩国三级在线看| 色女孩综合影院| 黄色av网站在线播放| 国产有色视频色综合|