gateway为什么它不会把业务请求发到局域网别人的bussinessworker上去呢?

david2015

我现在是用的是阿里云的云服务器,它给了我一个10.x.x.x的内网IP,我想使用的是一gateway多worker 分离部署(可能其它人也在阿里云使用workerman同一个局域网),那我如何才能使gateway把进来的业务需求分发到我的bussinessworker中去而不是别人的?都是同一个局域网,在gateway的那个机子上没有地方配置写的是我bussinessworker的ip。为什么它不会发到局域网别人的bussinessworker上去呢?

2917 13 0
13个回答

walkor

Gateway启动时会将Gateway的内部通讯端口写到 Config/Store.php配置的存储中,
BusinessWorker服务器也有一个Config/Store.php配置,并且与Gateway的相同,
BusinessWorker启动后会读取Config/Store.php配置的存储,得到Gateway的内部通讯地址
然后BusinessWorker主动连接到Gateway,Gateway与BusinessWorker之间的连接就建立起来了。

所以基于上面的原理,分布式部署时
1、要求Config/Store.php使用redis/memcache存储,并且Gateway BusinessWorker服务器都可以访问
2、Gateway BusinessWorker服务器的Config/Store.php配置要相同

同样,基于上面原理,有多个GatwayWorker项目同时运行时,
要求多个GatwayWorker项目的Config/Store.php配置要求不同,否则数据会串

  • 暂无评论
david2015

Gateway启动时会将Gateway的内部通讯端口写到 Config/Store.php配置的存储中,

举个例:如果gateway服务器所在ip为10.0.1.1,worker所在服务器所在ip为10.0.1.2/3,

Gateway启动时会将Gateway的内部通讯端口写到 10.0.1.1上的Config/Store.php配置的存储里还是10.0.1.1/2/3的Config/Store.php中?

  • 暂无评论
walkor

10.0.1.1上的Config/Store.php
10.0.1.1/2/3的Config/Store.php
两个配置的是同一个redis/memcache存储

  • 暂无评论
david2015

BusinessWorker启动后会读取Config/Store.php配置的存储,得到Gateway的内部通讯地址

这个是不是这样,10.0.1.2上的bussinessworker启动后读取store.php里的memcached地址是10.0.1.4,然后遍历整个局域网,发现其上的store.php里的memcached为10.0.1.4就认为是同一个组的?

如果有多个gateway,bussinessworker是怎样操作的?

  • 暂无评论
walkor

没有局域网遍历,直接连存储中保存的通讯地址

  • 暂无评论
david2015

store.php 中只有下面两个配置:

public static $driver = self::DRIVER_MC;

// 如果是memcache存储,则在这里设置memcache的ip端口,注意确保你安装了memcache扩展
public static $gateway = array(
    '127.0.0.1:11211',
);
  • 暂无评论
walkor

你的版本有点老了

  • 暂无评论
david2015

包含最新版workerman的Chat 聊天室的源码在哪下载?

  • 暂无评论
david2015

class Store
{
// 使用文件存储,注意使用文件存储无法支持workerman分布式部署
const DRIVER_FILE = 1;
// 使用memcache存储,支持workerman分布式部署
const DRIVER_MC = 2;
// 使用redis存储(推荐),支持workerman分布式部署
const DRIVER_REDIS = 3;

 // DRIVER_FILE 或者 DRIVER_MC 或者 DRIVER_REDIS(推荐)
public static $driver = self::DRIVER_FILE;

//$driver为DRIVER_MC/DRIVER_REDIS时需要配置memcached/redis服务端ip和端口
public static $gateway = array(
    '127.0.0.1:6379',
);

// $driver为DRIVER_FILE时要配置此项,实际配置在最下面一行
public static $storePath = '';

}

// 默认系统临时目录下
Store::$storePath = sys_get_temp_dir().'/workerman-chat/';


如果没有局域网遍历,那bussinessworker如何知道向哪台机子去取存储中保存的通讯地址呢?

  • 暂无评论
walkor

向这个机子取
public static $gateway = array(
'127.0.0.1:6379',
);

  • 暂无评论
david2015

//$driver为DRIVER_MC/DRIVER_REDIS时需要配置memcached/redis服务端ip和端口
public static $gateway = array(
'127.0.0.1:6379',
);


这个不是写的是memcached/redis服务端ip和端口吗(上面注释是这样写的)

  • 暂无评论
walkor

businessworekr 从memcached/redis服务端ip和端口的存储里读取数据 取得 gateway的通讯地址
然后去连这个地址,就连到gateway了

自己跟踪打印下存储里面存储的值吧

  • 暂无评论
david2015

好的,谢谢

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