# 外部 API Dedicated 集群限制与缓存

## 背景

Clinic Data Proxy 与新增 NGM 对外 API 仅允许 dedicated 集群访问。集群的 `DeployType` 来自 Clinic DB，且通常不会变化；每个请求直接查询 DB 会增加不必要的开销。

## 方案

- 在 `dbaas_auth` 的 `session-id-validation` 配置中增加全局 `allowed-deploy-types`，规则仅通过 `cluster-id-pattern` 选择是否执行类型校验。
- 集群列表接口不配置 `cluster-id-pattern`，保持现有列表行为；其他受限 cluster、metrics、loki 和 NGM 资源接口只允许全局配置的 `dedicated`。
- JWT 与 x-session-id 校验成功后、Account RBAC 前，根据匹配规则从 path 读取 cluster ID，查询本地 Clinic DB 的 `clusters.deploy_type`。
- 使用进程内 LRU 缓存保存 `clusterID -> DeployType + expireAt`：TTL 7 天、最大 10,000 条。DB 查询失败、cluster 不存在和空类型不会缓存并返回 403；非 dedicated 的有效类型会缓存，避免重复查询。
- 日志必须包含 trace ID、cluster ID、deploy type、允许类型、查询来源、缓存命中、DB 耗时及拒绝原因；禁止输出 JWT 或敏感 header。

## 配置示例

```yaml
session-id-validation:
  deploy-type-cache-ttl: 168h
  deploy-type-cache-size: 10000
  allowed-deploy-types:
    - dedicated
  rules:
    - method: GET
      path: ^/api/v1/orgs/\\d+/data-proxy/clusters$
      required: true
    - path: ^/api/v1/orgs/\\d+/data-proxy/(?:clusters|metrics|loki)/\\d+(?:/|$)
      required: true
      cluster-id-pattern: /(?:clusters|metrics|loki)/(\\d+)(?:/|$)
      allowed-deploy-types:
        - dedicated
```

## 验证

- dedicated 集群请求成功；non-dedicated、空类型、cluster 不存在和 DB 失败返回 403。
- 同一 cluster 的第二次请求命中缓存；7 天后回源；超过容量时淘汰最久未使用条目。
- staging 验证 x-session-id 缺失返回 403、类型拒绝返回 403，并确认 Kong 日志携带同一 x-trace-id。
- 生产发布仅在 staging 验证完成并取得明确授权后进行。
