一台笔记本上跑一百个服务,就是一百个端口。最容易毁掉一个上午的事,是两个服务抢同一个端口。tdk-erp-system 这个示例把端口按可预测的区块分配,一个域一个区块,默认端口被占用的情况交给 TDK CLI 处理。

每个域的服务从自己的号段里取端口。README 里列了这些号段,我核对过的几个都遵循清晰的规律:

  • 财务后端用4010 到 4024,它的看板用3010
  • 人力后端从4100起,它的门户用3020
  • 库存后端从4200起。
  • 销售后端从4300起。
  • 分析后端从4600起,它的控制台用3070

前端统一用 3000 号段,后端统一用 4000 号段。一个服务的端口写在它的 service.json 里,读这个文件就能看出它落在哪个位置。

区块化分配的好处很直接。服务出故障时,端口号就能告诉你它属于哪个域。新增服务时,该域区块里下一个空闲编号一目了然。一个端口混杂的看板,读起来比每个域各有号段的看板费劲得多。

默认端口被占用时,TDK 会检查它共享基础设施的默认端口,比如代理和 Postgres。如果某个端口已被占用,它就从备用号段里挑一个空闲端口,并把选择打印出来。举个例子,一次测试运行中 Postgres 的默认端口被占用,TDK 从15432 到 15532的备用号段里选了15432。

打印出来的选择值得留意。每次启动都要读它,因为一个期待默认端口的服务,可能需要改用这个新值。

要固定端口,在启动前设置对应的环境变量:

TDK_POSTGRES_PORT=5432 tdk up

其他覆盖项遵循同样的模式,包括代理用的 TDK_HTTP_PORT 和 TDK_HTTPS_PORT。当 TDK 之外的工具需要一个固定地址时,就设置它们。

检查端口也不麻烦。README 在每个服务的端口上链接了它的健康检查路由,用浏览器或 curl 就能查。想要机器可读的答案,用:

tdk status --json

它会报告就绪状态和 URL,这样你就不用记哪个端口属于哪个服务。

回到开头那个问题:端口按域分组,数字本身就说明了服务归属;默认端口被占用时 TDK 会换到空闲端口并打印选择;只有当 TDK 之外的东西需要固定地址时才去固定端口,地址核对交给 tdk status --json。