我想保持登台以及生产环境中的蔚蓝。 每个人都应该有它自己的高球存储和SQL存储。 WOD是怎么实现这一目标的最佳方式是什么? 设置一个分期和生产的SQL Server以及两个Blob存储帐户?
Answer 1:
这就是我如何管理我的生产/接受/测试环境(请注意,我没有使用这个词分期 )。 对于每一个环境,我创建以下(取决于项目):
- 云服务
- 存储帐户
- SQL Azure的服务器+数据库
- AppFabric的(ACS,...)命名空间
- 虚拟机
因此,让我们假设我有一个应用程序叫做MYAPP,那么我的环境是这样的:
- 生产
- 云服务:MYAPP-PROD .cloudapp.net
- 存储帐户:MYAPP-PROD
- SQL Azure的服务器包含1个数据库:MyApp的
- 验收
- 云服务:MYAPP-ACCE .cloudapp.net
- 存储帐户:MYAPP-ACCE
- SQL Azure的服务器包含1个数据库:MyAppAcce
- 测试
- ...
因此,所有的环境中有一个版本在生产部署插槽运行的应用程式。 每当我想要做我的生产环境中的VIP互换(注意与生产部署插槽和生产环境的差异)我只用了分期部署插槽。
有这种方法,你必须按环境的专用部件(如存储账户)的几个优点:
- 这很容易,而不会影响真正的应用程序来测试新版本。
- 你可以为每个不同的环境安全性(例如,所有的开发人员可以访问密钥用于测试存储帐户)
- 如果您正在测试您的应用程序,你可以用真实的URL + SSL取而代之的是长期的和丑陋的分期URL工作。
- 这很容易测试与ACS集成,因为每个环境都有其专门的命名空间。
- 使用Visual Studio可以easiliy管理每个环境设置。
- 最后但并非最不重要的,你必须知道Windows Azure存储的可扩展性目标,适用于存储帐户的水平。 这意味着,如果你使用一个单一的存储帐户为您所有的环境中,你可能会减少生产你的应用程序的性能,因为你在升级运行的应用程序在做压力测试。 如果每个环境中使用的存储帐户,当你做的东西,你会不会影响其他环境。
Answer 2:
这里是一个分步指南。
1)您需要的库:Microsoft.Samples.WindowsAzure.ServiceManagement有名为“Windows Azure的服务管理库”一个NuGet包包含此。
2)你需要创建一个X509Certificate2并按照这里列出的指示。 请确保您上传您创建认购证书存储的.CER文件。 请确保您上传的.PFX的副本与私钥实际云服务证书存储。
创建并上传为Windows Azure管理证书
http://blogs.msdn.com/b/clouddeployments/archive/2010/05/12/making-calls-to-the-service-management-api-from-a-service-running-in-windows-azure。 ASPX
3)这些教程也掩盖了这一点:你需要有服务端点定义。 我这样做,用下面的我app.config文件
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="WindowsAzureServiceManagement_WebHttpBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
<readerQuotas maxStringContentLength="1048576" maxBytesPerRead="131072" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</webHttpBinding>
</bindings>
<client>
<endpoint name="WindowsAzureEndPoint"
address="https://management.core.windows.net"
binding="webHttpBinding" bindingConfiguration="WindowsAzureServiceManagement_WebHttpBinding" contract="Microsoft.Samples.WindowsAzure.ServiceManagement.IServiceManagement" />
</client>
</system.serviceModel>
4)一旦做到这一点,我创建了一个名为“GetServerInstance”静态类。 下面是代码:
public static class GetServerInstance
{
const string SubId = "your azuresubscriptionid";
public static bool IsProductionEnvironment()
{
//get the current deploymentId
var currentInstance = RoleEnvironment.DeploymentId;
var mgmtChannnel = ServiceManagementHelper.CreateServiceManagementChannel("WindowsAzureEndPoint",GetCertifcate()); //make the endpoint.
var serviceDetails = mgmtChannnel.GetHostedServiceWithDetails(SubId, "your-cloud-service-name", true);
var currentDeploymentSlot = serviceDetails.Deployments.First(p => p.PrivateID == currentInstance).DeploymentSlot;
if (currentDeploymentSlot == DeploymentSlotType.Staging)
return false; //staging server
if (currentDeploymentSlot == DeploymentSlotType.Production)
return true; //production server
}
private static X509Certificate2 GetCertifcate()
{
string certificateThumbprint = RoleEnvironment.GetConfigurationSettingValue("CertificateThumbprint");
if (String.IsNullOrEmpty(certificateThumbprint))
{
return null; //I'd throw an exception here and log the error
}
var certificateStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
var certs = certificateStore.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false);
if (certs.Count != 1)
{
return null; //I'd throw an exception here and log the error
}
return certs[0];
}
}
5)现在,在我的辅助角色,这是我从来没有想在舞台上运行,因为这将收取两倍的人。 我称之为:
if (GetServerInstance.IsProductionEnvironment())
{
//Do work! I'm in production
};
Answer 3:
不是一个真正的答案,但我需要更多的字符超过允许的意见:)
我还面临着同样的问题。 拥有单独的存储帐户和数据库服务器然而,要走的路面临的挑战是从您的配置文件中挑选合适的存储帐户/数据库,你可以在任何分期或生产环境中部署你的代码。 该RoleInstance类没有办法分期和生产之间的区分。
只有留给你的选择是调用服务管理API,并找出该选择哪个存储帐户/数据库。 一个更复杂添加到这个方程式是当你做VIP交换和突然的暂存槽成为采油槽(反之亦然),现在你必须根据新的环境中切换您的存储帐户/数据库连接字符串。
我会在听到的其他人都做得非常感兴趣。