我有两台服务器A和B,都部署了webman,并且使用gateway worker提供ws服务,A和B都有gateway、register、gateway worker几种进程,register是相互注册的。现在我想在A中向B的ws用户组发送消息。
我在A的http接口中使用了gateway client包,register address 填写的是A的register地址:127.0.0.1:1236
,但是消息无法推送到B服务器的ws用户
我看了源码,按照我的理解,A的register 进程里面应该也是保存了B的gateway地址的,难道我gateway client的register address要写两个吗:A:1236,B:1236
,但是看源码这样写是没有意义的,该怎么做呢?
registerAddress为 ['192.168.0.1:1236','192.168.0.2:1236']
这样不行的,下面是他里面的方法,它只取了其中一个地址,我试过了:
foreach ($register_addresses as $register_address) {
set_error_handler(function(){});
$client = stream_socket_client('tcp://' . $register_address, $errno, $errmsg, static::$connectTimeout);
restore_error_handler();
if ($client) {
break;
}
}
if (!$client) {
throw new Exception('Can not connect to tcp://' . $register_address . ' ' . $errmsg);
}
AB 1236能互通不
可以的
registerAddress 可以修改,推送给A后修改为B的注册地址不可以?或者使用内部通讯端口也行
如果A和B是一个集群,getewayClient调用是写任何一个register地址即可。不是一个集群就要设置对应的registerAddress
讲道理可以互相通信,你看那张图,但是你注册中心不能写127.0.0.1,要写两台webman 其中一台的内网IP地址吧!
举个例子,nginx 192.168.1.5, webman1 192.168.1.6:8002, webman2 192.168.1.7:8003;
这时候GatewayClient::$registerAddress = ["192.168.1.7:9005"],当然GatewayWorker 网关服和逻辑服都要填写这个注册中心地址,不然无法通信。
这样两台服务器都填写这个IP就能相互通信,你127.0.0.1 肯定不行。
register 只有一个作用,登记逻辑服和网关服的ip:port,只要两台服务器的注册中心一个地址,肯定是共享的。
只是你写的127.0.0.1自然无法相互通信,相当于各是各的注册中心地址(也就是两个注册中心了)
问题解决了,大佬你说的是对的,要写成内网地址,然后gateway进程数都设置为1,就可以相互发送消息,并且不会发重。
然后gateway进程数不用特意设成1,它这个系统本来就是分布式的,可以多进程多服务器