102 lines
3.3 KiB
Markdown
102 lines
3.3 KiB
Markdown
# 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 |
|
||
|
||
## 网络拓扑
|
||
|
||
```mermaid
|
||
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 一致)
|
||
|
||
```text
|
||
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` |
|
||
|
||
```mermaid
|
||
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`)
|
||
|
||
```yaml
|
||
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
|
||
|
||
1. 在 **ProtoBufModule** 增加 `service/method` 与消息体。
|
||
2. 在本模块新增 `@Cmd(source=CROSS_TCP, ...)` 的 `GameCommand` 或 `AbstractTypedPbCommand`。
|
||
3. 若需强类型自动解码,使用 **`AbstractTypedPbCommand`**;启动时 **`ProtoRegistryAutoConfigurer`** 会为跨服进程注册对应 `ProtoInfo`。
|