單獨一個 docker 部署了 register
之后其余 三臺機器 部署了 業(yè)務代碼
每臺機器部署的 BusinessWorker 和 Gateway
這個時候 gateway 的 lanIp 為主機 網(wǎng)卡 IP的 時候 端口通信錯誤。
然后 lanIp 改成 127.0.0.1 就沒問題,不知道怎么回事
docker 端口 映射 從 3900 到 3910
gateway 的 startPort 為 3900
每個機器部署 一個 gateway
運行后報錯 3900 端口通信失敗
我想問的是 , 雖然是分布式部署,但是 每臺機器都部署 了 gateway,
是不是 gateway lanIp 寫成 127.0.0.1 也沒問題,
我使用 Gateway::getAllClientCount() 這樣的方法 取所有在線 數(shù)量是不是 也是準確的
事實證明不可以, 部署多臺 gateway getAllClientCount 取的是一臺 gateway 的在線人數(shù)。
通過翻閱源代碼 我們找到這樣一段備注
/**
* 如果宿主機為192.168.1.2 , gatewayworker in docker container (172.25.0.2)
* 此時 lanIp=192.68.1.2 GatewayClientSDK 能連上,但是$this->_innerTcpWorker stream_socket_server(): Unable to connect to tcp://192.168.1.2:2901 (Address not available) in
* 此時 lanIp=172.25.0.2 GatewayClientSDK stream_socket_server(): Unable to connect to tcp://172.25.0.2:2901 (Address not available) , $this->_innerTcpWorker 正常監(jiān)聽
*
* solution:
* $gateway->lanIp=192.168.1.2 ;
* $gateway->innerTcpWorkerListen=172.25.0.2; // || 0.0.0.0
*
* GatewayClientSDK connect 192.168.1.2:lanPort
* $this->_innerTcpWorker listen $gateway->innerTcpWorkerListen:lanPort
*
*/
所以我的配置檔代碼改成了這樣的
$gateway->lanIp = getenv("LOCATION_IP");
$gateway->innerTcpWorkerListen = "0.0.0.0";
最終解決了 docker 容器內(nèi)和work 通信的問題,
但是 就很疑惑 為何 分布式部署 lanIp 要寫本地IP,
docker 容器環(huán)境 寫成 127.0.0.1 然后端口映射也是可以運行的。
使用 innerTcpWorkerListen 參數(shù) 為 0.0.0.0 可以正確使用,并 使用各種網(wǎng)關(guān)函數(shù) 都正常!
Gateway::getAllClientCount() 可以取到所有網(wǎng)關(guān) 用戶數(shù)量
目測 docker 網(wǎng)卡是 container 模式
lanIp 為內(nèi)網(wǎng)IP 主要是為了解決 監(jiān)聽問題, 單機部署 設置為 127.0.0.1 沒問題,非容器 用內(nèi)網(wǎng)IP 也沒問題
在容器下就不行了,在容器呢 監(jiān)聽 192.168.2.1: 3900
在容器外 開放 3900 端口,通信是不行的,因為容器內(nèi)監(jiān)聽的是內(nèi)網(wǎng), 所以必須改成 0.0.0.0 才行。
但是 因為對底層了解的不夠透徹,網(wǎng)關(guān)和worker 通信 會用到 IP地址,所以不敢貿(mào)然改動