将新部署发布到Cloud Service的临时或生产环境很容易,但我想更频繁地使用VIP交换(交换生产和暂存部署)。就我而言,我为每个环境都有不同的web.config值。例如,在暂存时我的web.config可能有:
<appSettings>
<add key="ConnectionStringName" value="StagingConnectionString" />
<add key="WCFServiceUrl" value="http://somelongGUID.cloudapp.net/" />
</appSettings>
......在制作方面,我会:
<appSettings>
<add key="ConnectionStringName" value="ProductionConnectionString" />
<add key="WCFServiceUrl" value="http://prodservice.cloudapp.net/" />
</appSettings>
发布到Staging或Production时,将使用基于Debug或Release的正确值转换web.config。但是当谈到Windows Azure门户上的VIP Swap时,我必须触发交换,然后远程进入每个实例并手动更改这些值(这绝对不是正确的方法)。
如何才能更好地应对这种情况?或者是否有一个更好,更灵活的解决方案来处理这些自定义配置值,而不是在web.config中使用它们(特别是在这种情况下)?
提前致谢。
答案 0 :(得分:5)
使用VIP交换被认为是在Web和辅助角色中促进登台生产的“标准”方式。它通过更改Azure路由以将“生产”URL指向“登台”角色实例并将“登台”URL指向“生产”角色实例来实现此交换。
在内部,角色不知道这种变化:它完全发生在托管过程的外部。
如果您希望以这种方式使用VIP交换,您应该考虑将应用程序更改为不知道其主机环境,或者在需要知道它时从主机读取信息。
在Azure中安排生产和登台的方式,包应该都是相同的:两个实时配置。该功能旨在实现高可用性部署;它不适合将角色调用到不同服务所暗示的那种测试,具体取决于它是否是分段部署。
你最好使用一个单独的角色来执行测试;在使用当前生产部署进行切换之前,只应使用暂存来测试部署是否成功。
答案 1 :(得分:2)
VIP交换顾名思义就是虚拟IP交换。因此,我认为将DNS指针更改为机器IP很简单,因此我认为任何配置转换都不会发生。暂存部署应该在各个意义上与生产部署相匹配。
如果要根据其他配置测试部署,请在Azure中更好地创建新服务,并使用阶段配置在此部署解决方案。一旦满意,就可以在生产阶段插槽中进行新部署。快速吸烟并进行交换。
答案 2 :(得分:1)
您可以考虑几种方法。
对于Web角色,您可以通过检查传入请求URL中的主机名来区分登台和生产。通过从主机名识别上下文,您可以使用不同的配置值。因此,您在web.config中有两个连接字符串,并且您可以根据主机名更改代码以使用适当的连接字符串。
或者,不是通过门户进行VIP交换,而是编写一个工具(如Powershell Cmdlet)来执行此操作,并在执行实际交换的同时触发配置更改。
VIP-swap本身只是Load Balancer的重新配置。
编辑:这是我从不同的应用程序中按摩的一些代码(我实际上使用这种逻辑来区分多租户应用程序中的租户,但原理是相同的。)public class DeploymentContextModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += OnBegin;
}
void OnBegin(object sender, EventArgs e)
{
var app = sender as HttpApplication;
if (app != null)
{
var ctx = app.Context;
if (ctx != null)
{
var req = ctx.Request;
if (req != null)
{
var url = req.Url;
var hostName = url.Host;
if (!string.IsNullOrEmpty(hostName))
{
ctx.Items["DeploymentContext"] =
DeploymentContext.Find(hostName);
}
}
}
}
}
}
请注意,您需要提供DeploymentContext.Find(hostname)
的实现,以将主机名映射到一些有用的数据。对于生产槽,主机名将与您的云服务相关联。对于暂存插槽,它将是一个guid(没有连字符)。
将其配置为web.config,如下所示:
<modules runAllManagedModulesForAllRequests="true">
<add name="DeploymentContextModule"
type="MyNamespace.DeploymentContextModule, MyNamespace"
preCondition="managedHandler" />
</modules>
在整个应用中,您可以使用httpContext.Items["DeploymentContext"]
来识别部署位置,并相应地阅读正确的配置设置。
答案 3 :(得分:0)
可能值得一看CloudConfigurationManager类,它查看csfg配置设置或web.config。这样您就可以在ServiceConfiguration.Cloud.cscfg文件中定义设置,并在交换VIP之前从Azure门户编辑它们。
http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.cloudconfigurationmanager.aspx