4

将新部署发布到云服务的暂存或生产环境很容易,但我想更频繁地使用 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 时,web.config 会使用基于 Debug 或 Release 的正确值进行转换。但是当涉及到 Windows Azure 门户上的 VIP 交换时,我必须触发交换,然后远程进入每个实例并手动更改这些值(这绝对不是正确的方法)。

可以做些什么来更好地处理这种情况?还是有比将它们放在 web.config 中更好、更灵活的解决方案来处理这些自定义配置值(尤其是在这种情况下)?

提前致谢。

4

4 回答 4

5

使用 VIP 交换被认为是在 web 和 worker 角色中升级到生产的“标准”方式。它通过更改 Azure 路由以将“生产”URL 指向“暂存”角色实例并将“暂存”URL 指向“生产”角色实例来实现此交换。

在内部,角色并没有意识到这种变化:它完全发生在托管进程的外部。

如果您想以这种方式使用 VIP 交换,您应该考虑将您的应用程序更改为不知道其主机环境,或者当它需要知道它时从其主机读取信息。


在 Azure 中安排生产和暂存的方式,包都应该是相同的:都是实时配置。该功能旨在用于高可用性部署;它不适合通过让角色调用不同的服务来暗示的那种测试,这取决于它是否是临时部署。

您最好使用单独的角色来执行测试;staging 应该仅用于在您使用当前生产部署进行切换之前测试您的部署是否成功。

于 2013-08-02T11:35:34.747 回答
2

VIP交换顾名思义就是虚拟IP交换。所以我认为这很简单,将 DNS 指针更改为机器 IP,所以我认为不会发生任何配置转换。暂存部署应该在任何意义上都与生产部署相匹配。

如果您想针对不同的配置测试部署,那么最好在 Azure 中创建一个新服务并使用阶段配置在那里部署您的解决方案。一旦满意,请在生产阶段插槽中进行新部署。快速吸烟并进行交换。

于 2013-08-01T14:46:39.663 回答
1

您可以考虑几种方法。

对于 Web 角色,您可以通过检查传入请求 URL 中的主机名来区分暂存和生产。通过从主机名识别上下文,您可以使用不同的配置值。因此,您的 web.config 中有两个连接字符串,并且您可以根据主机名更改代码以使用适当的连接字符串。

或者,与其通过门户进行 VIP 交换,不如编写一个工具(例如 Powershell Cmdlet)来执行此操作,并在执行实际交换的同时触发配置更改。

VIP 交换本身只是负载均衡器的重新配置。

编辑:这是我从另一个应用程序中按摩的一些代码(我实际上使用此逻辑来区分多租户应用程序中的租户,但原理是相同的)。

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"]来识别您的部署槽并相应地读取正确的配置设置。

于 2013-08-02T10:52:30.243 回答
1

可能值得一看 CloudConfigurationManager 类,它查看 csfg 配置设置或 web.config。这将允许您在 ServiceConfiguration.Cloud.cscfg 文件中定义您的设置,并在交换 VIP 之前从 Azure 门户编辑它们。

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.cloudconfigurationmanager.aspx

于 2013-08-28T15:24:49.457 回答