# ProtoBufModule 本模块承载 **RPC 与业务消息的二进制契约**:所有 TCP 链路上传输的业务体都通过此处定义的 `protobuf` 生成 Java 类(包名 `com.huangzj.cmd.gen`)。 ## 职责 - 维护 `src/main/protobuf` 下的 `.proto` 源文件。 - Maven `protobuf-maven-plugin` 在 `generate-sources` 阶段生成 Java 源码到 `target/generated-sources/protobuf/java`。 - **其它模块**(BaseModule、ServerModule、CrossModule)仅依赖本模块打出的 jar,不重复拷贝 `.proto`。 ## 目录结构(源文件) ```text src/main/protobuf/ └── serverProto/ ├── cmd_rpc.proto # CmdRpcEnvelope、各 CTS/STC、Method 枚举 └── pb_service.proto # PbService(Service_1 ~ Service_4) ``` > 历史上独立的 `CrossProto` 已移除;跨服与区服共用 **`demo.cmd`** 包下的消息,通过 **service/method + CommandSource** 在 Java 侧区分语义。 ## 网络层核心消息:`CmdRpcEnvelope` ```protobuf message CmdRpcEnvelope { uint32 service_id = 1; uint32 method_id = 2; bytes payload = 3; // 具体 CTS 的序列化字节 int32 cross_ret = 4; // 预留/透传 uint32 link_seq = 5; // 区服↔跨服长连接多路复用序号(客户端 TCP 可为 0) } ``` ### `link_seq` 的作用(与网络实现配合) ```mermaid sequenceDiagram participant Z as 区服 CrossTcpClient participant X as 跨服 TCP Note over Z,X: 单条 TCP 上可能同时存在多帧在途 Z->>X: 请求 A (link_seq=101) Z->>X: 请求 B (link_seq=102) X-->>Z: 响应 B (link_seq=102) X-->>Z: 响应 A (link_seq=101) ``` - 区服在 **`CrossTcpClient`** 内为每次 `roundTrip` / 注册 / 心跳分配 **非 0** 的 `link_seq`。 - 跨服命令通过 **`AbstractTypedPbCommand`** 回包时 **原样带回** 请求信封中的 `link_seq`,以便客户端把响应与 `CompletableFuture` 对应。 ## 服务与方法枚举 | PbService | 用途 | |-----------|------| | Service_1 | 路径 1 示例(Echo) | | Service_2 | 跨服业务 Method2(`CrossForward*`) | | Service_3 | 路径 3 区服对客户端暴露的中转接口 | | Service_4 | **链路控制**:Register、Heartbeat(仅区服→跨服长连接上使用) | `Service4_Method`:`Register`、`Heartbeat`,载荷分别为 `CrossLinkRegisterCts/Stc`、`CrossLinkHeartbeatCts/Stc`。 ## 业务消息(与路径对应) - **路径 1**:`CmdEchoCts` / `CmdEchoStc`。 - **路径 2(客户端侧)**:`CrossProxyCts` / `CrossProxyStc`(区服内会转为 `CrossForward*` 再发往跨服)。 - **路径 3**:客户端 payload 使用 **`CrossForwardCts`** 形态(与跨服 Service_2/Method2 一致),信封为 Service_3/Method3。 - **跨服 Service_2/Method2**:`CrossForwardCts` / `CrossForwardStc`。 ## 生成代码 ```bash cd ProtoBufModule mvn -q generate-sources # 或使用 genpb.bat(Windows,会探测 Maven) ``` 生成物加入 `ProtoBufModule` jar,依赖方编译时自动可见。 ## 扩展约定 新增 RPC 时建议: 1. 在 `pb_service.proto` 增加 `PbService` 枚举值(若新服务号)。 2. 在 `cmd_rpc.proto` 增加 `ServiceX_Method` 与 CTS/STC `message`。 3. 执行 `generate-sources` 后,在 **BaseModule** 侧通过 `@Cmd` + `AbstractTypedPbCommand` 或 `GameCommand` 实现逻辑,并由 **`ProtoRegistryAutoConfigurer`** 自动注册 `ProtoInfo`(强类型命令)。