本页面介绍如何使用 Service Infrastructure 执行逐步的服务配置发布。
更新生产服务的服务配置存在风险,可能会导致中断。通过 Service Management API,您可以逐步发布配置更改,从而缓和错误的服务配置所产生的影响。
您可以部署多个服务配置版本,并定义如何在运行时使用这些版本,所有这些都可以通过调用 services.rollouts.create 方法来启动 Rollout。一次最多可以发布 5 个服务配置。
准备工作
如要运行本指南中的示例,请确保首先按照 Service Management API 使用入门中的说明完成初始设置。
执行发布
假设您有一项基于 Service Management API 构建的托管式服务 endpointsapis.appspot.com,则可以按照下列步骤以有序的方式分阶段发布服务配置更改。
例如,endpointsapis.appspot.com 当前正在使用服务配置 old,并且您想要将其更改为使用服务配置 new。您可以创建一个发布,以利用 10% 的总流量测试新服务配置,而不是让所有生产流量都立即使用新服务配置:
# Create rollout to test the new configuration with 10% traffic. $ gcurl -d '{ "rolloutId": "canary-rollout", "serviceName": "endpointsapis.appspot.com", "trafficPercentStrategy": { "percentages": { "new": 10, "old": 90 } } }' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts { "name": "operations/rollouts.endpointsapis.appspot.com:canary-rollout" "metadata": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata", "resourceNames": [ "services/endpointsapis.appspot.com/rollouts/canary-rollout" ], "startTime": ... }, "response": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout", "rolloutId": "canary-rollout", "createTime": ... "trafficPercentStrategy": { "percentages": { "old": 90, "new": 10, } }, "serviceName": "endpointsapis.appspot.com" } } 创建首次发布后,您可以通过运行以下命令,替换您自己的首次展示 ID 来获得首次发布的状态:
# Get rollout status of `operations/rollouts.endpointsapis.appspot.com:canary-rollout`. $ gcurl https://servicemanagement.googleapis.com/v1/operations/rollouts.endpointsapis.appspot.com:canary-rollout { "name": "operations/rollouts.endpointsapis.appspot.com:canary-rollout", "metadata": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata", "resourceNames": [ "services/endpointsapis.appspot.com/rollouts/canary-rollout" ], "steps": [ { "description": "update Service Controller", "status": "DONE" } ], "progressPercentage": 100, "startTime": ... }, "done": true, "response": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout", "rolloutId": "canary-rollout", "createTime": ... "status": "SUCCESS", "trafficPercentStrategy": { "percentages": { "old": 90, "new": 10, } }, "serviceName": "endpointsapis.appspot.com" } } 确保 Canary 发布已完成并且新服务配置良好之后,您可以创建一个发布以使其提供 100%的流量:
# Create rollout to let new configuration serve 100% traffic. $ gcurl -d '{ "rolloutId": "full-rollout", "serviceName": "endpointsapis.appspot.com", "trafficPercentStrategy": { "percentages": { "new": 100, } } }' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts { "name": "operations/rollouts.endpointsapis.appspot.com:full-rollout", "metadata": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata", "resourceNames": [ "services/endpointsapis.appspot.com/rollouts/full-rollout" ], "startTime": ... }, "response": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout", "rolloutId": "full-rollout", "createTime": ... "trafficPercentStrategy": { "percentages": { "new": 100, } }, "serviceName": "endpointsapis.appspot.com" } } 如果在测试阶段发现问题,您可以通过执行以下操作回滚到旧配置:
# Rollback to the old configuration. $ gcurl -d '{ "rolloutId": "rollout-to-old", "serviceName": "endpointsapis.appspot.com", "trafficPercentStrategy": { "percentages": { "old": 100, } } }' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts { "name": "operations/rollouts.endpointsapis.appspot.com:rollout-to-old", "metadata": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata", "resourceNames": [ "services/endpointsapis.appspot.com/rollouts/rollout-to-old" ], "startTime": ... }, "response": { "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout", "rolloutId": "rollout-to-old", "createTime": ... "trafficPercentStrategy": { "percentages": { "old": 100, } }, "serviceName": "endpointsapis.appspot.com" } }
查看发布历史记录
Service Management API 保留发布的历史记录。如要查看 endpointsapis.appspot.com 的发布历史记录,请执行以下操作:
# List rollout history for `endpointsapis.appspot.com`. $ gcurl https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts { "rollouts": [ { "rolloutId": "canary-rollout", "createTime": ... "status": "IN_PROGRESS", "trafficPercentStrategy": { "percentages": { "old": 90, "new": 10 } }, "serviceName": "endpointsapis.appspot.com" }, { "rolloutId": "old-rollout", "createTime": ... "status": "SUCCESS", "trafficPercentStrategy": { "percentages": { "old": 100 } }, "serviceName": "endpointsapis.appspot.com" }, ... ] }