# 示例 05：多服务模式（`--multiple`）

[English](README.md) | 中文 | [한국어](README-ko.md)

本示例演示从一个 proto 文件生成多个 RPC 服务。

## Proto 定义

两个 proto 文件共享相同的 `go_package`：

```protobuf
option go_package = "example.com/demo/pb";
```

- `shared.proto` — 定义共享消息类型（`Meta`）。
- `multi.proto` — 定义了**两个**服务：`SearchService` 和 `NotifyService`。

当 proto 文件包含多个 `service` 块时，必须使用 `-m`（或 `--multiple`）标志。

## 生成命令

首先，在输出目录中初始化 `go.mod`：

```bash
mkdir -p output && cd output && go mod init example.com/demo && cd ..
```

然后使用 `-m` 标志生成代码：

```bash
goctl rpc protoc multi.proto \
  --go_out=output \
  --go-grpc_out=output \
  --zrpc_out=output \
  --go_opt=module=example.com/demo \
  --go-grpc_opt=module=example.com/demo \
  --module=example.com/demo \
  -I . \
  -m
```

生成的目录结构：

```
output/
├── client
│   ├── notifyservice
│   │   └── notifyservice.go
│   └── searchservice
│       └── searchservice.go
├── etc
│   └── multisvc.yaml
├── go.mod
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   ├── notifyservice
│   │   │   └── notifylogic.go
│   │   └── searchservice
│   │       └── searchlogic.go
│   ├── server
│   │   ├── notifyservice
│   │   │   └── notifyserviceserver.go
│   │   └── searchservice
│   │       └── searchserviceserver.go
│   └── svc
│       └── servicecontext.go
├── multisvc.go
└── pb
    ├── multi.pb.go
    ├── multi_grpc.pb.go
    └── shared.pb.go
```

## 要点说明

- `-m`（或 `--multiple`）标志启用多服务模式。
- 多服务模式下，`client/` 包含按服务名分组的子目录；`logic/` 和 `server/` 也按服务名分组。
- 两个服务共享一个入口文件（`multisvc.go`）和配置。
- 不使用 `--multiple` 时，goctl 只允许每个 proto 文件有一个 `service` 块。
- 所有服务共享同一个 `config.go` 和 `servicecontext.go`。
