路由与策略编排最佳实践

更新时间:
复制为 MD 格式

本文介绍如何通过 OpenAPI 自动化完成服务与域名准备、域名策略、API 与路由、路由策略与发布,并给出并发执行、状态确认和 Conflict 规避建议。

1. 先看结论

1.2 哪些步骤可以并发

阶段

是否建议并发

建议

服务准备(CreateService)与域名准备(Get/CreateDomain)

建议

资源互相独立,可并发执行。

多个策略创建(CreatePolicy)

建议

不同策略可并发创建。

多个策略挂载到不同路由/域名

建议

以资源 ID 分片并发。

同一条路由的更新/挂载/发布

不建议

串行执行,避免状态冲突(Deploying/Undeploying)。

同一路径前缀路由批量创建

不建议

易触发路径冲突,建议串行并做预校验。

1.3 如何确认生效

  • 路由发布结果:查 GetHttpApiRoutedeployStatus 是否到 Deployed,并检查 deployErrorMessage

  • 策略挂载结果:查 GetPolicyAttachment 是否返回目标 attachResourceId / attachResourceType

  • 域名绑定结果:查 GetDomainwithStatistics=true)的统计信息,或查路由详情中的 domainInfos

1.4 Conflict(HTTP 409)高频触发点

  • 重复资源:同名服务/域名/API、同一路由名、同资源重复挂载同类策略。

  • 状态竞争:路由处于 Deploying/Undeploying 时再次发布或变更。

  • 绑定冲突:策略挂载类型不一致、同一策略跨环境/网关不符合约束。

2. 服务与域名准备

2.1 创建/查询服务(CreateService / GetService)

详细 API 文档:

2.1.1 CreateService

POST CreateService
Content-Type: application/json
{
  "gatewayId": "gw-xxx",
  "sourceType": "DNS",
  "serviceConfigs": [
    {
      "name": "orders-backend",
      "addresses": [
        "orders.backend.svc.cluster.local:80"
      ]
    }
  ]
}

关键参数:

  • gatewayId:必填,目标网关实例 ID。

  • sourceType:必填,常见如 DNSVIPK8sMseNacos

  • serviceConfigs[]:必填,支持批量创建。

  • 返回值中的 serviceIds[]:后续路由后端引用使用。

2.1.2 GetService

GET GetService

建议:

  • serviceId 必须是已有服务 ID(格式通常为 svc-...,兼容历史 gs-...)。

  • 在创建路由前先校验服务存在与关键字段(地址、端口、协议)是否符合预期。

2.2 查询域名(GetDomain)

详细 API 文档:

GET GetDomain
Query: domainId=d-xxx&withStatistics=true

关键参数:

  • domainId:域名 ID(d-...)。

  • withStatistics:可选,true 时返回域名关联资源统计,便于发布后验收。

2.3 创建域名(CreateDomain)

详细 API 文档:

POST CreateDomain
Content-Type: application/json
{
  "name": "api.example.com",
  "protocol": "HTTP",
  "gatewayType": "API"
}

关键参数:

  • name:必填,域名名称。

  • protocol:必填,HTTPHTTPS

  • gatewayType:建议显式传 API(不传会走默认)。

  • protocol=HTTPS,需补齐证书相关参数(如 forceHttpscertIdentifier 等)。

3. 域名级策略配置

3.1 创建策略(域名)(CreatePolicy)

详细 API 文档:

说明

建议使用 CreatePolicy 单独创建策略,再走 CreatePolicyAttachment;不要用 CreateAndAttachPolicy 的“创建并挂载”混合语义。

POST CreatePolicy
Content-Type: application/json
{
  "name": "domain-ip-whitelist",
  "className": "IpAccessControl",
  "description": "domain level ip whitelist",
  "config": "{\"name\":\"domain-ip-whitelist\",\"ipAccessControlResourceName\":\"api.example.com\",\"ipAccessControlResourceType\":\"Domain\",\"ipAccessControlType\":\"White\",\"ipAccessControlContent\":\"10.0.0.0/8,192.168.0.0/16\",\"enable\":true,\"protocolLayer\":\"L7\"}"
}

关键参数:

  • name:必填,策略名(同网关下避免重名)。

  • className:必填,策略类型。

  • config:必填,JSON 字符串(不是 JSON 对象)。

3.2 创建策略挂载(域名)(CreatePolicyAttachment)

详细 API 文档:

POST CreatePolicyAttachment
Content-Type: application/json
{
  "policyId": "p-xxx",
  "attachResourceId": "d-xxx",
  "attachResourceType": "Domain",
  "gatewayId": "gw-xxx"
}

关键参数:

  • policyId:必填,策略 ID。

  • attachResourceId:必填,域名 ID(d-...)。

  • attachResourceType:必填,域名级固定 Domain

  • gatewayId:必填。

  • environmentId:域名级策略不敏感,服务端会统一处理为 *

4. API 与路由创建

4.1 创建 HttpAPI(CreateHttpApi)

详细 API 文档:

POST CreateHttpApi
Content-Type: application/json
{
  "name": "orders-http-api",
  "description": "orders route collection",
  "type": "Http",
  "protocols": [
    "HTTP",
    "HTTPS"
  ]
}

关键参数:

  • name:必填,API 名称。

  • type:必填,HTTP API 用 Http

  • protocols:可选,不传时通常按默认协议处理。

4.2 创建 HttpAPI 路由(CreateHttpApiRoute)

详细 API 文档:

POST CreateHttpApiRoute
Content-Type: application/json

参数:

  • httpApiId:必填。

{
  "environmentId": "env-xxx",
  "name": "orders-route",
  "domainIds": [
    "d-xxx"
  ],
  "match": {
    "path": {
      "type": "Prefix",
      "value": "/orders"
    },
    "methods": [
      "GET",
      "POST"
    ]
  },
  "backendConfig": {
    "scene": "SingleService",
    "services": [
      {
        "serviceId": "svc-xxx",
        "protocol": "HTTP",
        "port": 80,
        "weight": 100
      }
    ]
  }
}

关键参数:

  • environmentIdnamematchbackendConfig 必填。

  • name 要满足格式约束(小写字母/数字/短横线/点,且长度 <= 64)。

  • backendConfig.scene=SingleService 时,services 建议仅一个后端。

  • domainIds 创建时可为空,但发布时必须有可发布域名

5. 路由级策略配置与发布

5.1 创建策略(路由)(CreatePolicy)

与域名级一致,仍使用:

POST CreatePolicy

路由级示例(IpAccessControl):

{
  "name": "route-ip-whitelist",
  "className": "IpAccessControl",
  "description": "route level ip whitelist",
  "config": "{\"name\":\"route-ip-whitelist\",\"ipAccessControlResourceName\":\"orders-route\",\"ipAccessControlResourceType\":\"GatewayRoute\",\"ipAccessControlType\":\"White\",\"ipAccessControlContent\":\"10.10.0.0/16\",\"enable\":true,\"protocolLayer\":\"L7\"}"
}

5.2 创建策略挂载(路由)(CreatePolicyAttachment)

POST CreatePolicyAttachment
Content-Type: application/json
{
  "policyId": "p-yyy",
  "attachResourceId": "hr-yyy",
  "attachResourceType": "GatewayRoute",
  "environmentId": "env-xxx",
  "gatewayId": "gw-xxx"
}

关键参数:

  • attachResourceId:路由 ID,前缀应为 hr-

  • attachResourceType:路由级固定 GatewayRoute

  • environmentId:路由级大多数策略建议显式传;IpAccessControl 是特例可不传。

  • gatewayId:必填。

5.3 发布 API(DeployHttpApi)

详细 API 文档:

POST DeployHttpApi
Content-Type: application/json

参数:

  • httpApiId:必填。

{
  "routeId": "hr-yyy",
  "isInternalRoute": false
}

说明:

  • HTTP API 场景下,核心参数是 routeId

  • 接口走异步发布语义,调用成功不等于已生效,需轮询状态确认。

5.4 可选:发布前冲突预检(DetectHttpApiConflicts)

POST DetectHttpApiConflicts
Content-Type: application/json

参数:

  • httpApiId:必填。

{
  "routeId": "hr-yyy",
  "isInternalRoute": false
}

建议:

  • 该预检尤其适合“自定义域名 + 多团队并行改路由”的场景。

  • 发现冲突后先调整路径/方法/域名绑定,再执行 DeployHttpApi

6. 如何确认已经生效

建议按下面 4 步做验收:

  1. 查路由发布状态

    • 调用 GetHttpApiRouteGET),并传 httpApiIdrouteId

    • 观察:

      • deployStatus=Deployed:发布成功。

      • deployStatus=DeployFailed:发布失败,查看 deployErrorMessage

  2. 查策略挂载

    • 调用 GetPolicyAttachmentGET),并传 policyAttachmentId

    • 确认 attachResourceIdattachResourceTypegatewayId 与目标一致。

  3. 查域名关联

    • 调用 GetDomainGET),并传 domainIdwithStatistics=true

    • 或在路由详情确认 domainInfos 已包含目标域名。

  4. 发一条真实流量验证

    • 用目标域名 + 路径发请求,确认路由转发与策略行为(如白名单拦截/放行)符合预期。

7. 易触发 Conflict 的场景与规避建议

说明

本项目里 TypeConflict 会映射为 HTTP 409。

  1. CreateService 冲突

    • 典型错误:ServiceExistedServiceQuotaPerGatewayExceed

    • 规避:同一网关内服务命名统一规范;批量创建前预估配额。

  2. CreateDomain 冲突

    • 典型错误:DomainExisted

    • 规避:域名命名全局去重(按 name + gatewayType 维度)。

  3. CreatePolicy / CreatePolicyAttachment 冲突

    • 典型错误:

      • PolicyExisted

      • PolicyAttachResourceBounded(同策略重复挂载同资源)。

      • PolicyAttachConflict(同资源已有同类策略,尤其路由级单例策略)。

      • PolicyAttachResourceTypeNotMatch(同策略混挂不同资源类型)。

    • 规避:按 resourceId + className 做幂等键;挂载前先查已有挂载。

  4. CreateHttpApi / CreateHttpApiRoute 冲突

    • 典型错误:

      • ApiNameDuplicated / ApiNameDuplicatedWithInstance

      • ApiVersionDuplicated(REST 多版本)。

      • RouteNameDuplicated

      • RoutePathHasDefinedByApi(路径/方法冲突)。

    • 规避:同一网关下 API 名称唯一;同一路径段路由尽量串行创建并先校验。

  5. DeployHttpApi 冲突

    • 典型错误:

      • DeployRouteForbidden(路由在 Deploying/Undeploying)。

      • ApiNameDuplicatedWithInstance(发布态实例名冲突)。

    • 规避:同一路由的“改策略 + 发布”严格串行;同一时刻避免重复发布同 routeId

8. 最小执行清单(可直接落地)

  • 服务和域名准备阶段并发执行,拿到 serviceIddomainId

  • 创建 HttpApi 后,再创建 HttpApiRoute

  • 路由策略遵循:先建路由 -> 再建策略 -> 再挂载 -> 最后发布

  • 发布后轮询路由 deployStatusDeployed

  • 对 409 场景做幂等:先查后建,或对“重复创建”做可容忍处理。

参考文档