在 Azure 上给我的博客配置负载均衡

点击上方蓝字关注“汪宇杰博客”

在 Azure 上给我的博客配置负载均衡

导语

前阵有美国读者嘲讽我的博客在美国地区页面加载速度太慢,还好意思写性能优化的文章。为了让美国朋友们闭嘴,并不给中国人丢脸,我使用了钞能力,在 Azure 国际版上给我的博客部署了一个美国地区的 App Service,从此中国香港一个区,美国西部一个区,双倍金钱,双倍快乐。那么 Azure 上如何配置负载均衡以让美国的用户访问美区服务器,让中国用户访问中国香港服务器呢?

添加服务器识别信息

由于部署到美区和中国香港的代码是同一套,网页是一模一样的,所以无法从网页显示上判断当前访问的服务器到底是哪个区的。为了方便调试及展示实现效果,我给博客增加了环境标签功能,用于部署的时候打上服务器地区标签,并通过访问 /ping 终端获取当前服务器地区信息。

public static IEnumerable<string> GetEnvironmentTags()

{

    var tagsEnv = Environment.GetEnvironmentVariable("MOONGLADE_TAGS");

    if (string.IsNullOrWhiteSpace(tagsEnv))

    {

        yield return string.Empty;

        yield break;

    }

    var tagRegex = new Regex(@"^[a-zA-Z0-9-#@$()\[\]/]+$");

    var tags = tagsEnv.Split(',');

    foreach (string tag in tags)

    {

        var t = tag.Trim();

        if (tagRegex.IsMatch(t))

        {

            yield return t;

        }

    }

}

endpoints.MapGet("/ping", async context =>

{

    context.Response.Headers.Add("X-Moonglade-Version", Utils.AppVersion);

    var obj = new

    {

        MoongladeVersion = Utils.AppVersion,

        DotNetVersion = Environment.Version.ToString(),

        EnvironmentTags = Utils.GetEnvironmentTags()

    };

    var json = System.Text.Json.JsonSerializer.Serialize(obj);

    await context.Response.WriteAsync(json, Encoding.UTF8);

});

在 Azure DevOps 里部署 East Asia 以及 West US 服务器的时候,可以分别设置环境名称的Tag。

在 Azure 上给我的博客配置负载均衡

在 Azure 上给我的博客配置负载均衡

现在即可通过 /ping 获得服务器tag信息,以便后续验负载均衡配置。

在 Azure 上给我的博客配置负载均衡

配置 Azure Front Door

本文不再赘述如何创建 Azure Front Door,可参考之前的文章:

在 Front Door designer 中点击进入原有的 Backend pool。

在 Azure 上给我的博客配置负载均衡

添加美区的 App Service 服务器。

在 Azure 上给我的博客配置负载均衡

注意,这时候 Health Probes 必须开启,不然 Front Door 无法获得服务器是否可用,以及网络延迟等信息,无法做负载均衡。

此处,我将健康检查路径设定为 /ping。

在 Azure 上给我的博客配置负载均衡

我的博客网站是有状态的,例如读者发表评论的时候,需要做CSRF验证,在配置了负载均衡的情况下,有可能用户第一个请求走向服务器A,第二个请求走向服务器B,这样就会导致第二个请求不合法,从而博客功能无法正常工作。

解决这个问题的办法是配置 Session Affinity,Front Door会生成一个 cookie 用于标识用户,让用户的后续请求保持定向到同一台服务器。

还是在 Font Door designer 中,点击网站的域名。

在 Azure 上给我的博客配置负载均衡

在属性页面最下方,打开 Session Affinity

在 Azure 上给我的博客配置负载均衡

现在访问网站就会被写入 ASLBSA, ASLBSACORS 两个 Cookie,证明配置成功。

在 Azure 上给我的博客配置负载均衡

配置 App Service

经实际测试,只在 Front Door 上打开 Session Affinity 偶尔还是会发生意外导流,我们还需要在 App Service 上打开 ARR affinity。

ARR affinity 使用的是 IIS 的 Application Request Routing 模块(别惊讶,不论你的服务器是Linux还是Windows,App Service最外层的壳还是IIS),它的原理也是安插一个 Cookie 到客户端用于标识用户,让该用户的后续请求不会切换到其他服务器上。

在 East Asia 和 West US 的 App Service 的 Configuration 页面中都打开 ARR affinity。

在 Azure 上给我的博客配置负载均衡

现在访问网站,应该可以看到 ARRAffinity, ARRAffinitySameSite 两个 Cookie,证明配置成功。

在 Azure 上给我的博客配置负载均衡

验证负载均衡

现在,在中国地区访问我的博客,Azure Front Door 会将流量导向 East Asia 服务器。

在 Azure 上给我的博客配置负载均衡

而在美国访问同样的域名,Azure Front Door 会选择距离用户最近的 West US 服务器。

在 Azure 上给我的博客配置负载均衡

哎,有钱人的云,就是这么简单粗暴,且高效。

在 Azure 上给我的博客配置负载均衡

汪宇杰博客

Azure | .NET | 微软 MVP

无广告,不卖课,做纯粹的技术公众号

喜欢本篇内容请点个在看

在 Azure 上给我的博客配置负载均衡