Постановка или производственный экземпляр?
-
29-09-2019 - |
Вопрос
Есть ли где -нибудь во время выполнения сервиса, которое бы сообщило мне, если бы я в настоящее время работал на «постановке» или «производстве»? Вручную изменение конфигурации на производство и из производства кажется немного громоздким.
Решение
Вы действительно не должны менять свои конфигурации, когда вы основаны, если вы находитесь в Prod или постановке. Площадь постановки предназначена не для того, чтобы быть «QA» средой, а только в области удержания до развертывания производства.
Когда вы загружаете новое развертывание, текущий слот развертывания, где вы загружаете свой пакет, разрушен и сокращается на 10-15 минут, когда нагрузка и начало виртуальных машин происходит. Если вы загрузите прямо в производство, это 15 минут простоя простоя. Таким образом, была изобретена зона для постановки: вы загружаете на постановку, тестируйте материал и нажимаете кнопку «Смена», и ваша постановка волшебным образом становится производством (виртуальный IP -своп). Таким образом, ваша постановка должна быть на 100% такой же, как ваша производство.
Я думаю, что вы ищете среда QA/тестирования? Вы должны открыть новую услугу для тестирования среды с помощью собственной Prod/Patging. В этом случае вы захотите поддерживать несколько наборов файлов конфигурации, один набор в среде развертывания (производство, тестирование и т. Д.)
Существует много способов управления конфигурацией-хелл, особенно с Azure, которая имеет в верхней части файлов .config, свои собственные *.cscfg файлы. То, как я предпочитаю делать это с помощью Azure Project, выглядит следующим образом: настроить небольшой конфигурационный проект, создать там папки, которые соответствуют типам развертывания. Внутри каждого наборов настройки папок файлов *.config & *.cscfg, которые соответствуют конкретной среде развертывания: отладка, тестирование, выпуск ... они также настроены в Visual Studio, в качестве целевых типов. У меня есть небольшая команда xcopy, которая происходит во время каждой компиляции конфигурационного проекта, которая копирует все файлы из целевой папки Build of Config Project в корневую папку конфигурационного проекта.
Затем каждый другой проект в решении ссылается на файл .config или .cscfg из корневой папки конфигурационного проекта.
Вуаля, мои конфигурации волшебным образом адаптируются к каждой конфигурации сборки автоматически. Я также использую преобразования. Конфиг для управления информацией отладки для выпуска и не обработанных целей сборки.
Если вы прочитали все это и все еще хотите получить Производство против статуса постановки во время выполнения, тогда: получить deploymentId
от RoleEnvironment.DeploymentId
Затем используйте API управления с помощью правильного X509 certificate
чтобы получить Azure structure of your Service
и позвонить GetDeployments
Метод (это API REST, но есть библиотека абстракции).
Надеюсь это поможет
РЕДАКТИРОВАТЬ: сообщение в блоге, как запрошено о настройке строк конфигурации и переключении между средами @ http://blog.paraleap.com/blog/post/managing-environments-in-a-distributed-azure-or-other-cloud на основе сетевой сети
Другие советы
Иногда я хочу, чтобы люди просто отвечали на вопрос .. не объясняют этику или лучшие практики ...
Microsoft опубликовала образец кода, который делает именно это здесь: https://code.msdn.microsoft.com/windowsazure/csazuredeploymentslot-1ce0e3b5
protected void Page_Load(object sender, EventArgs e)
{
// You basic information of the Deployment of Azure application.
string deploymentId = RoleEnvironment.DeploymentId;
string subscriptionID = "<Your subscription ID>";
string thrumbnail = "<Your certificate thumbnail print>";
string hostedServiceName = "<Your hosted service name>";
string productionString = string.Format(
"https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
subscriptionID, hostedServiceName, "Production");
Uri requestUri = new Uri(productionString);
// Add client certificate.
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = store.Certificates.Find(
X509FindType.FindByThumbprint, thrumbnail, false);
store.Close();
if (collection.Count != 0)
{
X509Certificate2 certificate = collection[0];
HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri);
httpRequest.ClientCertificates.Add(certificate);
httpRequest.Headers.Add("x-ms-version", "2011-10-01");
httpRequest.KeepAlive = false;
HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse;
// Get response stream from Management API.
Stream stream = httpResponse.GetResponseStream();
string result = string.Empty;
using (StreamReader reader = new StreamReader(stream))
{
result = reader.ReadToEnd();
}
if (result == null || result.Trim() == string.Empty)
{
return;
}
XDocument document = XDocument.Parse(result);
string serverID = string.Empty;
var list = from item
in document.Descendants(XName.Get("PrivateID",
"http://schemas.microsoft.com/windowsazure"))
select item;
serverID = list.First().Value;
Response.Write("Check Production: ");
Response.Write("DeploymentID : " + deploymentId
+ " ServerID :" + serverID);
if (deploymentId.Equals(serverID))
lbStatus.Text = "Production";
else
{
// If the application not in Production slot, try to check Staging slot.
string stagingString = string.Format(
"https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
subscriptionID, hostedServiceName, "Staging");
Uri stagingUri = new Uri(stagingString);
httpRequest = (HttpWebRequest)HttpWebRequest.Create(stagingUri);
httpRequest.ClientCertificates.Add(certificate);
httpRequest.Headers.Add("x-ms-version", "2011-10-01");
httpRequest.KeepAlive = false;
httpResponse = httpRequest.GetResponse() as HttpWebResponse;
stream = httpResponse.GetResponseStream();
result = string.Empty;
using (StreamReader reader = new StreamReader(stream))
{
result = reader.ReadToEnd();
}
if (result == null || result.Trim() == string.Empty)
{
return;
}
document = XDocument.Parse(result);
serverID = string.Empty;
list = from item
in document.Descendants(XName.Get("PrivateID",
"http://schemas.microsoft.com/windowsazure"))
select item;
serverID = list.First().Value;
Response.Write(" Check Staging:");
Response.Write(" DeploymentID : " + deploymentId
+ " ServerID :" + serverID);
if (deploymentId.Equals(serverID))
{
lbStatus.Text = "Staging";
}
else
{
lbStatus.Text = "Do not find this id";
}
}
httpResponse.Close();
stream.Close();
}
}
Постановка-это временный слот развертывания, используемый в основном для обновлений No-Laytime, и способность откататься от обновления.
Рекомендуется не объединить вашу систему (ни в коде, ни в конфигурации) с такими спецификами Azure.
С Библиотеки управления Windows Azure И спасибо @guaravmantri отвечать На другой вопрос вы можете сделать это так:
using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Management.Compute;
using Microsoft.WindowsAzure.Management.Compute.Models;
namespace Configuration
{
public class DeploymentSlotTypeHelper
{
static string subscriptionId = "<subscription-id>";
static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";// copy-paste it
static string cloudServiceName = "<your cloud service name>"; // lowercase
static string ns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";
public DeploymentSlot GetSlotType()
{
var managementCertificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
var credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);
var computeManagementClient = new ComputeManagementClient(credentials);
var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
return response.Deployments.FirstOrDefault(d => d.DeploymentSlot == DeploymentSlot.Production) == null ? DeploymentSlot.Staging : DeploymentSlot.Production;
}
}
}
Простой способ решить эту проблему - установить в ваших экземплярах ключ, чтобы определить, в какой среде она работает.
1) Установите на своем производственном слоте: Установите настройки >> Настройки приложения >> Настройки приложения и создайте ключ с именем SLOT_NAME и значение «Производство». ВАЖНО: Проверьте настройку слота.
2) Установите на своем промежуточном слоте: Установите настройки >> Настройки приложения >> Настройки приложения и создайте ключ с именем SLOT_NAME и значение «Постановка». ВАЖНО: Проверьте настройку слота.
Доступ из вашего приложения переменной и определите, в какой среде работает приложение. На Java вы можете получить доступ:
String slotName = System.getenv("APPSETTING_SLOT_NAME");
Вот 4 балла, которые нужно рассмотреть
- VIP Swap имеет смысл только тогда, когда ваш сервис сталкивается с внешним миром. Ака, когда он разоблачает API и реагирует на запросы.
- Если все ваши сервисы делают сообщения из очереди и обрабатывают их, то ваши услуги являются упреждающими, а VIP -обмен не является хорошим решением для вас.
- Если ваш сервис является как реактивным, так и упреждающим, вы можете пересмотреть свой дизайн. Возможно, разделите сервис на 2 разных службы.
- Предложение Эрика об изменении файлов CSCFG Pre- и Post-VIP хорош, если упреждающая часть вашей службы может занять короткое время (потому что вы сначала настраиваете как постановку, так и производство, чтобы не вытащить сообщения, а затем выполняете VIP-совоку, а затем Обновите конфигурацию производства для начала вытягивания сообщений).