怎么用Workerman做多台服务器之间的内部RPC通信框架?

胖枫君_5965

胖枫君_5965

2026-05-20

853人浏览

原创

workerman-jsonrpc客户端通过rpcclient::config()传入含多个tcp://ip:端口的数组实现多服务器调用,服务端须监听0.0.0.0或具体内网ip,无内置服务发现与健康检查,需手动或借助consul等外部组件管理节点上下线。

怎么用workerman做多台服务器之间的内部rpc通信框架?

Workerman 本身不内置服务发现或跨机地址自动同步机制,多台服务器间做内部 RPC 通信,必须手动管理服务端地址列表或引入外部注册中心——这是最关键的判断,绕不开。

客户端如何指定多个远程服务器地址

Workerman-JsonRpc 的 RpcClient::config() 接收的是一个数组,不是单个地址。只要每台服务器都运行着同一个服务类(如 User),你就可以把它们的 IP + 端口全部写进去:

  • 地址格式必须是 tcp://192.168.1.10:2015 这样的完整协议+IP+端口,不能只写 IP 或只写端口
  • 数组里顺序不影响调用逻辑,但默认负载策略是轮询(按索引循环取),没有健康检查,挂掉的节点会直接导致请求失败
  • 如果某台机器防火墙没开 2015 端口、SELinux 拦截、或 iptables 限制了连接,RpcClient 会卡在 connect 阶段,超时时间由 PHP 的 default_socket_timeout 决定(通常 60 秒)

示例配置:

$address_array = [
    'tcp://10.0.1.5:2015',
    'tcp://10.0.1.6:2015',
    'tcp://10.0.1.7:2015'
];
RpcClient::config($address_array);

服务端监听地址不能写 127.0.0.1

常见错误是服务端启动时监听 tcp://127.0.0.1:2015,结果其他机器连不上。Workerman 默认只绑定本地回环,必须显式改成 0.0.0.0 或具体内网 IP:

Massive.com CLI
Massive.com CLI

一款AI数据处理工具,主要用于用于查询 Massive 市场数据端点的 Bash CLI 封装和 OpenClaw 技能,适用于 Codex 或 OpenClaw 代理从 shell 调用,适合需要提升相关任务效率的用户。

下载
  • 正确写法:$server->listen('tcp://0.0.0.0:2015') 或 $server->listen('tcp://10.0.1.5:2015')
  • 监听 0.0.0.0 时,确保服务器防火墙放行对应端口(例如 ufw allow 2015)
  • 不要在生产环境监听 0.0.0.0 并暴露到公网,RPC 接口无认证机制,等同于裸奔

没有服务发现时,客户端怎么感知节点上下线

Workerman-JsonRpc 客户端原生不支持心跳探测或自动剔除失效节点。一旦某台服务端宕机,下次轮到它时请求就会失败,且不会自动跳过:

  • 最简方案:自己封装一层地址池,每次调用前用 fsockopen() 尝试连接,超时则临时移出列表(注意并发下需加锁或用 apcu 缓存状态)
  • 更稳方案:接入 Consul 或 Nacos,客户端启动时拉取服务列表,并监听变更事件,动态更新 $address_array
  • 别依赖 filemtime() 或定时 reload 配置文件——RPC 调用是高频短连接,配置热更必须原子化,否则可能一半请求走旧地址、一半走新地址

跨服务器调用时的序列化和兼容性陷阱

Workerman-JsonRpc 默认用 json_encode/decode,看似简单,但容易踩坑:

  • PHP 7.4+ 的 json_encode 对 NaN、INF 会报错,而 Workerman 不捕获这类异常,直接导致整个 worker 进程 crash
  • 客户端和服务端 PHP 版本不一致时,DateTime 对象 JSON 化行为不同(有的转成字符串,有的丢字段),建议所有参数/返回值统一用数组,避免传对象实例
  • 大数组嵌套层级过深(>512 层)会触发 json_decode 递归限制,错误信息是 JSON_ERROR_DEPTH,但客户端只会收到空响应,需在服务端加 json_last_error() 检查

真正麻烦的从来不是“怎么连上”,而是“连上之后,谁来保证每次调用都走对的机器、拿回正确的数据、不因一个节点故障拖垮整条链路”。Workerman 给了高性能的底座,但分布式 RPC 的鲁棒性,得靠你自己补全那几块关键拼图。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9724

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5821

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2055

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3628

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4334

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3391

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4837

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3782

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11782

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习