Como gerenciar lançamentos de serviço

Nesta página, você aprende a usar a plataforma Service Infrastructure para executar uma distribuição gradual da configuração de serviço.

Atualizar a configuração de serviço para um serviço de produção é arriscado e pode causar interrupção. Com a API Service Management, é possível fazer a distribuição gradual das alterações de configuração, diminuindo assim o impacto causado pelas configurações de serviço incorretas.

Você pode implantar várias versões de configuração de serviço e definir como essas versões serão usadas no ambiente de execução chamando o método services.rollouts.create para iniciar um lançamento. Distribua até três configurações de serviço simultaneamente.

Antes de começar

Para executar os exemplos deste guia, primeiro siga as instruções para concluir a configuração inicial em Primeiros passos com a API Service Management.

Execução da implementação

Supondo que você tenha um serviço gerenciado endpointsapis.appspot.com criado na API Service Management, você pode executar as seguintes etapas para lançar uma alteração na configuração de serviço de maneira faseada e controlada.

Por exemplo, endpointsapis.appspot.com está atualmente usando a configuração de serviço old e você quer alterá-lo para usar a configuração de serviço new. Em vez de ter a nova configuração de serviço usada instantaneamente por todo o tráfego de produção, você pode criar uma distribuição para testar a nova configuração de serviço com 10% do tráfego total:

# 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"
  }
}

Após a criação do lançamento, você poderá obter o status do lançamento executando o seguinte comando, substituindo o ID de distribuição pelo seu próprio:

# 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"
  }
}

Depois de verificar se o lançamento do canary foi concluído e a nova configuração de serviço está boa, você pode criar um lançamento para permitir que ele atenda 100% do tráfego:

# 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"
  }
}

Se você notar problemas durante a etapa de teste, pode reverter para a configuração anterior 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"
 }

}

Como ver o histórico de distribuições

A API Service Management mantém um histórico de distribuições. Para visualizar o histórico de lançamentos de endpointsapis.appspot.com, você pode:

# 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"
    },
    ...
  ]
}