WebSocket系列12---Spring Cloud Gateway的多WebSocket請求轉發實現

Linkishttps://github.com/WeBankFinTech/Linkis/wiki

一、功能點

  • 前端Client與後臺多WebSocket微服務1多N支持

  • WebSocket通道全生命週期管理

二、Zuul的缺陷

     完全不支持轉發WebSocket請求。

三、Spring Cloud Gateway的侷限

     一個WebSocket客戶端只能將請求轉發給一個特定的後臺服務,無法完成一個WebSocket客戶端通過網關API對接後臺多個WebSocket微服務。

Spring Cloud Gateway的侷限

四、Linkis的解決方案

     Linkis在Spring Cloud Gateway中,實現了WebSocket路由轉發器,用於與客戶端建立WebSocket連接,建立連接成功後,會自動分析客戶端的WebSocket請求,通過規則判斷出請求該轉發給哪個後端微服務,從而將WebSocket請求轉發給對應的後端微服務實例。

Linkis的Gateway方案

     WebSocket路由轉發器,向上對接客戶端的WebSocket請求,向下對接後端的多個WebSocket微服務實例,爲了實現基於規則轉發客戶端的WebSocket請求給對應的後端微服務實例,WebSocket路由轉發器的架構圖如下:

WebSocket路由轉發器架構圖

4.1 WebSocket接收器

  1. WebSocket接收器是Spring Cloud Gateway的一個全局過濾器,用於接收客戶端的WebSocket連接請求,創建客戶端與Spring Cloud Gateway的1對1WebSocket通信通道。

  2. 同時,會監聽該WebSocket通道,將客戶端發送過來的請求,獲取必要的基本信息(如請求address、uri和user等),進行簡單的封裝,傳遞給規則器進行處理。

4.2 規則器

  1. 規則器接收到WebSocket接收器的通知,開始使用規則進行處理。

  2. URL規則器。

         Linkis規定客戶端請求的文本幀(TextWebSocketFrame)的格式爲JSON格式的字符串,例如下:

"{'method': '/api/v1/${service}/${uriPath}', 'data': ''}"

         其中:

         method爲實際的請求URI,前面/api固定爲API請求,v1指API的版本,service爲請求的服務名稱,uriPath爲服務的實際請求URI;

         data爲實際的請求數據。

         通過解析method,獲取到service信息,傳給第4步。

  1. 如果客戶端請求的文本幀(TextWebSocketFrame)不符合URL規則器的標準格式,或URL規則器不能解析出service信息,這時會加載用戶自定義規則器進行解析service,如果所有的自定義規則器都不能解析出service信息,則直接拋出一個解析錯誤給到客戶端;否則直接將service信息傳遞給下一步

  2. 通過步驟2或步驟3,獲取到service信息,此時規則器會從服務發現服務(如Eureka)中,拿到所有健康狀態爲正常的微服務列表,找到所有的該微服務service實例,通過負載均衡的方式,選擇其中一個負載最小的實例,將該微服務service實例傳遞給WebSocket轉發器。

4.3 WebSocket轉發器

     WebSocket轉發器分爲WebSocket管理器和WebSocket請求轉發器。

  1. WebSocket管理器

         WebSocket管理器負責管理客戶端與WebSocket接收器的1對1WebSocket連接通道,和WebSocket轉發器與後端微服務實例的1對多WebSocket連接通道。

         如果客戶端與WebSocket接收器的WebSocket連接斷開,則WebSocket管理器會馬上斷開所有相關的WebSocket轉發器與後端微服務實例的1對多WebSocket連接通道;

         同時,爲了保持所有WebSocket轉發器與後端微服務實例的1對多WebSocket連接通道不會因爲空閒而被釋放, WebSocket管理器會定時發送心跳請求(PingWebSocketFrame)給對應的後端微服務實例。

  1. WebSocket請求轉發器

         WebSocket請求轉發器從規則器獲取微服務service實例信息

         這裏需注意service和service實例的區別:一個微服務會有多個實例,每個實例的功能完全相同,一個微服務之所以需要多個實例,是爲了保證微服務的高可用和高可靠

         先從WebSocket管理器中爲該客戶端和該微服務service尋找是否已經存在WebSocket轉發器到該微服務service的WebSocket連接通道,如果存在,則直接使用該webSocket連接通道轉發客戶端請求的文本幀(TextWebSocketFrame);

         否則爲該客戶端和該微服務service實例創建一個全新的webSocket連接,並將該新的WebSocket連接和客戶端與WebSocket接收器的1對1WebSocket連接通道進行綁定,保證後端微服務一旦通過該新的WebSocket連接實時推送信息,立馬將該信息通過客戶端與WebSocket接收器建立的連接通道,回推給客戶端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章