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

10/24 12:48
阅读数 17

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

导语

前阵有美国读者嘲讽我的博客在美国地区页面加载速度太慢,还好意思写性能优化的文章。为了让美国朋友们闭嘴,并不给中国人丢脸,我使用了钞能力,在 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。

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

配置 Azure Front Door

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

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

添加美区的 App Service 服务器。

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

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

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

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

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

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

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

配置 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。

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

验证负载均衡

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

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

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

汪宇杰博客

Azure | .NET | 微软 MVP

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

喜欢本篇内容请点个在看

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部