摘要:代理最近在做長連接消息通道的方案與實(shí)現(xiàn),目前的方案主要有。后端的是一個(gè)服務(wù)的集群,上圖有個(gè)組成的連接管理服務(wù)。總體來看,數(shù)據(jù)經(jīng)過兩次代理,內(nèi)部代理很簡單,配置簡單,只要配置和就可以。經(jīng)測(cè)試,可以測(cè)試通過。這樣就可以成功代理集群了。
envoy 代理 socket.io
最近在做web 長連接消息通道的方案與實(shí)現(xiàn), 目前web 的方案主要有websocket。 后來經(jīng)過調(diào)研發(fā)現(xiàn)socket.io 的瀏覽器兼容性更好。于是1. socket.io
使用socket.io 作用通信連接。本文記錄在此過程中遇到的問題。
主要的問題:
envoy 代理socket.io .
socket.io 集成了websocket 和polling,并可以感知瀏覽器的是否支持websocket, 建立websocket 連接,如果不支持websocket
就使用ajax polling. 故兼容性比較好, 具體可以google socket.io.
這和我們是實(shí)現(xiàn)方案有關(guān), 下面是我們的服務(wù)簡單的部署拓?fù)洹?/p>
這個(gè)方案是基于mesh service 的sidecar 方式部署, 前面有一個(gè)front-Envoy 作為一個(gè)接入層。
front-evnoy 其實(shí)就是在docker里部署一個(gè)envoy。
后端的services 是一個(gè)服務(wù)的集群, 上圖有2個(gè)socket.io service 組成的連接管理服務(wù)。
總體來看,數(shù)據(jù)經(jīng)過兩次代理,sidecar 內(nèi)部代理很簡單,配置簡單,只要配置envoy websocket 和http 就可以。
要設(shè)置route_config 相應(yīng)virtual_hosts 設(shè)置use_websocket 為true 。
另外一個(gè)代里是本文記錄的重點(diǎn)。
就是front-evnoy 到后端的service 集群。 簡單分析可知,socket.io service 其實(shí)是一個(gè)有狀態(tài)的服務(wù), 它一個(gè)連接管理器。
假設(shè)client A 要使用socket.io 建立長連接, front-envoy 要正常工作必須保證, A 的后續(xù)的所用的包都發(fā)送到后端的同一個(gè)service.
這就是envoy 如何代理socket.io 的問題。
envoy 支持很多很多中負(fù)載均衡方式, 但是目前滿足我們需求的只有ring hash 這種負(fù)載均衡。
可以參考envoy 文檔
envoy ring hash
ring hash 可以配置一個(gè)http header的字段作用hash key.
經(jīng)考察,我使用了這個(gè)x-forwarded-for字段, x-forwarded-for 這字段一般填的是client 的ip.
部分配置如下:
lister 增加 user_remote_address:true
這樣,envoy 會(huì)加上remote_address
"listeners": [ { "address": "tcp://0.0.0.0:80", "filters": [ { "type": "read", "name": "http_connection_manager", "config": { "codec_type": "auto", "stat_prefix": "ingress_http", "use_remote_address": true, "idle_timeout_s" : 300, "rds" : { "cluster" : "rds_cluster", ... "route_config": { "virtual_hosts": [ { "name" : "backend", "domains" : ["*"], "routes" : [ { "prefix" : "/", "cluster": "websocket_cluster", "use_websocket": true, "hash_policy": { "header_name": "x-forwarded-for" } } ] } ] }, ... { "name":"websocket_cluster", "type":"static", "connect_timeout_ms":2500, "lb_type":"ring_hash", "ring_hash_lb_config": { "minimum_ring_size": 1024, "use_std_hash": false }, "hosts":[{"url":"tcp://10.10.62.120:3000"},{"url":"tcp://10.10.62.121:3000"}] }4. envoy 代理socket.io 出錯(cuò)
測(cè)試發(fā)現(xiàn),測(cè)試有40% 的連接是失敗的。 其中報(bào)錯(cuò):
/favicon.ico:1 Failed to load resource: the server responded with a status of 404 (Not Found) index.js:83 WebSocket connection to "ws://10.10.62.122/socket.io/? EIO=3&transport=websocket&sid=xiqvvCber8gofbxrAAAA" failed: Error during WebSocket handshake: Unexpected response code: 400 r.doOpen @ index.js:83
表面websocket 建立連接失敗,服務(wù)器返回400。
5. 一個(gè)解決辦法其實(shí)socket.io 后后臺(tái)通信,先會(huì)建一個(gè)http/tcp 發(fā)送 poling 請(qǐng)求。
接著,會(huì)建立一個(gè)新的連接(http/tcp), 通過http upgrade 成一個(gè)websocket.
這條新的upgrade 連接,可能會(huì)被envoy 代理到另一個(gè)service.
還帶了sid 字段。 service 就認(rèn)為這個(gè)不完整的請(qǐng)求,返回400.
socket.io 服務(wù)器有一個(gè)邏輯, 如果http 請(qǐng)求參數(shù)帶了sid, 但是有沒有建立相應(yīng)的session, 就會(huì)返回400
通過修改socket.io transports 優(yōu)先級(jí)可以解決這種情況。
socket.io transport 順序是polling, websocket.
修改客戶端和服務(wù)器都修改成為{transports:["websocket", "polling"]})。
client 修改
//var socket = io(); 修改 var socket = io({transports:["websocket", "polling"]});
server 也做對(duì)應(yīng)的修改。
經(jīng)測(cè)試,可以測(cè)試通過。
這樣envoy 就可以成功代理socket.io 集群了。
后面有時(shí)間寫一下, socket.io 和 后臺(tái)建立連接的情況。
。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/100652.html
摘要:抓包的情況補(bǔ)圖服務(wù)器的抓包情況情況情況其中返回失敗可以看到的值是有填的。 client 抓包的情況 (補(bǔ)圖) 服務(wù)器的抓包情況 service1 情況 showImg(https://segmentfault.com/img/bVbmEiR?w=1485&h=437); service 2 情況 showImg(https://segmentfault.com/img/bVbmEiZ?...
摘要:如何自建一個(gè)思路接入方案我們都知道訪問集群的服務(wù)需要接入。據(jù)我所知,接入的方案有種云廠商提供比如官方的實(shí)現(xiàn)第三方實(shí)現(xiàn)方案自建,比如使用這里重點(diǎn)記錄一下,如何自建一個(gè)的思路??刂浦行氖且粋€(gè)叫的程序,監(jiān)控對(duì)應(yīng)的,數(shù)據(jù)代理是有組成。 如何自建一個(gè)k8s ingress 思路 ingress 接入方案 我們都知道訪問k8s 集群的服務(wù)需要ingress 接入。 據(jù)我所知,ingress 接入的...
摘要:以下內(nèi)容根據(jù)魏巍分享整編,希望對(duì)大家了解有所幫助。數(shù)據(jù)平面由一組智能代理組成,代理部署為,其控制微服務(wù)之間所有的網(wǎng)絡(luò)通信。 7月7日,時(shí)速云企業(yè)級(jí)容器 PaaS 技術(shù)沙龍第 10 期在上海成功舉辦,時(shí)速云容器架構(gòu)負(fù)責(zé)人魏巍為大家詳細(xì)講解了 Service Mesh 中代表性的實(shí)踐方案、并以 Istio 為例詳細(xì)講解了 Service Mesh 中的技術(shù)關(guān)鍵點(diǎn),包括 Istio 控制平面...
摘要:以下內(nèi)容根據(jù)魏巍分享整編,希望對(duì)大家了解有所幫助。數(shù)據(jù)平面由一組智能代理組成,代理部署為,其控制微服務(wù)之間所有的網(wǎng)絡(luò)通信。 7月7日,時(shí)速云企業(yè)級(jí)容器 PaaS 技術(shù)沙龍第 10 期在上海成功舉辦,時(shí)速云容器架構(gòu)負(fù)責(zé)人魏巍為大家詳細(xì)講解了 Service Mesh 中代表性的實(shí)踐方案、并以 Istio 為例詳細(xì)講解了 Service Mesh 中的技術(shù)關(guān)鍵點(diǎn),包括 Istio 控制平面...
閱讀 1261·2021-11-23 10:04
閱讀 2498·2021-11-22 15:29
閱讀 3565·2021-11-19 09:40
閱讀 873·2021-09-22 15:26
閱讀 2221·2019-08-29 16:27
閱讀 2586·2019-08-29 16:10
閱讀 1997·2019-08-29 15:43
閱讀 3405·2019-08-29 12:43