当前位置: 首页 > news >正文

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

一、背景

  当我们在做全球业务时,例如网站/机器/游戏,为了支撑全球用户,我们会在不同的位置搭建节点,以满足业务功能和响应实效。

我们会搭建一个这样的架构满足初步的使用。

image

   

  能用是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 安全凭证管理,可申请和管理证书。
 
  架构完是这样的。 
 

image

 

三、干活,简单的一笔带过

  1、将外部域名解析到Route 53。

  2、在Certificate Manager申请证书。

  3、在拟定的区域创建VPC内网。

  4、购买服务器和数据库时选择上面的创建的VPC内网。

  5、在创建Aurora数据库时需要选确认某一个区域为主集群,主集群下会创建写入器实例、读取器实例。

    再创建其它区域的读取实例,如下图:

f9edbdf666a249221b20525d951cdf3b

   

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

402ddedc223507ba4f2e187ad161cc2c

  

  7、将二级域名指向到Aurora的写域名指向到Aurora的写入器实例的DNS(路由策略:简单),

    读域名指向到多个读取器实例的DNS(路由策略:延迟)。数据写入到主库后,1s内可同步到所有的从库

fe4075fd22ed2a0e1e2919b9d2e47b5b

   

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

b9e98fda4ad55cabc5a3bd5d55ff112f

   

  9、在EC2创建负载均衡器,这里分NLB(服务器之间用)和ELB(服务器内部服务之间用),层级和颗粒度不同。

    这里创建NLB,添加转发到的目标组到侦听器,注意选择VPC。创建完即可通过DNS访问。

5baa9287044b30796f6ebb020436d6f6

   

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

aeaa7964-4abc-47f7-965c-b70c4dee3682

 

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

image

 

  12、在Route 53创建NLB的健康检查,成功后生成ID。

  13、在Route 53添加故障转移域名,用于服务区域之间的高可用,无需额外采购服务器

98eb6d3e-2d4c-4a8f-97f9-6261ccbfc409

 

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

5b4907ff50b14eae080e4168c566cd54

   代码如下:

import cf from 'cloudfront';function handler(event) {const request = event.request;const headers = request.headers;const country = headers['cloudfront-viewer-country'] && headers['cloudfront-viewer-country'].value;// List of countries to ALB endpointsconst countryToContinent = {// 亚太地区 (Asia-Pacific) -> Asia'AF': 'Asia','AM': 'Asia','AZ': 'Asia','BD': 'Asia','BN': 'Asia','BT': 'Asia','CC': 'Asia','CK': 'Asia','CX': 'Asia','GE': 'Asia','HK': 'Asia','ID': 'Asia','IN': 'Asia','IO': 'Asia','JP': 'Asia','KG': 'Asia','KH': 'Asia','KR': 'Asia','KZ': 'Asia','LA': 'Asia','LK': 'Asia','MM': 'Asia','MN': 'Asia','MO': 'Asia','MP': 'Asia','MV': 'Asia','MY': 'Asia','NC': 'Asia','NF': 'Asia','NP': 'Asia','NR': 'Asia','NU': 'Asia','NZ': 'Asia','PH': 'Asia','PK': 'Asia','PN': 'Asia','SB': 'Asia','SG': 'Asia','TH': 'Asia','TJ': 'Asia','TL': 'Asia','TM': 'Asia','TO': 'Asia','TV': 'Asia','TW': 'Asia','UZ': 'Asia','VU': 'Asia','WF': 'Asia','WS': 'Asia','YE': 'Asia',// 大洋洲 (Oceania) - 通常归类为亚太地区'AS': 'Asia','AU': 'Asia','FJ': 'Asia','PF': 'Asia','GU': 'Asia','KI': 'Asia','MH': 'Asia','FM': 'Asia','PW': 'Asia','PG': 'Asia','TK': 'Asia',// 南极洲 (Antarctica) - 通常单独处理,这里暂时归入亚太'AQ': 'Asia','BV': 'Asia','GS': 'Asia','HM': 'Asia','TF': 'Asia',// 欧洲、非洲、中东 -> Europe'AL': 'Europe','AD': 'Europe','AT': 'Europe','AX': 'Europe','BA': 'Europe','BE': 'Europe','BG': 'Europe','BY': 'Europe','CH': 'Europe','CY': 'Europe','CZ': 'Europe','DE': 'Europe','DK': 'Europe','EE': 'Europe','ES': 'Europe','FI': 'Europe','FO': 'Europe','FR': 'Europe','GG': 'Europe','GI': 'Europe','GR': 'Europe','HR': 'Europe','HU': 'Europe','IE': 'Europe','IM': 'Europe','IS': 'Europe','IT': 'Europe','JE': 'Europe','LI': 'Europe','LT': 'Europe','LU': 'Europe','LV': 'Europe','MC': 'Europe','MD': 'Europe','ME': 'Europe','MK': 'Europe','MT': 'Europe','NL': 'Europe','NO': 'Europe','PL': 'Europe','PT': 'Europe','RO': 'Europe','RS': 'Europe','RU': 'Europe','SE': 'Europe','SI': 'Europe','SJ': 'Europe','SK': 'Europe','SM': 'Europe','UA': 'Europe','VA': 'Europe','GB': 'Europe','DZ': 'Europe','AO': 'Europe','BJ': 'Europe','BW': 'Europe','BF': 'Europe','BI': 'Europe','CV': 'Europe','CM': 'Europe','CF': 'Europe','TD': 'Europe','KM': 'Europe','CG': 'Europe','CD': 'Europe','CI': 'Europe','DJ': 'Europe','EG': 'Europe','GQ': 'Europe','ER': 'Europe','ET': 'Europe','GA': 'Europe','GM': 'Europe','GH': 'Europe','GN': 'Europe','GW': 'Europe','KE': 'Europe','LS': 'Europe','LR': 'Europe','LY': 'Europe','MG': 'Europe','MW': 'Europe','ML': 'Europe','MR': 'Europe','MU': 'Europe','YT': 'Europe','MA': 'Europe','MZ': 'Europe','NA': 'Europe','NE': 'Europe','NG': 'Europe','RW': 'Europe','RE': 'Europe','SH': 'Europe','SN': 'Europe','SC': 'Europe','SL': 'Europe','SO': 'Europe','ZA': 'Europe','SS': 'Europe','SD': 'Europe','ST': 'Europe','SZ': 'Europe','TG': 'Europe','TN': 'Europe','TZ': 'Europe','UG': 'Europe','EH': 'Europe','ZM': 'Europe','ZW': 'Europe','AE': 'Europe','BH': 'Europe','IR': 'Europe','IQ': 'Europe','IL': 'Europe','JO': 'Europe','KW': 'Europe','LB': 'Europe','OM': 'Europe','PS': 'Europe','QA': 'Europe','SA': 'Europe','SY': 'Europe','TR': 'Europe',// 美洲 -> America'AI': 'America','AG': 'America','AW': 'America','BS': 'America','BB': 'America','BZ': 'America','BM': 'America','BQ': 'America','CA': 'America','KY': 'America','CR': 'America','CU': 'America','CW': 'America','DM': 'America','DO': 'America','SV': 'America','GD': 'America','GL': 'America','GP': 'America','GT': 'America','HT': 'America','HN': 'America','JM': 'America','MQ': 'America','MX': 'America','MS': 'America','NI': 'America','PA': 'America','PR': 'America','BL': 'America','KN': 'America','LC': 'America','MF': 'America','PM': 'America','VC': 'America','SX': 'America','TT': 'America','TC': 'America','US': 'America','UM': 'America','UY': 'America','VE': 'America','VG': 'America','VI': 'America'};const continentToRegion = {'Asia': 'asia.autovxxxxxx.com',         // 亚洲故障转移域名'Europe': 'europu.autovxxxxxx.com',     // 欧洲故障转移域名'America': 'america.autovxxxxxxx.com'    // 美洲故障转移域名
    };const DEFAULT_REGION = 'NLB-Asia-Singapore-5e42xxxxxxxx4853.elb.ap-southeast-1.amazonaws.com'; //改为自己的默认alb 域名const targetContinent = (country && countryToContinent[country]) || 'Asia';// const targetContinent = 'Asia';const targetOrigin = (targetContinent && continentToRegion[targetContinent]) || DEFAULT_REGION;// 打印所有请求头console.log("=== 所有请求头信息 ===");for (var headerName in headers) {if (headers.hasOwnProperty(headerName)) {// headers 对象的值是一个包含 'value' 属性的对象var headerValue = headers[headerName].value;console.log(headerName + ": " + headerValue);}}console.log('targetOrigin: ' + targetOrigin);// 使用CloudFront 2.0 API修改origin
    cf.updateRequestOrigin({"domainName": targetOrigin,"port": 80,"protocol": 'http',"timeouts": {"readTimeout": 30,"connectionTimeout": 5}});// 添加调试信息 - 确保值是字符串request.headers['x-debug-country'] = { value: String(country || 'unknown') };request.headers['x-debug-targetorigin'] = { value: String(targetOrigin) };return request;
}

  解决跨域问题,函数代码如下:

function handler(event)  {var response  = event.response;var headers  = response.headers;// If Access-Control-Allow-Origin CORS header is missing, add it.// Since JavaScript doesn't allow for hyphens in variable names, we use the dict["key"] notation.if (!headers['access-control-allow-origin']) {headers['access-control-allow-origin'] = {value: "*"};console.log("Access-Control-Allow-Origin was missing, adding it now.");headers['access-control-allow-headers'] = {value: "Origin, X-Requested-With, Content-Type, Accept"};headers['access-control-allow-methods'] = {value: "GET,POST,PUT, OPTIONS"};}return response;
}

  

  ok,完事儿

  

 

 
 
 
 
 
 
 
http://www.jsqmd.com/news/144885/

相关文章:

  • 通达信主力控盘雷达 源码
  • MinIO官宣停摆,开源用户何去何从?从架构到实战的全方案选型指南
  • 以订单为核心的全链路数字化管控能力横评:六大主流系统深度对比
  • UR开放直接扭矩控制:为协作机器人高级控制算法研究打开新路径
  • Java毕设项目:基于springboot的考研学生在线学习与交流系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 云服务器安全加固指南:从基础配置到纵深防御体系搭建
  • ​企业怎么选型内控合规管理平台?2025年实用指南 - 资讯焦点
  • 2026主管技师备考蓝图:如何科学抉择备考辅导机构 - 资讯焦点
  • padding不生效
  • 食品饮料行业的排产特点与要求
  • B2B企业的数字订货中枢:商联达订货系统让每一笔订单都精准高效
  • 2025年石家庄有实力的艺术肌理漆直销厂家哪个好,环保艺术涂料/艺术涂料/耀晶石艺术漆,艺术肌理漆生产厂家排行 - 品牌推荐师
  • 云原生安全加固:镜像安全与供应链防护全流程
  • 12、v-show 和 v-if 的区别
  • 零基础也能行!5分钟用AI搞定PPT,和加班说再见
  • 【课程设计/毕业设计】基于springboot的考研在线学习与交流平台基于springboot的考研学生在线学习与交流系统的设计与实现【附源码、数据库、万字文档】
  • python识别图片验证码,最强验证码识别
  • 2025最新!9个AI论文平台测评:继续教育科研写作必备清单
  • Java计算机毕设之基于SpringBoot的在线学习交流系统设计与实现基于springboot的考研学生在线学习与交流系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年AI战略落地:CIO分三阶段实施框架
  • 从0基础到完全掌握AD第12讲 栅格设置
  • 主管护师十大题库app排行榜:精选口碑题库,高效复习 - 资讯焦点
  • 通达信平步青云 源码
  • 【毕业设计】基于springboot的考研学生在线学习与交流系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 老板2026年AI规划实操指南:解决数据、人才、流程三大难题
  • 2026初级药师网课排行:考生亲测好评款 - 资讯焦点
  • 数字隔离器,如何提升光伏系统的运行稳定性?
  • Type-C受电端芯片ECP5702演示:串口发送电压电流,给外部MCU读取
  • 13、Vue2 与 Vue3 Diff 算法深度解析
  • Simbody: C++ 多体动力学(Multibody Dynamics)与物理仿真库