分布式部署问题,仅问作者代码

admin

手册中写刀,阿里云等这些,通过弹性公网IP 转发到ECS上的云服务器,是没有办法进行 公网分布式部署的,因为

当gateway启动时候,会执行
// 注册 gateway 的内部通讯地址,worker 去连这个地址,以便 gateway 与 worker 之间建立起 TCP 长连接

  public function onWorkerstart(){
  //每个进程执行一次
         $this->registerAddress();
 }

我看到,register收到的gateway的ip:port 主要是来自于 gateway自己定义的$address 地址。

这个address地址被register保存后,boardcast广播给businessworker,然后businessworker去连接 $address地址,

 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();
        }

这个address地址用在onWorkerStart中开启内部监听business连接过来的服务,并且也是用这个地址监听,


        // 初始化 gateway 内部的监听,用于监听 worker 的连接已经连接上发来的数据
        $this->_innerTcpWorker = new Worker("GatewayProtocol://{$this->lanIp}:{$this->lanPort}");
        $this->_innerTcpWorker->reusePort = false;
        $this->_innerTcpWorker->listen();
        $this->_innerTcpWorker->name = 'GatewayInnerWorker';

所以 我觉得,能不能让onWorkerStart中 监听的lanip改为0.0.0.0固定,然后lanip变量参数仅仅用于告诉register 有关 本gateway的连接地址,这样不就可以让 阿里云。腾讯云也支持公网分部署了嘛

1803 2 0
2个回答

walkor 打赏

对,更简单的方法,判断lanip如果是公网ip,_innerTcpWorker 直接监听0.0.0.0,其它不变。这样腾讯云 阿里云应该就能公网分布式部署了。

  • admin 2021-12-22

    那为啥 您的源代码要这样写呢?为啥要故意 阉割(云服务器)公网分布式部署的能力呢

  • admin 2021-12-22

    是不是有什么其他考虑呢

  • walkor 2021-12-22

    这个框架几年前的,当时云厂商都是经典网络,没问题。后面云厂商改成专用网络了,这里就有问题了。你有兴趣可以提pr。

walkor 打赏

已经合并了 adminv 的pr。
需要公网分布式部署或者跨公网使用GatewayClient的同学请更新GatewayWorker 到 v3.0.22 或则后续更高版本

  • 暂无评论
年代过于久远,无法发表回答
×
🔝