目前服務器只開放了一個端口供互聯(lián)網(wǎng)訪問,現(xiàn)在workerman的一個tcp服務已經(jīng)監(jiān)聽了此端口,如果再使用worker作mysql代理,或者其他方式怎么能實現(xiàn)?
通過nginx tcp代理是否可行
可以用workerman做一個分發(fā)代理,監(jiān)聽一個端口,然后onMessage里根據(jù)數(shù)據(jù)格式判斷是哪種數(shù)據(jù),然后轉(zhuǎn)發(fā)到對應的實際端口中。
例如只有一個端口,這個端口既需要轉(zhuǎn)發(fā)tcp數(shù)據(jù),也需要轉(zhuǎn)發(fā)mysql數(shù)據(jù)(作為mysql代理),假設tcp服務端口是8181,mysql端口是3306,workerman作為代理轉(zhuǎn)發(fā)這兩種數(shù)據(jù)給8181和3306端口代碼邏輯類似下面這樣
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, $buffer)
{
// 如果是mysql數(shù)據(jù),轉(zhuǎn)發(fā)到本機3306端口 (作為示例is_mysql并未實現(xiàn))
if (is_mysql($buffer)) {
$connection_to_3306 = new AsyncTcpConnection('tcp://127.0.0.1:3306');
$connection_to_3306->send($buffer);
$connection->pipe($connection_to_3306);
$connection_to_3306->pipe($connection);
$connection_to_3306->connect();
return;
}
// 否則轉(zhuǎn)發(fā)到8181端口
$connection_to_8181 = new AsyncTcpConnection('tcp://127.0.0.1:8181');
$connection_to_8181->send($buffer);
$connection->pipe($connection_to_8181);
$connection_to_8181->pipe($connection);
$connection_to_8181->connect();
};
// 運行worker
Worker::runAll();
@walkor 大佬,使用你上面的例子,是不是需要通過客戶端先連接tcp8080,然后客戶端發(fā)送連接msg,服務端接收到msg后,再通過數(shù)據(jù)區(qū)分客戶端需要連接哪一個服務?
對,上面代理機制需要客戶端連8080,然后客戶端發(fā)送一個數(shù)據(jù)包,代理判斷數(shù)據(jù)包屬于mysql的數(shù)據(jù)還是你的tcp數(shù)據(jù)。只需要判斷一個數(shù)據(jù)包即可,后續(xù)數(shù)據(jù)就自動pipe方法就自動代理轉(zhuǎn)發(fā)了。
但是想起來一個問題,mysql客戶端連接到mysql服務端后不會主動發(fā)數(shù)據(jù),要等mysql服務端發(fā)送數(shù)據(jù)后客戶端才會發(fā)送。所以上面方案應該不行。你的需求應該實現(xiàn)不了。