本文介绍如何通过 OpenAPI 自动化完成服务与域名准备、域名策略、API 与路由、路由策略与发布,并给出并发执行、状态确认和 Conflict 规避建议。
1. 先看结论
1.1 路由级策略的最佳调用顺序(推荐)
-
创建路由:
CreateHttpApiRoute -
创建策略:
CreatePolicy -
挂载策略:
CreatePolicyAttachment -
发布路由:
DeployHttpApi
这是最稳妥的顺序:先把路由实体固定,再绑定策略,最后发布,避免发布后再改策略导致重复发布和状态竞争。
1.2 哪些步骤可以并发
|
阶段 |
是否建议并发 |
建议 |
|
服务准备(CreateService)与域名准备(Get/CreateDomain) |
建议 |
资源互相独立,可并发执行。 |
|
多个策略创建(CreatePolicy) |
建议 |
不同策略可并发创建。 |
|
多个策略挂载到不同路由/域名 |
建议 |
以资源 ID 分片并发。 |
|
同一条路由的更新/挂载/发布 |
不建议 |
串行执行,避免状态冲突(Deploying/Undeploying)。 |
|
同一路径前缀路由批量创建 |
不建议 |
易触发路径冲突,建议串行并做预校验。 |
1.3 如何确认生效
-
路由发布结果:查
GetHttpApiRoute的deployStatus是否到Deployed,并检查deployErrorMessage。 -
策略挂载结果:查
GetPolicyAttachment是否返回目标attachResourceId/attachResourceType。 -
域名绑定结果:查
GetDomain(withStatistics=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:必填,常见如DNS、VIP、K8s、MseNacos。 -
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:必填,HTTP或HTTPS。 -
gatewayType:建议显式传API(不传会走默认)。 -
若
protocol=HTTPS,需补齐证书相关参数(如forceHttps、certIdentifier等)。
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
}
]
}
}
关键参数:
-
environmentId、name、match、backendConfig必填。 -
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 步做验收:
-
查路由发布状态
-
调用
GetHttpApiRoute(GET),并传httpApiId、routeId。 -
观察:
-
deployStatus=Deployed:发布成功。 -
deployStatus=DeployFailed:发布失败,查看deployErrorMessage。
-
-
-
查策略挂载
-
调用
GetPolicyAttachment(GET),并传policyAttachmentId。 -
确认
attachResourceId、attachResourceType、gatewayId与目标一致。
-
-
查域名关联
-
调用
GetDomain(GET),并传domainId、withStatistics=true。 -
或在路由详情确认
domainInfos已包含目标域名。
-
-
发一条真实流量验证
-
用目标域名 + 路径发请求,确认路由转发与策略行为(如白名单拦截/放行)符合预期。
-
7. 易触发 Conflict 的场景与规避建议
本项目里 TypeConflict 会映射为 HTTP 409。
-
CreateService 冲突
-
典型错误:
ServiceExisted、ServiceQuotaPerGatewayExceed。 -
规避:同一网关内服务命名统一规范;批量创建前预估配额。
-
-
CreateDomain 冲突
-
典型错误:
DomainExisted。 -
规避:域名命名全局去重(按
name + gatewayType维度)。
-
-
CreatePolicy / CreatePolicyAttachment 冲突
-
典型错误:
-
PolicyExisted。 -
PolicyAttachResourceBounded(同策略重复挂载同资源)。 -
PolicyAttachConflict(同资源已有同类策略,尤其路由级单例策略)。 -
PolicyAttachResourceTypeNotMatch(同策略混挂不同资源类型)。
-
-
规避:按
resourceId + className做幂等键;挂载前先查已有挂载。
-
-
CreateHttpApi / CreateHttpApiRoute 冲突
-
典型错误:
-
ApiNameDuplicated/ApiNameDuplicatedWithInstance。 -
ApiVersionDuplicated(REST 多版本)。 -
RouteNameDuplicated。 -
RoutePathHasDefinedByApi(路径/方法冲突)。
-
-
规避:同一网关下 API 名称唯一;同一路径段路由尽量串行创建并先校验。
-
-
DeployHttpApi 冲突
-
典型错误:
-
DeployRouteForbidden(路由在Deploying/Undeploying)。 -
ApiNameDuplicatedWithInstance(发布态实例名冲突)。
-
-
规避:同一路由的“改策略 + 发布”严格串行;同一时刻避免重复发布同
routeId。
-
8. 最小执行清单(可直接落地)
-
服务和域名准备阶段并发执行,拿到
serviceId、domainId。 -
创建
HttpApi后,再创建HttpApiRoute。 -
路由策略遵循:先建路由 -> 再建策略 -> 再挂载 -> 最后发布。
-
发布后轮询路由
deployStatus到Deployed。 -
对 409 场景做幂等:先查后建,或对“重复创建”做可容忍处理。