找回密码
 立即注册
首页 业界区 业界 一篇基于AWS服务搭建的全球服务架构

一篇基于AWS服务搭建的全球服务架构

酝垓 昨天 21:00
一、背景
  当我们在做全球业务时,例如网站/机器/游戏,为了支撑全球用户,我们会在不同的位置搭建节点,以满足业务功能和响应实效。
我们会搭建一个这样的架构满足初步的使用。
1.png

   
  能用是ok的了,会有什么问题呢?
  1、因为服务独立,上架1个SKU需要多次发布到不同的服务。
  2、因为域名过多,发布时需要频繁的退出、登录切换不同的二级域名,非常繁琐不说,还可能会遗漏。
  3、后期处理数据统计、报表、看板、设备地图,耗时费力。
  4、这还是单节点,未考虑高可用的情况下,多区域、多节点部署服务器导致运维难度增加、过多的财务开支。
  5、各个节点各玩各的。   有什么方式可以解决这些问题?  AWS服务组件很好支持。 二、AWS架构  AWS提供了非常丰富的组件,列几个常用的:  1、Route 53 负责域名解析流量管理健康检查,高可用可以用到它。  2、VPC 虚拟私有网络,可将同一区域的服务器、数据库置于同一内网段,提升访问速度。  3、CloudFront CDN加速,可以给访问请求、对象存储加速。函数功能极其强大,可配置HTTP、HTTPS的请求跨域,可识别全球流量来源,根据来源分发到不同区域的节点。  4、EC2 服务器,内含了负载均衡器ELB、目标组,可实现同一地区的服务器的负载均衡和高可用。结合CloudFront可将流量分发到就近的服务。  5、Aurora and RDS 数据库,Aurora 作为全球数据库,已实现主从备份,可在1s内实现全球数据同步,结合Route 53的短域名实现读写分离。  6、S3 对象存储,OSS存储图片、视频、文档、音频等。  7、Certificate Manager 安全凭证管理,可申请和管理证书。   架构完是这样的。  
2.png

 
三、干活,简单的一笔带过
  1、将外部域名解析到Route 53。
  2、在Certificate Manager申请证书。
  3、在拟定的区域创建VPC内网。
  4、购买服务器和数据库时选择上面的创建的VPC内网。
  5、在创建Aurora数据库时需要选确认某一个区域为主集群,主集群下会创建写入器实例、读取器实例。
    再创建其它区域的读取实例,如下图:
3.png

   
  6、在Route 53创建一个私有的短域名,用于数据库连接,无需在域名供应商购买。我这里用 db.com
4.png

  
  7、将二级域名指向到Aurora的写域名指向到Aurora的写入器实例的DNS(路由策略:简单),
    读域名指向到多个读取器实例的DNS(路由策略:延迟)。数据写入到主库后,1s内可同步到所有的从库
5.png

   
  8、在EC2购买服务器后,新建目标组,将服务器添加到目标组中
6.png

   
  9、在EC2创建负载均衡器,这里分NLB(服务器之间用)和ELB(服务器内部服务之间用),层级和颗粒度不同。
    这里创建NLB,添加转发到的目标组到侦听器,注意选择VPC。创建完即可通过DNS访问。
7.png

   
  10、创建CloudFront,将需要经过CDN加速的域名添加到备用域名,添加第2步创建的证书,源添加到访问目标的DNS。成功后CloudFront会分配域名。
8.png

 
  11、在Route 53将经过CloudFront加速的域名指向到CloudFront分配域名上。
9.png

 
  12、在Route 53创建NLB的健康检查,成功后生成ID。
  13、在Route 53添加故障转移域名,用于服务区域之间的高可用,无需额外采购服务器
10.png

 
  14、在CloudFront创建函数,将请求按照国家和地区分发到相应的服务器。
11.png

   代码如下:
  1. import cf from 'cloudfront';
  2. function handler(event) {
  3.     const request = event.request;
  4.     const headers = request.headers;
  5.     const country = headers['cloudfront-viewer-country'] && headers['cloudfront-viewer-country'].value;
  6.     // List of countries to ALB endpoints
  7.     const countryToContinent = {
  8.         // 亚太地区 (Asia-Pacific) -> Asia
  9.         'AF': 'Asia',
  10.         'AM': 'Asia',
  11.         'AZ': 'Asia',
  12.         'BD': 'Asia',
  13.         'BN': 'Asia',
  14.         'BT': 'Asia',
  15.         'CC': 'Asia',
  16.         'CK': 'Asia',
  17.         'CX': 'Asia',
  18.         'GE': 'Asia',
  19.         'HK': 'Asia',
  20.         'ID': 'Asia',
  21.         'IN': 'Asia',
  22.         'IO': 'Asia',
  23.         'JP': 'Asia',
  24.         'KG': 'Asia',
  25.         'KH': 'Asia',
  26.         'KR': 'Asia',
  27.         'KZ': 'Asia',
  28.         'LA': 'Asia',
  29.         'LK': 'Asia',
  30.         'MM': 'Asia',
  31.         'MN': 'Asia',
  32.         'MO': 'Asia',
  33.         'MP': 'Asia',
  34.         'MV': 'Asia',
  35.         'MY': 'Asia',
  36.         'NC': 'Asia',
  37.         'NF': 'Asia',
  38.         'NP': 'Asia',
  39.         'NR': 'Asia',
  40.         'NU': 'Asia',
  41.         'NZ': 'Asia',
  42.         'PH': 'Asia',
  43.         'PK': 'Asia',
  44.         'PN': 'Asia',
  45.         'SB': 'Asia',
  46.         'SG': 'Asia',
  47.         'TH': 'Asia',
  48.         'TJ': 'Asia',
  49.         'TL': 'Asia',
  50.         'TM': 'Asia',
  51.         'TO': 'Asia',
  52.         'TV': 'Asia',
  53.         'TW': 'Asia',
  54.         'UZ': 'Asia',
  55.         'VU': 'Asia',
  56.         'WF': 'Asia',
  57.         'WS': 'Asia',
  58.         'YE': 'Asia',
  59.         // 大洋洲 (Oceania) - 通常归类为亚太地区
  60.         'AS': 'Asia',
  61.         'AU': 'Asia',
  62.         'FJ': 'Asia',
  63.         'PF': 'Asia',
  64.         'GU': 'Asia',
  65.         'KI': 'Asia',
  66.         'MH': 'Asia',
  67.         'FM': 'Asia',
  68.         'PW': 'Asia',
  69.         'PG': 'Asia',
  70.         'TK': 'Asia',
  71.         // 南极洲 (Antarctica) - 通常单独处理,这里暂时归入亚太
  72.         'AQ': 'Asia',
  73.         'BV': 'Asia',
  74.         'GS': 'Asia',
  75.         'HM': 'Asia',
  76.         'TF': 'Asia',
  77.         // 欧洲、非洲、中东 -> Europe
  78.         'AL': 'Europe',
  79.         'AD': 'Europe',
  80.         'AT': 'Europe',
  81.         'AX': 'Europe',
  82.         'BA': 'Europe',
  83.         'BE': 'Europe',
  84.         'BG': 'Europe',
  85.         'BY': 'Europe',
  86.         'CH': 'Europe',
  87.         'CY': 'Europe',
  88.         'CZ': 'Europe',
  89.         'DE': 'Europe',
  90.         'DK': 'Europe',
  91.         'EE': 'Europe',
  92.         'ES': 'Europe',
  93.         'FI': 'Europe',
  94.         'FO': 'Europe',
  95.         'FR': 'Europe',
  96.         'GG': 'Europe',
  97.         'GI': 'Europe',
  98.         'GR': 'Europe',
  99.         'HR': 'Europe',
  100.         'HU': 'Europe',
  101.         'IE': 'Europe',
  102.         'IM': 'Europe',
  103.         'IS': 'Europe',
  104.         'IT': 'Europe',
  105.         'JE': 'Europe',
  106.         'LI': 'Europe',
  107.         'LT': 'Europe',
  108.         'LU': 'Europe',
  109.         'LV': 'Europe',
  110.         'MC': 'Europe',
  111.         'MD': 'Europe',
  112.         'ME': 'Europe',
  113.         'MK': 'Europe',
  114.         'MT': 'Europe',
  115.         'NL': 'Europe',
  116.         'NO': 'Europe',
  117.         'PL': 'Europe',
  118.         'PT': 'Europe',
  119.         'RO': 'Europe',
  120.         'RS': 'Europe',
  121.         'RU': 'Europe',
  122.         'SE': 'Europe',
  123.         'SI': 'Europe',
  124.         'SJ': 'Europe',
  125.         'SK': 'Europe',
  126.         'SM': 'Europe',
  127.         'UA': 'Europe',
  128.         'VA': 'Europe',
  129.         'GB': 'Europe',
  130.         'DZ': 'Europe',
  131.         'AO': 'Europe',
  132.         'BJ': 'Europe',
  133.         'BW': 'Europe',
  134.         'BF': 'Europe',
  135.         'BI': 'Europe',
  136.         'CV': 'Europe',
  137.         'CM': 'Europe',
  138.         'CF': 'Europe',
  139.         'TD': 'Europe',
  140.         'KM': 'Europe',
  141.         'CG': 'Europe',
  142.         'CD': 'Europe',
  143.         'CI': 'Europe',
  144.         'DJ': 'Europe',
  145.         'EG': 'Europe',
  146.         'GQ': 'Europe',
  147.         'ER': 'Europe',
  148.         'ET': 'Europe',
  149.         'GA': 'Europe',
  150.         'GM': 'Europe',
  151.         'GH': 'Europe',
  152.         'GN': 'Europe',
  153.         'GW': 'Europe',
  154.         'KE': 'Europe',
  155.         'LS': 'Europe',
  156.         'LR': 'Europe',
  157.         'LY': 'Europe',
  158.         'MG': 'Europe',
  159.         'MW': 'Europe',
  160.         'ML': 'Europe',
  161.         'MR': 'Europe',
  162.         'MU': 'Europe',
  163.         'YT': 'Europe',
  164.         'MA': 'Europe',
  165.         'MZ': 'Europe',
  166.         'NA': 'Europe',
  167.         'NE': 'Europe',
  168.         'NG': 'Europe',
  169.         'RW': 'Europe',
  170.         'RE': 'Europe',
  171.         'SH': 'Europe',
  172.         'SN': 'Europe',
  173.         'SC': 'Europe',
  174.         'SL': 'Europe',
  175.         'SO': 'Europe',
  176.         'ZA': 'Europe',
  177.         'SS': 'Europe',
  178.         'SD': 'Europe',
  179.         'ST': 'Europe',
  180.         'SZ': 'Europe',
  181.         'TG': 'Europe',
  182.         'TN': 'Europe',
  183.         'TZ': 'Europe',
  184.         'UG': 'Europe',
  185.         'EH': 'Europe',
  186.         'ZM': 'Europe',
  187.         'ZW': 'Europe',
  188.         'AE': 'Europe',
  189.         'BH': 'Europe',
  190.         'IR': 'Europe',
  191.         'IQ': 'Europe',
  192.         'IL': 'Europe',
  193.         'JO': 'Europe',
  194.         'KW': 'Europe',
  195.         'LB': 'Europe',
  196.         'OM': 'Europe',
  197.         'PS': 'Europe',
  198.         'QA': 'Europe',
  199.         'SA': 'Europe',
  200.         'SY': 'Europe',
  201.         'TR': 'Europe',
  202.         // 美洲 -> America
  203.         'AI': 'America',
  204.         'AG': 'America',
  205.         'AW': 'America',
  206.         'BS': 'America',
  207.         'BB': 'America',
  208.         'BZ': 'America',
  209.         'BM': 'America',
  210.         'BQ': 'America',
  211.         'CA': 'America',
  212.         'KY': 'America',
  213.         'CR': 'America',
  214.         'CU': 'America',
  215.         'CW': 'America',
  216.         'DM': 'America',
  217.         'DO': 'America',
  218.         'SV': 'America',
  219.         'GD': 'America',
  220.         'GL': 'America',
  221.         'GP': 'America',
  222.         'GT': 'America',
  223.         'HT': 'America',
  224.         'HN': 'America',
  225.         'JM': 'America',
  226.         'MQ': 'America',
  227.         'MX': 'America',
  228.         'MS': 'America',
  229.         'NI': 'America',
  230.         'PA': 'America',
  231.         'PR': 'America',
  232.         'BL': 'America',
  233.         'KN': 'America',
  234.         'LC': 'America',
  235.         'MF': 'America',
  236.         'PM': 'America',
  237.         'VC': 'America',
  238.         'SX': 'America',
  239.         'TT': 'America',
  240.         'TC': 'America',
  241.         'US': 'America',
  242.         'UM': 'America',
  243.         'UY': 'America',
  244.         'VE': 'America',
  245.         'VG': 'America',
  246.         'VI': 'America'
  247.     };
  248.     const continentToRegion = {
  249.         'Asia': 'asia.autovxxxxxx.com',         // 亚洲故障转移域名
  250.         'Europe': 'europu.autovxxxxxx.com',     // 欧洲故障转移域名
  251.         'America': 'america.autovxxxxxxx.com'    // 美洲故障转移域名
  252.     };
  253.     const DEFAULT_REGION = 'NLB-Asia-Singapore-5e42xxxxxxxx4853.elb.ap-southeast-1.amazonaws.com'; //改为自己的默认alb 域名
  254.     const targetContinent = (country && countryToContinent[country]) || 'Asia';
  255.     // const targetContinent = 'Asia';
  256.     const targetOrigin = (targetContinent && continentToRegion[targetContinent]) || DEFAULT_REGION;
  257.     // 打印所有请求头
  258.     console.log("=== 所有请求头信息 ===");
  259.     for (var headerName in headers) {
  260.         if (headers.hasOwnProperty(headerName)) {
  261.             // headers 对象的值是一个包含 'value' 属性的对象
  262.             var headerValue = headers[headerName].value;
  263.             console.log(headerName + ": " + headerValue);
  264.         }
  265.     }
  266.     console.log('targetOrigin: ' + targetOrigin);
  267.     // 使用CloudFront 2.0 API修改origin
  268.     cf.updateRequestOrigin({
  269.         "domainName": targetOrigin,
  270.         "port": 80,
  271.         "protocol": 'http',
  272.         "timeouts": {
  273.             "readTimeout": 30,
  274.             "connectionTimeout": 5
  275.         }
  276.     });
  277.    
  278.     // 添加调试信息 - 确保值是字符串
  279.     request.headers['x-debug-country'] = { value: String(country || 'unknown') };
  280.     request.headers['x-debug-targetorigin'] = { value: String(targetOrigin) };
  281.     return request;
  282. }
复制代码
  解决跨域问题,函数代码如下:
  1. function handler(event)  {
  2.     var response  = event.response;
  3.     var headers  = response.headers;
  4.     // If Access-Control-Allow-Origin CORS header is missing, add it.
  5.     // Since JavaScript doesn't allow for hyphens in variable names, we use the dict["key"] notation.
  6.     if (!headers['access-control-allow-origin']) {
  7.         headers['access-control-allow-origin'] = {value: "*"};
  8.         console.log("Access-Control-Allow-Origin was missing, adding it now.");
  9.         headers['access-control-allow-headers'] = {value: "Origin, X-Requested-With, Content-Type, Accept"};
  10.         headers['access-control-allow-methods'] = {value: "GET,POST,PUT, OPTIONS"};
  11.     }
  12.     return response;
  13. }
复制代码
  
  ok,完事儿
  
 
       
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册