手册中写刀,阿里云等这些,通过弹性公网IP 转发到ECS上的云服务器,是没有办法进行 公网分布式部署的,因为
当gateway启动时候,会执行
// 注册 gateway 的内部通讯地址,worker 去连这个地址,以便 gateway 与 worker 之间建立起 TCP 长连接
public function onWorkerstart(){
//每个进程执行一次
$this->registerAddress();
}
public function registerAddress()
{
$address = $this->lanIp . ':' . $this->lanPort;
foreach ($this->registerAddress as $register_address) {
$register_connection = new AsyncTcpConnection("text://{$register_address}");
$secret_key = $this->secretKey;
$register_connection->onConnect = function($register_connection) use ($address, $secret_key, $register_address){
$register_connection->send('{"event":"gateway_connect", "address":"' . $address . '", "secret_key":"' . $secret_key . '"}');
// 如果Register服务器不在本地服务器,则需要保持心跳
if (strpos($register_address, '127.0.0.1') !== 0) {
$register_connection->ping_timer = Timer::add(self::PERSISTENCE_CONNECTION_PING_INTERVAL, function () use ($register_connection) {
$register_connection->send('{"event":"ping"}');
});
}
};
$register_connection->onClose = function ($register_connection) {
if(!empty($register_connection->ping_timer)) {
Timer::del($register_connection->ping_timer);
}
$register_connection->reconnect(1);
};
$register_connection->connect();
}
// 初始化 gateway 内部的监听,用于监听 worker 的连接已经连接上发来的数据
$this->_innerTcpWorker = new Worker("GatewayProtocol://{$this->lanIp}:{$this->lanPort}");
$this->_innerTcpWorker->reusePort = false;
$this->_innerTcpWorker->listen();
$this->_innerTcpWorker->name = 'GatewayInnerWorker';
对,更简单的方法,判断lanip如果是公网ip,
_innerTcpWorker
直接监听0.0.0.0,其它不变。这样腾讯云 阿里云应该就能公网分布式部署了。那为啥 您的源代码要这样写呢?为啥要故意 阉割(云服务器)公网分布式部署的能力呢
是不是有什么其他考虑呢
这个框架几年前的,当时云厂商都是经典网络,没问题。后面云厂商改成专用网络了,这里就有问题了。你有兴趣可以提pr。
已经合并了 adminv 的pr。
需要公网分布式部署或者跨公网使用GatewayClient的同学请更新GatewayWorker 到 v3.0.22 或则后续更高版本