3.3 KiB
3.3 KiB
CrossModule
跨服独立进程:仅启动 一个 CmdRpc TCP 服务(默认 9200),处理来源为 CommandSource.CROSS_TCP 的命令。
区服通过 CrossTcpClient(在 ServerModule)作为 TCP 客户端 连到本进程。
进程职责
| 职责 | 说明 |
|---|---|
| 监听 TCP | CrossTcpServer 在 ApplicationReadyEvent 后 bind(cross.tcp.port) |
| Pipeline | CrossTcpChannelInitializer:LengthPrefixedProtobuf 解码 + CmdRpcTcpFrameHandler |
| 命令路由 | CrossGameCommandRegistry 只注册 @Cmd(source=CROSS_TCP) 的 Bean |
| 链路安全(可选) | CrossLinkAcceptProperties:cross.link.expected-token 非空时校验注册 token |
网络拓扑
flowchart LR
subgraph Zone["ServerModule"]
CC[CrossTcpClient]
end
subgraph Cross["CrossModule :9200"]
XT[CrossTcpServer]
PL[pipeline]
REG[CrossGameCommandRegistry]
end
CC <-->|单 TCP 长连接 长度前缀+CmdRpcEnvelope| XT
XT --> PL --> REG
入站 Pipeline(与 BaseModule 一致)
Socket
→ LengthFieldBasedFrameDecoder(由 LengthPrefixedProtobuf 配置)
→ CmdRpcTcpFrameHandler
→ CmdRpcChannelDispatch(linkSource = CROSS_TCP)
→ GameCommand.execute
→ 编码响应帧写回
跨服侧 CrossRpcInvoker 传 null:跨服命令里 不应 再同步 roundTrip 回调区服(Demo 未实现跨服主动调区服)。
已实现的 CROSS_TCP 命令
业务:Service_2 / Method2
CrossForwardCommand(AbstractTypedPbCommand)- 入参:
CrossForwardCts - 出参:
CrossForwardStc - Demo 逻辑:给
trace加前缀并写入cross_time_ms。
- 入参:
链路:Service_4(注册 / 心跳)
| method | 命令类 | 作用 |
|---|---|---|
| Register | CrossLinkRegisterCommand |
校验 server_id、可选 expected-token |
| Heartbeat | CrossLinkHeartbeatCommand |
回显 client_time_ms,写入 cross_time_ms |
sequenceDiagram
participant Z as 区服 CrossTcpClient
participant X as CrossModule
Z->>X: Service_4 Register + link_seq + CrossLinkRegisterCts
X-->>Z: 同 link_seq + CrossLinkRegisterStc(ok/message)
loop 每 heartbeat-interval-ms
Z->>X: Service_4 Heartbeat + link_seq
X-->>Z: CrossLinkHeartbeatStc
end
Z->>X: Service_2 Method2 + link_seq + CrossForwardCts
X-->>Z: CrossForwardStc
配置(src/main/resources/application.yml)
cross:
tcp:
port: 9200 # Netty 监听端口
link:
expected-token: "" # 非空则须与区服 cross.token 一致
app:
logging:
dir: logs/CrossModule
启动
主类:com.huangzj.cross.CrossModuleApplication
建议 先于区服 启动,否则区服 CrossTcpClient 预热与心跳会失败(日志告警),待跨服起来后下次业务或心跳会重连。
日志
logback-spring.xml:控制台 + 按级别分文件(info.log / error.log),目录由 app.logging.dir 指定。
扩展跨服 RPC
- 在 ProtoBufModule 增加
service/method与消息体。 - 在本模块新增
@Cmd(source=CROSS_TCP, ...)的GameCommand或AbstractTypedPbCommand。 - 若需强类型自动解码,使用
AbstractTypedPbCommand;启动时ProtoRegistryAutoConfigurer会为跨服进程注册对应ProtoInfo。