### 集群架构：与网络服务共存

前文已经说明，dispatch server必须以单进程方式运行，才能正常转发消息，这样就导致我们必须单独启动一个beyod serverr实例, 会给部署和运维带来一些麻烦，如果集群规模较小，完全可以让beyod server中同时提供网络服务和dispatcher server, 只需要做简单的操作即可：

#### 1. 配置网络服务和dispatcher server：

config/main.php

    'components' => [
            'server' => [
                'class' => 'app\MyServer', //使用自定义的类
                'worker_num' => 17, //1个进程提供dispatcher server, 其16个进程提供网络服务
                //配置网络服务
                'listeners' => [
                    'http' => [
                        'class' => 'beyod\Listener',
                        'listen' => 'tcp://0.0.0.0:9723',//监听的协议和端口
                        'handler' => [//网络事件回调处理器
                            'class' => 'beyod\protocol\http\Handler',
                            'document_root' => __DIR__.'/../webroot',
                        ],
                        'parser'  => [
                            'class'=>'beyod\protocol\http\Parser',
                        ],
                    ],

                    //订阅服务器
                    'dispatch' => [
                        'class' => 'beyod\Listenner',
                        'listen' => 'tcp://0.0.0.0:7724',
                        'parser' => 'beyod\dispatcher\Parser',
                        'handler' => 'beyod\dispatcher\Handler'
                    ],
                ],
            ],

            //...
    ]

#### 2. 设置进程的功能角色

appMyServer.php

    <?php

    namespace app;

    use Yii;
    use beyod\Server;
    use beyod\MessageEvent;
    use beyod\IOEvent;

    class MyServer extends \beyod\Server
    {
        public function onWorkerStart($workerId, $GPID)
        {
            parent::onWorkerStart($workerId, $GPID);

            //在第一个进程上，停止所有网络服务，只启动dispater server。
            if($workerId ==1) {
                foreach($this->listenners as $name => $listenner) {
                    if($name == 'dispatch') continue;
                    $listenner->stopAccept();
                }
            }
        }
    }

如此，我们就可以很容易通过进程id设置其功能，对简化部署和运维，会有不少的帮助。