在 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。

现在即可通过 /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

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

喜欢本篇内容请点个在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

543. 二叉树的直径(详解)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C#实现乞丐版IOC容器

一、前言netcore中的容器非常好用&#xff0c;今天我们自己来简单实现一个。实现容器的核心接口有两个&#xff1a;IServiceCollection、IServiceProvider。其中IServiceCollection定义容器集合&#xff0c;IServiceProvider提供容器中对象的访问。话不多说&#xff0c;直接编码…

leetcode hot100.2. 两数相加(详解)

一:题目 二:上码 // /** // * Definition for singly-linked list. // * public class ListNode { // * int val; // * ListNode next; // * ListNode() {} // * ListNode(int val) { this.val val; } // * ListNode(int val, ListNode next) { t…

COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)

中国开源年会 COSCon20&#xff0c;本周末你准备好了吗业界最具影响力的开源年度盛会2020中国开源年会 (COSCon20) 将于 10月24-25日由开源社举办。本次大会较往年出现了许多新变化&#xff0c;您可能有许多问题&#xff0c;为了让大家尽快参与其中&#xff0c;小编在这里为大家…

leetcode647. 回文子串(动态规划)

一:题目 二:上码 class Solution {/**思路:1.确定dp数组dp[i][j]:表示的是区间范围内[i,j]的字符串是否是回文串 2.确定dp数组递推公式1>:如果s[i] ! s[j] 那就是false2>:如果s[i] s[j] 如果 i - j < 1 那么的话 dp[i][j] 就为true如果 i - j > 1 的话 那就要看…

搬砖的八种境界

这一点文字&#xff0c;纯属有感而发。世上的道路千万条&#xff0c;搬砖的队伍更是前仆后继&#xff0c;延绵不绝。我总结有八种境界&#xff0c;请各位看官对号入座&#xff0c;不要客气。不知道怎么搬砖。职业早期&#xff0c;无可厚非。但如果长期处于这个阶段&#xff0c;…

芯片项目谁支持谁负责 重大损失将予以通报

随着全国掀起半导体热&#xff0c;全国各地都在大力投资&#xff0c;其中不乏浑水摸鱼的存在&#xff0c;在江苏、四川、湖北、贵州已经有多个半导体大项目先后停摆。在南京&#xff0c;号称投资30亿美元的德科码已经烂尾。在淮安&#xff0c;规划总投资450亿元的德淮半导体烂尾…

leetcode5. 最长回文子串

一:题目 二:上码 class Solution {/**思路:1.确定dp数组2.确定dp数组的递推公式s[i] ! s[j] 那么dp[i][j] 肯定为falses[i] s[j] 那么的话 i - j < 1 为true ans max(ans,i-j 1);i - j > 1的话 那么dp[i1][j-1] true的话那么dp[i][j] trueans max(ans,i-j1);3.确定…

leetcode11. 盛最多水的容器

一:题目 二:上码 // class Solution { // public int maxArea(int[] height) { // int len height.length; // int ans 0;// for (int i 0; i < len; i) { // for (int j len - 1; j > i; j--) {// int x …

技术债! 怎样简洁高效的实现多个 Enum 自由转换

一&#xff1a;背景 1. 讲故事前段时间和同事负责一个项目的两个业务模块&#xff0c;可能大家缺少沟通&#xff0c;导致本该定义一个 Enum 的地方结果我俩各自定义了一个&#xff0c;导致后面这两个 Enum 进行对接就烦了&#xff0c;为了方便理解&#xff0c;也不想让大家看这…

分享套接字数据包序列化与反序列化方法

分享套接字数据包序列化与反序列化方法“简单说一下&#xff0c;本文不涉及Socket的连接、数据接收&#xff0c;只是对数据包(byte[])的序列化和反序列化方法的封装介绍。本文目录本文背景一般操作本文操作总结1.本文背景经常做C/S&#xff0c;客户端与服务端通信基本是TCP/UDP…

leetcode22. 括号生成(回溯)

一:题目 二:上码 class Solution {public List<String> generateParenthesis(int n) {List<String> ans new ArrayList<>();def(ans,new StringBuilder(),n,n);return ans;}/**left:左边还可以用的括号数量right:右边还可以用的括号数量*/public void def(…

leetcode31. 下一个排列

一:题目 二:上码 class Solution {/**规律: 从后往前找到那个比其小的数进行交换 然后 在小的数后面的数都进行排序12345 --> 1235412354 --> 12453 --> 12435*/public void nextPermutation(int[] nums) {int len nums.length;for (int i len - 1; i > 0; i--)…

回顾 | 进击吧! Blazor !第三期 信息交互

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

回顾 | 进击吧! Blazor !第四期 组件开发

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

面试官:请问一条select的语句的执行会发生什么?

文章目录前言:一:执行一条select的概览二:具体流程1:连接器(1):步骤(2):浅浅来一下细节2:查询缓存(1):mysql5.8之前的幸福时光(2):mysql5.8之后的悲惨结果3:解析器(解析sql)(1):词法解析(2):语法解析4.执行sql(1):预处理阶段(2):优化阶段(3):执行器(1):概述(2):三种方式a:主键索…

跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

前言MVC过滤器在之前Asp.Net的时候就已经广泛使用啦&#xff0c;不管是面试还是工作&#xff0c;总有一个考点或是需求涉及到&#xff0c;可以毫不疑问的说&#xff0c;这个技术点是非常重要的&#xff1b; 在之前参与的面试中&#xff0c;得知很多小伙伴只知道有一两个过滤器&…

彭博社:中企游说政府否决英伟达收购Arm

9月14日&#xff0c;英伟达与软银宣布达成最终协议&#xff0c;英伟达将以400亿美元的价格从软银收购ARM。在台积电明确于9月15日后不再向HW的ARM提供代工服务之后&#xff0c;一家美国公司又将ARM收入囊中&#xff0c;这使国产ARM CPU在设计和制造环节都存在巨大风险&#xff…

Explain各个字段的含义

文章目录[TOC]1:expanin的结果示例2:各个字段的含义(1):id(2):select_type(3):table(4):type&#xff08;重要 我们利用索引查找出来的记录显示&#xff09;(5): possible_keys(6):key(7):key_len(8):ref(8):rows(重要)(9):extra1:expanin的结果示例 mysql> explain select…