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

系统设计(1)—前端—CDN—Nginx—服务集群

简介: 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略,并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧,指出设计时需要特别注意的问题和常见陷阱,并引用美团、淘宝、京东、滴滴等大厂的真实案例加以说明。这份指南结构清晰、模块化编排,方便快速查阅,注重实战性和场景应对能力。

前端架构与优化

现代系统的前端架构需要既能提供良好的用户体验,又能支撑高并发访问。前后端分离是常见架构,即前端负责页面展示和交互,后端提供数据接口。这种模式下可以灵活扩展前端集群,并通过CDN缓存静态资源(如HTML、CSS、JS、图片)减轻服务器压力​。前端性能优化主要围绕减少请求体积和数量加快加载和渲染展开:

静态资源优化:

将尽量多的静态内容下发给CDN或浏览器缓存。通过将静态资源从动态内容中拆分,可以更好地优化网站性能和扩展性;静态资源可被缓存并通过CDN分发,加快加载速度并减轻服务器负载。例如,将JS/CSS文件打包压缩、启用浏览器缓存控制(强缓存/协商缓存)等,使重复访问时能直接读取缓存而非每次请求服务器。

这里我想到了http1.1引入的cache-control功能。

什么是 HTTP/1.1 的 Cache-Control

Cache-Control 是 HTTP/1.1 引入的一个非常重要的缓存控制头部字段,
用来告诉浏览器、CDN、代理服务器等中间层,是否可以缓存这个资源,以及怎么缓存。

简单说:
Cache-Control 是用来管理缓存策略的指挥棒!

为什么需要 Cache-Control

如果没有它,缓存行为非常混乱:

  • 什么内容能缓存?

  • 缓存多久?

  • 什么情况下要重新请求服务器?

  • 如何保证缓存是最新的?

所以,HTTP/1.1 通过 Cache-Control 标准化了缓存规则,提高了 性能一致性体验

常用的 Cache-Control 指令总结

指令作用
no-cache不直接使用缓存,每次都向服务器确认是否有更新(不是不缓存!)
no-store完全不缓存,请求和响应都不存本地
public可以被任何中间缓存服务器(比如 CDN)缓存
private只允许用户本地缓存,中间层不缓存
max-age=秒数在多少秒内可以直接用缓存,无需请求服务器
s-maxage=秒数专门给代理服务器(CDN)设定的 max-age,优先级高于 max-age
must-revalidate过期后必须向服务器重新验证,不能使用过期缓存
proxy-revalidate代理服务器也必须重新验证

 假设你希望一个图片缓存 1 天(86400秒),过期后重新请求

Cache-Control: public, max-age=86400, must-revalidate

含义:

  • 浏览器、CDN可以缓存

  • 86400秒内直接用缓存,不发请求

  • 过期后必须重新验证


减少请求数量

合并请求和资源文件(如将多个CSS、JS打包,雪碧图合并小图标),启用HTTP/2多路复用减少连接开销。对初次加载不必要的资源采用懒加载或按需加载,降低首屏渲染压力。

 优化渲染路径

尽量避免阻塞渲染的操作。将脚本放在页面底部或使用defer/async异步加载,采用服务端渲染 (SSR) 提前生成部分HTML以缩短首屏时间,在需要SEO的场景(如电商商品页)尤其有用。对于单页应用 (SPA),合理使用路由懒加载和虚拟DOM减少重绘重排。

前端安全与稳定

使用HTTPS保障传输安全,合理设置Content Security Policy等防范XSS等攻击。对重要交互加入前端校验和限流(如按钮防抖),避免因为用户重复点击导致后端收到洪峰请求。 

场景实践

电商秒杀场景下,前端通常采用静态化的活动页面并提前加载必要资源,按钮会在倒计时结束后才激活,以减少无效请求;同时引入验证码或滑块验证防止恶意刷请求。

SaaS CRM系统中,由于功能复杂页面众多,常采用SPA架构配合组件懒加载,保证后台管理界面在功能丰富的同时保持良好响应。

对于支付系统的前端,重点在于安全和可靠性:页面需防止重复提交订单(前端按钮“一次点击”原则),并在请求支付后给予明确的进度提示(如转圈动画)避免用户频繁刷新。

SPA架构配合组件懒加载

SPA(Single Page Application,单页应用)
指的是整个网站只有一张 HTML 页面,不同的内容是通过 前端路由 动态切换出来的,而不是重新请求服务器加载新页面

简单说:只加载一次页面,之后都靠 JS 控制视图切换。比如:Vue、React、Angular 的项目,基本上都是 SPA。

SPA 的一个大问题:首屏加载慢

因为 SPA 要一次性加载大量的 JS、CSS,首屏很容易:

  • 白屏时间长

  • 页面迟迟不出东西

  • 用户体验差

所以就有了一个非常重要的优化手段:组件懒加载(Lazy Loading)

什么是组件懒加载?

组件懒加载指的是:只在需要时,才按需加载某个页面或组件的 JS 资源,而不是一开始就全部打包到一起。

比如用户一开始在首页,后台管理页的代码就先不加载。等到用户点到后台时,再去请求那块 JS 文件。就像打游戏一样,先加载新手村地图,等你去冰雪之城再加载冰雪之城地图。

旨在:
 

  • 缩短首屏白屏时间

  • 减少初始下载资源

  • 提高网站性能和体验

常见坑点

  • 缓存失效策略: 静态资源版本更新时如果未正确处理缓存,用户可能加载旧版本导致功能异常。通常通过文件名哈希或版本号确保更新时客户端能获取新资源,或配置CDN在发布时清理缓存。

  • 大数据量渲染: 单页应用一次性渲染海量DOM节点会导致浏览器卡顿甚至崩溃。这在CRM系统显示大型报表时容易出现。解决方案包括分页加载、虚拟列表技术等。

  • 内存泄漏: 前端长时间运行(尤其后台系统长期开着)若事件监听或组件未正确卸载,可能导致内存泄漏,时间久了页面变慢甚至崩溃。开发时需注意清理定时器、事件绑定等。

  • 浏览器兼容性: 不同浏览器对新特性的支持差异可能导致功能异常。需使用Polyfill或降级处理,以免在某些用户环境出现问题。

实践案例

多家互联网公司采用了前后端分离+CDN加速的架构优化前端性能。例如,

淘宝将商品详情页预渲染为静态页并通过CDN发布,用户打开页面时基本不需要向源站请求动态内容,确保了双11大促时即使瞬时流量暴增页面也能秒开。

美团针对移动端网页的网络波动,开发了优化弱网下资源加载的方案,提高了App在弱网环境下的加载速度​。

这一切都体现出前端架构在系统设计中的重要性:合理的前端优化能极大缓解后端压力,提高系统整体的可用性和流畅度。

CDN(内容分发网络)

CDN 的作用

CDN(Content Delivery Network)通过在全球各地部署边缘节点服务器,将网站的静态内容分发缓存到离用户更近的节点上,以实现就近访问。用户请求内容时,会由离其最近的CDN节点提供响应,从而加速静态资源访问,显著降低源站服务器的负载和带宽压力​。简单来说,CDN就好比网站的“物流仓库体系”,把资源提前储存在各地的“仓库”,用户访问时从附近仓库取货,免去长途传输延迟。这对于大流量的网站非常关键——例如热点新闻、视频网站、商城的图片和脚本,都几乎必然使用CDN加速。

工作原理

CDN通过DNS调度等技术将用户请求指向最佳节点。当用户首次请求某资源时,如果CDN节点上没有缓存,会向源站拉取并缓存该资源;后续请求直接命中缓存。CDN系统在靠近用户的位置存储网站静态资源(图片、视频、CSS、JS 文件等),当用户请求这些资源时,无需直接访问源站​。同时CDN通常具备智能路由负载均衡能力,能根据用户网络状况选择最快的节点响应。如果某个节点发生故障或响应变慢,CDN调度系统可自动切换节点,提高整体可用性。

优化策略

  • 缓存策略: 为不同类型的内容设置合适的缓存过期时间(TTL)。对于很少变化的资源(如版本固定的JS/CSS文件或产品图片),TTL可以设置较长,实现长期缓存;对于可能频繁更新的内容(如新闻页HTML),TTL可以较短甚至不缓存,并利用CDN的协商缓存(If-Modified-Since/ETag)机制确保必要时及时更新。合理利用 Cache-ControlExpires 头,让浏览器和CDN共同缓存内容,提高缓存命中率。

  • 回源降载: 避免CDN缓存失效时大量请求瞬间回源造成源站压力陡增(即回源雪崩)。可采用分片过期:让缓存过期时间错开,或通过CDN提供的预取/预热接口,在内容即将过期前主动刷新缓存。在电商秒杀场景中,大促页面往往提前缓存好,并确保缓存有效期覆盖活动高峰期,以避免活动过程中回源查询。

  • CDN容灾: 准备备用方案以防 CDN 服务商故障。如果主要 CDN 大面积故障,用户可能无法访问资源。可以为关键业务配置多个 CDN 服务商的冗余,当探测到某主 CDN 节点不可用时,自动切换到备用 CDN。美团外卖团队就曾在客户端实现CDN可用性探测与自动容灾切换方案,有效降低了业务对 CDN 异常的敏感性

场景实践

电商秒杀中,CDN 扮演关键角色——静态页、商品图片、CSS/JS等全部通过CDN分发,用户在抢购过程中几乎所有静态资源都本地化命中,只有下单等操作会访问源站,大大提升了并发承载能力。

SaaS CRM系统面对各地企业用户,也会利用 CDN 将前端静态资源和常用数据分发到各区域,让不同城市的用户访问速度一致。

对于支付系统,虽然支付流程主要是动态交互,但其静态资源(支付页面HTML、样式脚本)同样通过CDN加速,此外CDN的全球节点还能加速海外用户的支付页面加载,提高支付成功率。

常见坑点

  • 缓存不一致: 更新资源时,如果不同节点缓存未同步刷新,可能出现有的用户拿到新版本有的拿到旧版本。解决办法是内容版本化:更新时更改文件名(如附加版本号或hash),让CDN缓存的新旧内容共存,避免旧缓存干扰;或者同时调用CDN提供的API批量刷新关键内容。切忌在不确定缓存配置时直接修改文件却不刷新CDN,否则会产生难以复现的线上问题。

  • 回源带宽压力: 当某些资源一段时间未被访问而从边缘节点逐出缓存后,突然又有大量用户访问,CDN会将请求回源。若源站带宽不足,会造成性能瓶颈。需要监控CDN回源流量,确保源站有足够冗余,必要时升级源站带宽或增加源站节点,并设置CDN的缓冲站点缓存层级缓解回源压力。

  • 成本控制: CDN 按流量计费,高峰流量可能带来高费用。需权衡加速收益和成本。比如对于内部员工使用的CRM系统,可以对非公开网络场景选择性关闭CDN或使用自建节点。在预算有限时,重点保障关键页面和大流量资源走CDN,加速效果与成本做到平衡。

实践案例

各大厂都高度依赖 CDN 提升访问性能。

淘宝/天猫的双11会场页面及商品详情资源全部提前部署在多家 CDN 上,以承受峰值流量;

哔哩哔哩视频网站通过 CDN 提供全国高速的视频内容分发,即使弹幕密集的视频也能流畅加载。

美团外卖业务中,工程师们甚至设计了端侧 CDN 容灾方案,当检测到某CDN节点响应异常时,客户端自动切换到另一个CDN域名,以保障用户加载图片和菜单的体验。

可以说,CDN 已是高并发系统的标配,加速和稳定效果显著。

什么是端侧 CDN 容灾?

端侧 CDN 容灾,就是指在客户端(浏览器、APP)检测并处理 CDN 节点异常,确保资源可以正常访问,避免因为 CDN 故障导致白屏、功能不可用。

简单说: 服务器挂了不要紧,端上自己能兜底补救

为什么需要端侧容灾?

  • CDN 节点虽然多,但也可能局部故障、网络劣化

  • 如果不做容灾,用户端请求超时或者失败,体验非常糟糕

  • 服务端无法完全感知每一个用户的网络状态,必须端上自救

端侧 CDN 容灾核心思路

核心动作说明
监控请求判断资源是否加载成功,比如图片、脚本
快速降级检测失败后,快速切换备用地址
多源备份预设多个 CDN 备份源(多域名、多存储)
限速与重试避免疯狂重试,合理限流控制

常见端侧容灾方案

1. 多 CDN 域名 fallback

  • 配置 主域名 + 备域名(多个CDN供应商,比如又拍、阿里云、腾讯云)

  • 加载资源失败后,自动切换到下一个域名重新请求

2. 加载前预检测(测速探测)

  • 在加载大资源之前,发一个小文件探测(比如 1x1像素图片,或者小的 JSON 文件)

  • 测速,如果超时或者失败,就提前切备用源

3. 本地缓存兜底(Service Worker)

  • 利用 Service Worker 缓存重要资源

  • 即使 CDN 挂了,也能从本地缓存里读出来

端侧 CDN 容灾注意事项

问题解决建议
不要无限重试控制最大重试次数,避免雪崩效应
合理选择备源主备源部署在不同运营商/机房
优先检测主源小文件探测提前预判,用户无感知
降级策略比如低清图代替高清图、小功能降级展示

Nginx 负载均衡

在后端架构中,引入负载均衡(Load Balancing)是支撑高并发的重要手段。Nginx 是流行的七层负载均衡服务器,常被用作网关来将客户端请求分发到后端多个服务实例上。通过负载均衡,可以横向扩展服务:当单台应用服务器无法承载流量时,增加多台服务器并由Nginx分配请求,实现集群共同承担压力。此外,Nginx还可以作为反向代理,缓存后端响应、进行请求合并,从多个层面提升系统性能。

负载均衡策略: Nginx 支持多种负载均衡算法,可根据配置选择请求分配方式​:

  • 轮询 (Round Robin): 默认策略,每个请求按顺序依次分配给后端服务器,实现简单的平均分摊。

  • 加权轮询 (Weighted RR): 按配置的权重比率分配请求,权重高的服务器承担更多请求。适用于后端服务器性能不均等的情况,可让高配服务器多承担一些流量。

  • 最少连接 (Least Connections): 将新请求分配给当前活动连接数最少的后端,避免某些请求处理慢的节点堆积请求​。这在请求处理时间差异较大时提升整体响应速度。

  • 源地址哈希 (IP Hash): 根据客户端 IP 进行哈希,固定将同一 IP 的请求分配到同一台后端服务器。这样可实现会话粘滞,确保用户的连续请求落在相同节点上(比如维持登录会话),适用于无状态会话存储困难的情况。

  • 其它策略: 使用第三方模块还可实现URL哈希(按请求URL分配),Fair算法(根据后端平均响应时间动态调整)等策略。选择策略时要结合业务特点,常用的是轮询、加权和IP哈希。

部署架构

在大型分布式系统中,负载均衡常常多级组合:前有四层负载均衡(如LVS、HAProxy)承担海量连接的分发,后有Nginx这类七层负载均衡做应用层路由和缓存压缩等工作。例如某些大厂的架构是用户请求先通过DNS解析到最近机房,然后进入LVS集群做IP层转发,再到各机房内部由Nginx将请求按URL转发到对应服务集群。Nginx本身也可集群部署:为了防止单点故障,通常会部署多台Nginx,同步配置,并通过Keepalived等做VIP漂移以实现高可用。当一台Nginx故障时,流量自动切换到另一台,保证负载均衡服务不中断。

优化策略

调优Nginx负载均衡需要考虑高并发连接和后端健康管理:

  • 连接复用与限速: 调高worker_connections等参数以允许更多并发连接,开启keep-alive保持客户端连接复用,从而减少TCP建立开销。Nginx还能通过限速模块对单IP或总并发做限制,防止恶意请求耗尽后端资源。

  • 健康检查与熔断: 配置Nginx对后端节点进行健康检查(如探测心跳URL)。当检测到某个节点连续失败达到阈值时,可暂时将其摘除(熔断)停止转发,等待其恢复正常再自动加入。这避免了持续把流量发送给已故障或超载的节点而影响用户请求。

  • SSL卸载和静态缓存: 在HTTPS场景下,将SSL握手和加解密工作由Nginx完成(即SSL卸载),减轻后端服务器CPU负担。同时Nginx可启用proxy_cache等功能缓存后端响应(例如静态JSON数据),后续请求直接由Nginx返回缓存结果,加速响应并降低后端压力。

场景实践

电商秒杀时,Nginx需要承载巨量并发请求的分发。为防止Nginx自身成为瓶颈,通常会部署多实例Nginx并做LVS前置,同时调高Nginx的worker进程数和连接数上限,确保能处理瞬时涌入的成千上万连接。对秒杀接口进行限流(这可在Nginx用lua脚本实现简单令牌桶)是常见操作,防止恶意刷请求打垮后端。

支付系统一般要求请求有序处理且安全,因此常使用IP哈希或在上层网关做会话黏着,确保支付过程中的多步请求落在同一后端,避免跨节点造成状态同步问题。此外,支付网关还会配置严格的健康检查,任何一台后端响应变慢都会被临时摘除,以保障支付请求低延迟。

SaaS CRM系统因为服务众多、接口繁杂,API网关(往往基于Nginx)会根据URL将流量路由到不同业务集群,例如将/crm/customer打头的请求送往客户服务集群、/crm/sales送往销售管理服务。网关还可实现统一认证和鉴权,拦截未授权请求,提升整体安全性和一致性。

常见坑点

  • 单点故障: 仅部署单台负载均衡会成为单点,一旦故障整个服务不可用。需要多实例冗余和健康检查,以及配套的自动切换机制(如VRRP协议的Keepalived)保证高可用。

  • 会话粘滞影响扩展: 如果依赖IP哈希等实现黏住会话,那么当需要临时增加节点承担流量时,哈希可能导致部分老用户仍指向原节点,新节点得不到流量分担。解决办法是在服务端实现无状态会话(比如将session存Redis集中管理),尽量避免对负载均衡层黏住会话的依赖。

  • 不当的超时设置: Nginx对后端有连接和读取超时设置。如果设置过长,后端卡顿时请求会长时间挂起占用连接;设置过短又可能误判正常慢请求为超时而过早终止。需根据后端服务特点调整。尤其在支付等场景,某些第三方接口可能需要较长等待,这时网关超时要适当放宽或做特殊处理,否则用户支付到一半被切断体验很差。

  • 日志与监控不足: 负载均衡节点往往是故障排查的关键点。如果没有详细的访问日志(包括客户端IP、请求路径、后端分配结果等)和监控(如各后端QPS、健康情况),出问题时很难迅速判断是负载均衡配置问题还是后端服务问题。要确保Nginx的日志级别和监控指标全面覆盖。

实践案例

许多大规模系统采用多层负载均衡架构

例如淘宝在双11期间通过 DNS 将用户引导至各地机房,再由 LVS 集群实现数百万级别并发连接的四层分流,最后由机房内成百台 Nginx 服务器做七层转发和缓存压缩。

美团内部也构建了统一的接入层网关 Oceanus,作为七层负载均衡网关每天处理着千亿级调用,背后支撑着几千个服务节点、近万个注册服务​。

在滴滴出行的架构中,乘客端和司机端请求首先进入全局流量调度中心,再由各业务线的Nginx网关路由到具体微服务集群,实现了出行、高并发场景下的高效请求分发。可以看到,负载均衡设计是大型系统稳定运行的基石。

服务集群与微服务架构

当系统规模扩大、功能模块增多时,服务集群化微服务架构是一种行之有效的设计思路。它将单体应用拆分为多个可独立部署和扩展的服务,分别负责不同的业务功能(如用户管理、商品、订单、支付等),通过远程调用协同完成整个业务流程。这样做的好处是每个服务可以按需横向扩展,并由专门团队独立开发部署,提升开发效率和系统弹性。

核心组件

  • 服务注册与发现: 由于服务实例动态扩容缩容,需要一个注册中心跟踪所有服务地址。服务启动时将自身地址注册上去,调用方通过注册中心发现可用实例列表。常见实现有 ZooKeeper/Etcd、Eureka、Consul 以及阿里的 Nacos 等。

  • API 网关: 微服务数量众多时,一个统一入口的 API 网关能提供路由转发、协议转换、安全校验等功能。它接受客户端请求并根据URI或其它路由规则将请求转发给内部服务,还能做统一的认证、限流和日志记录。​提到,美团在微服务拆分导致API规模激增的情况下,开发了统一的API网关服务 Shepherd 来管理所有接口流量。网关也可屏蔽内部架构变化,对前端提供稳定的REST/RPC接口。

  • 配置与治理中心: 随着服务实例的剧增,集中管理配置(如数据库连接串、开关参数)很必要。配置中心(如Apollo、Spring Cloud Config)可以统一下发配置并实时通知。服务治理平台则管理服务的各种规则,如限流熔断策略、升级发布控制等。美团内部的 OCTO 服务治理平台就是这方面实践的例子,包含服务通信框架、命名服务、服务数据中心等组件,为内部全部服务提供统一的治理方案​。

  • 通信与调度: 服务间通信可采用HTTP/REST,也可用RPC框架。阿里开源的 Dubbo、Facebook 的 Thrift 等都是RPC框架,可以提供高性能的服务调用。美团等大厂也研发自有RPC框架并结合Service Mesh理念,比如美团的 OCTO 2.0 基于 Service Mesh 来增强服务治理能力​。另外,像美团 Oceanus 网关不仅负载均衡,还提供HTTP层面的服务治理,每日承载海量服务调用​

扩展与部署

服务集群一般通过容器化+编排来管理。使用 Docker 将服务封装,然后用 Kubernetes 等容器编排系统在集群中调度部署,实现弹性伸缩和故障自愈。

场景实践

电商领域(如淘宝、京东),后台通常拆分为商品服务、购物车服务、订单服务、支付服务等,各自独立部署扩展。秒杀活动期间,可能还会有专门的抢购服务模块,用来处理秒杀逻辑并与库存服务交互,在高峰时可以单独水平扩容这个服务而不影响其他部分。

SaaS CRM系统由于需要服务多个企业客户,往往采用多租户微服务架构:公共的基础服务(用户认证、权限)共享,但每个租户的数据操作由独立服务或逻辑处理,确保数据隔离。比如,CRM会将“销售线索服务”、“客户管理服务”、“报表服务”等解耦,各模块通过消息或API集成,使不同租户的请求在后端可以分散到不同服务实例处理,从而同时支撑多个客户使用。

支付系统对可靠性要求极高,通常将账务风控通知等功能也拆成独立服务。例如支付完成后,账务服务负责记账,通知服务负责发送用户通知,彼此解耦并异步处理,即使通知失败也不影响核心支付流程完成。

什么是多租户(Multi-Tenant)?

多租户指的是同一个系统实例同时为多个独立客户(租户)服务数据隔离,资源共享

简单说就是:一套微服务,多个客户一起用,但互相数据隔离。

比如:

  • 企业微信:你在用,我也在用,账号不同,但后台一套系统。

  • 美团商家后台:每个商家登录的是自己的数据,但其实是统一平台。

多租户微服务架构

在微服务体系中,支持多租户并保证租户数据隔离、安全,同时服务复用、资源最大化。

多租户微服务关键设计点

设计领域要点
数据隔离不同租户数据不能混淆(数据库层面设计)
认证授权确保用户访问的是自己租户的数据(Token携带租户ID)
配置隔离每个租户可以有自己定制的配置(如主题、功能开关)
性能隔离单个大租户不能拖垮整个系统(限流、配额管理)
服务治理多租户要统一管理、监控、扩缩容

多租户架构常见模式

模式特点
单实例单数据库一套代码,一个数据库,所有租户的数据共存在表里,通过 tenant_id 区分(最省资源,常见)
单实例多数据库每个租户单独一套数据库,系统连接不同数据库(隔离更强,适合大客户)
多实例多数据库每个租户一套完整系统部署,隔离极强,但运维复杂,成本高(适合超大型客户)

关键技术设计细节

1. 租户上下文(Tenant Context)

  • 用户请求到来时,必须知道是哪个租户(tenant_id)

  • 通常通过 JWT Token、HTTP Header、请求参数携带

  • 在微服务内部每一层透传

2. 数据隔离方案

  • 数据库表加租户字段 (tenant_id)

  • 应用层自动注入查询条件(Mybatis Interceptor、Hibernate Filter)

  • 复杂场景甚至做逻辑分库分表(分租户)

3. 接入网关 (API Gateway) 租户鉴权

  • 微服务前统一通过 API Gateway 拦截、鉴权

  • 根据 Token、Header,打上租户标签,后端透明使用

比如:

用户访问 → API Gateway提取token → 验证租户 → 请求转发

4. 配置中心多租户支持

  • Apollo、Nacos等配置中心,支持租户维度的配置隔离

  • 不同租户可以加载不同的 feature 开关、参数、主题

5. 资源隔离与弹性伸缩

  • 各租户有独立的配额(请求QPS、磁盘配额等)

  • 热点大租户支持自动扩容(HPA / K8S多副本)

  • 防止大客户"劫持"公共资源

                +-------------+| API Gateway  |+------+-------+|+-----------+-----------+|                       |+--------v-------+       +-------v--------+| Authentication |       |  Configuration |+--------+-------+       +-------+--------+|                       |
+----------v------+        +-------v---------+
|   User Service  |        | Product Service |
+----------+------+        +-------+---------+|                        |+-------v------------------------v------+|          Shared Database (tenant_id)  |+---------------------------------------+

常见坑点

  • 分布式事务: 原本单体内的本地事务,拆到多个服务后就变成分布式事务,很难保证强一致性。如果不加设计,可能出现部分服务更新成功而部分失败的不一致情况。解决方法包括采用最终一致性(通过消息队列异步校正)或引入分布式事务协调器(如 Saga 模式)等。但要慎重,过度追求强一致会使系统复杂度飙升。

  • 网络延迟与可靠性: 服务间远程调用相比进程内调用有网络延迟,链路长了总延迟可能增大。同时网络调用也有失败可能,需做好重试和超时控制。服务网状依赖下,任何一个服务变慢都会级联影响整体​。美团的实践表明,当微服务数量和复杂度提升后,网状依赖中任何轻微的延迟都可能传导放大​。因此需要引入熔断限流机制(在后续章节详述)来避免雪崩效应。

  • 运维复杂度: 服务实例成百上千后,日志追踪和监控告警变得困难。需要实施全链路追踪(如使用SkyWalking、Zipkin等)以跟踪一次请求经过哪些服务、耗时多少;也需要完善的监控体系监视各服务的QPS、错误率、平均延迟等。否则出了问题难以及时定位是哪一个子服务导致。

  • 资源浪费与调优: 拆分微服务后,每个服务都有独立的资源配额,但是流量在实际中可能不均衡。如果各服务按照峰值各自申请资源,可能总的计算资源利用率不高。需要通过容器编排的平台根据负载动态调整,或者结合云厂商弹性伸缩来优化资源使用。此外,微服务粒度也要拿捏合适,过细会导致调用量剧增(典型的微服务不再微的问题),需要根据业务关联度适当合并成中粒度服务。

实践案例

几乎所有一线互联网公司都实施了微服务架构。

美团内部服务治理框架 OCTO 支撑了上万微服务的注册发现和通信,配套的 Oceanus 七层网关每天处理千亿级服务请求​。美团还开发了Shepherd API网关来统一管理外部接口流量,使客户端只需调用网关而无需关心后端服务细节​。

滴滴出行则在2017年全站进行了服务化改造,将原先的巨石应用拆分为300多个微服务,显著提高了开发部署效率,同时也经历了一次由于微服务依赖未治理好而在春节高峰发生的连锁故障,事后滴滴加强了熔断降级策略,建立了健全的服务监控体系。

小米公司在其电商和云服务中也采用微服务架构,并结合 Kubernetes 实现了一键扩容缩容,其开源的微服务框架(如 Dubbo 的改进版)也服务于社区。可以说,服务集群化和微服务已成为大型系统的标配架构,在提高系统可伸缩性的同时,需要成熟的治理手段来保证稳定性。

相关文章:

系统设计(1)—前端—CDN—Nginx—服务集群

简介: 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略,并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧…...

Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析

Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析 众所周知,原生 Elasticsearch 默认开启的是 HTTP 明文接口,并且不开启任何身份认证或传输加密。若想启用 TLS/SSL 加密及账号密码验证,通常需要配置繁琐的安…...

在Android中如何使用Protobuf上传协议

在 Android 中使用 Protobuf(Protocol Buffers)主要分为以下几个步骤: ✅ 1. 添加 Protobuf 插件和依赖 在项目的 build.gradle(Project 级)文件中添加 Google 的 Maven 仓库(通常默认已有)&am…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中,地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生,成为破解这一难题的核心工具。…...

2025年的营销趋势-矩阵IP

从 2025 年的营销生态来看,创始人 IP 与智能矩阵的结合确实呈现出颠覆性趋势,这一现象背后隐藏着三个值得深度解析的商业逻辑: 一、创始人 IP 的本质是 "信任货币" 的数字化迁徙 当新能源汽车市场陷入参数混战,雷军将个…...

对接金蝶获取接口授权代码

接口服务信息 using RestSharp; using System.Configuration; using System.Threading.Tasks; public class KingdeeAccessTokenService { private readonly RestClient _client; private readonly KingdeeApiConfig _config; public KingdeeAccessTokenService() …...

探秘 3D 展厅之卓越优势,解锁沉浸式体验新境界

(一)打破时空枷锁,全球触达​ 3D 展厅的首要优势便是打破了时空限制。在传统展厅中,观众需要亲临现场,且必须在展厅开放的特定时间内参观。而 3D 展厅依托互联网,让观众无论身处世界哪个角落,只…...

prometheus通过Endpoints自定义grafana的dashboard模块

1、prometheus自定义的dashboard模块 文件路径/etc/prometheus/config_out/prometheus-env.yaml - job_name: serviceMonitor/monitoring/pfil/0honor_labels: falsekubernetes_sd_configs:- role: endpointsnamespaces:names:- monitoringrelabel_configs:- source_labels:- …...

java排序算法-计数排序

计数排序的思路 计数排序的基本思路: 确定取值范围: 遍历整个待排序的数组,确定数组中元素的取值范围,找到最小值和最大值。创建计数数组: 创建一个计数数组,其长度为取值范围的大小,用于统计…...

力扣-hot100(滑动窗口最大值)

239. 滑动窗口最大值 困难 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums […...

每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)

洛谷P1049 装箱问题题解:动态规划在背包问题中的经典应用 题目描述 P1049 装箱问题是一道典型的0-1背包问题变种。题目要求在给定箱子容量V和n个物品体积的情况下,选择若干物品装入箱子,使得箱子的剩余空间最小。最终输出这个最小剩余空间的…...

【尚硅谷Redis6】自用学习笔记

Redis介绍 Redis是单线程 多路IO复用技术(类似黄牛买票) 默认有16个库,用select进行切换 默认端口号为6379 Memcached:多线程 锁(数据类型单一,不支持持久化) 五大常用数据类型 Redis key …...

产品更新丨谷云科技ETLCloud V3.9.2版本发布

谷云科技 ETLCloud 集成平台迎来了每月一次的功能迭代,本月发布版本号为 3.9.2 版本,为用户带来了新的功能、优化改进以及问题修复,以下是详细介绍: 新增组件 本次更新新增了众多实用组件,涵盖了京东和 Shopify 相关…...

Promise并发控制与HTTP请求优化

Promise并发方法对比 #mermaid-svg-tnmGzOkgNUCrbvfI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-icon{fill:#552222;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-text{fill:#552222;stroke…...

G1垃圾回收器中YoungGC和MixedGC的区别

在 G1 垃圾回收器中,Mixed GC 和 Young GC 的区别主要体现在以下几个方面: 作用范围 Young GC:仅针对年轻代中的Region进行回收,包括 Eden 区和 Survivor 区的 Region。Mixed GC:会回收所有年轻代的 Region 以及部分…...

Web4.0身份革命:去中心化身份系统的全栈实现路径

去中心化身份(DID)技术栈正在重构数字世界的信任根基,本文从密码学协议、存储网络、验证框架三个维度,解析符合W3C标准的身份系统构建方案。通过Hyperledger Aries架构实践,揭示如何实现跨链身份互通、数据主权控制、零…...

iOS/Flutter混合开发之PlatformView配置与使用

环境:Xcode 16.3、Flutter 3.29.2、Dart 3.7.2。 使用背景:需要在flutter界面中嵌入一个iOS原生控件。 步骤: 1. iOS侧实现: 1.1:PlatformView实现 class FLNativeView: NSObject, FlutterPlatformView {private v…...

Libconfig 修改配置文件里的某个节点

THCommandStatus ( { Status "1"; index 5; }, { Status "2"; index 8; }, { Status "3"; index 7; }, { Status "4"; index 0; } ); 比如这是配置文件的内容&#xff…...

【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来

AI 赋能数据库运维:金仓KES的智能化未来 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 在当今数字经济飞速发展的时代&#xff0…...

【MySQL】3分钟解决MySQL深度分页问题

什么是深度分页问题?该如何解决呢?这篇文章展开讲讲 什么是深度分页? 当查询结果集非常大时,需要获取靠后页码的数据,比如第1000页、10000页。 如: SELECT * FROM table LIMIT 10000, 10; -- 获取第10001-10010条…...

GitHub 趋势日报 (2025年04月24日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1kortix-ai/sunaSuna - Open Source Generalist AI Agent⭐ 1105⭐ 3639TypeScript2cloudcommunity/Free-CertificationsA curated …...

一种双模式机器人辅助股骨干骨折钢板植入方法

股骨干骨折是一种常见的高能损伤,微创内固定是首选治疗方法。然而,钢板植入过程中存在不可见、不准确和不稳定等问题。山东大学研究团队提出了一种双模式机器人辅助钢板植入方法,通过神经网络模型规划钢板植入轨迹,然后利用机械臂…...

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…...

IDEA搭建环境的五种方式

一、普通的java项目 File--New--Project 选择Java,jdk选择1.8版本,然后点next 输入项目名和路径名,点击Finish 创建包结构,编写Class类 编写主方法,输出Hello标志完成 二、普通的javaWeb项目 Java Enterprise-- 勾选…...

隐形革命:环境智能如何重构“人-机-境“共生新秩序

引言 在万物互联的时代,环境智能(Ambient Intelligence, AmI)正以“隐形革命者”的姿态重塑人类生活场景。通过分布式传感器、边缘计算与自适应算法的深度融合,AmI构建出能感知、学习并响应人类行为的智慧环境。 本文基于多领域研…...

Mysql唯一性约束

唯一性约束(Unique Constraint)是数据库设计中用于保证表中某一列或多列组合的值具有唯一性的一种规则。它可以防止在指定列中插入重复的数据,有助于维护数据的完整性和准确性。下面从几个方面为你详细解释 作用 确保数据准确性&#xff1a…...

QuecPython+GNSS:实现快速定位

概述 QuecPython 结合 GNSS(全球导航卫星系统)模块为物联网设备提供开箱即用的定位能力解决方案。该方案支持 GPS/北斗/GLONASS/Galileo 多系统联合定位,为物联网开发者提供从硬件接入到云端服务的全栈式定位解决方案。 优势特点 多体系定…...

【从零开始:自制一个Java消息队列(MQ)】

🚀 从零开始:自制一个Java消息队列(MQ) 在现代分布式系统中,消息队列(Message Queue,MQ)已经成为一个至关重要的组件。它帮助系统在异步处理、负载均衡、解耦等方面提供了强大的支持…...

WHAT - 已阅读书单

指数基金投资指南✅ 我们终将变富 纳瓦尔宝典 围城✅ 许三观卖血记✅ 骆驼祥子✅ 活着 白鹿原✅ 百年孤独 君主论 阿Q正传✅ 蛤蟆先生去看心理医生✅ 思考,快与慢 三体✅ 人类简史:从动物到上帝✅ 明朝那些事✅ 三国演义✅ 中国历代政治得失✅ 资治…...

代码随想录算法训练营第60期第十七天打卡

今天我们继续进入二叉树的下一个章节,今天的内容我在写今天的博客前大致看了一下部分题目难度不算大,那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多,我第一次题目没有看明白就是我不知道到底是如何…...

C 语言数组详解

一、数组的基本概念 在 C 语言中,数组是一种相同数据类型元素的集合,这些元素在内存中连续存储。通过数组,我们可以用一个统一的名字来管理一组相关的数据,并且通过下标(索引)快速访问其中的每一个元素。例…...

ADVB协议同步

关于视频传输,有多种控制时序。协议标准允许设计者选择有限的几个速率的接口来满足 系统设计目标。例如,一些系统使用总线时序发送信息通过line-by-line;在这个案例中, 容器的sof作为vsync同步的点。horizontal line blanding将插入idles,ADV…...

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的…...

复合材料高置信度 DIC 测量与高级实验技术研讨会邀请函

邀请函 2025年5月8日 上海 中国复合材料学会官网会议通知 您可以点击上方蓝字跳转官网查看官网信息 主办单位: 中国复合材料学会 协办单位: 研索仪器科技(上海)有限公司 数字图像相关技术(Digital Image Correla…...

解决docker部署MySQL的max_allowed_packet 限制问题

报错 Error querying database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (2,471 > 2,048). You can change this value on the server by setting the max_allowed_packet variable. ### The error may exist in file …...

【XR手柄交互】Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR + Unity新输入系统(Input Actions))

摘要: 本文主要介绍如何使用 Input Actions(Unity 新输入系统) OpenXR 来实现 VR手柄控制(监听ABXY按钮、摇杆、抓握等操作)。 🎮 Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR 新…...

C++:继承机制详解

目录 一.继承的概念及定义 一).继承的概念 二).继承定义 1.定义格式 2.继承类型 3.继承类模板 二.基类和派生类间的转换 三.继承中的作用域 四.派生类的默认成员函数 一).4个常见默认成员函数 二).不可被继承的类 五…...

自然语言处理+知识图谱:智能导诊的“大脑”是如何工作的?

智能导诊系统定义与作用 智能导诊系统是一种基于人工智能技术的医疗辅助工具,旨在提高医疗服务效率、改善患者就医体验、降低医院运营成本,通过自然语言处理技术,智能导诊系统能够自动回答患者的常见问题,帮助患者快速了解自己的…...

论文阅读笔记——ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping

ZeroGrasp 论文 多视角重建计算大、配置复杂,本文将稀疏体素重建(快且效果好)引入机器人抓取且只考虑单目重建,通过利用基于物理的接触约束与碰撞检测(这对精确抓取至关重要),提升三维重建质量将…...

Qt 调试信息重定向到本地文件

1、在Qt软件开发过程中,我们经常使用qDebug()输出一些调试信息在QtCreator终端上。 但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后,系统中没有QtCreator和编译环境,那应用程序出现问题,如何输出信息排查…...

Android Studio开发中Application和Activity生命周期详解

文章目录 Application生命周期Application生命周期概述Application关键回调方法onCreate()onConfigurationChanged()onLowMemory()onTrimMemory()onTerminate() Application生命周期管理最佳实践 Activity生命周期Activity生命周期概述Activity生命周期回调方法onCreate()onSta…...

vite+vue2+elementui构建之 package.json

webpack版本太低,构建依赖太多,头大。 各种查阅资料,弄了一份直通构建vite构建elementUi核心文件, 构建基于开源若依vue2vue3版本改造,感谢开源,感谢若依。 vitevue2elementui构建之 vite.config.js-CSD…...

安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践

安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践 在网络安全威胁复杂度指数级增长的今天,人工处理安全事件的效率已难以应对高频攻击(如日均万级的恶意IP扫描)。安全编排自动化与响应&#xf…...

《Keras 3 :使用 TFServing 提供 TensorFlow 模型》

《Keras 3 :使用 TFServing 提供 TensorFlow 模型》 作者:Dimitre Oliveira 创建日期:2023/01/02 最后修改时间:2023/01/02 描述:如何使用 TensorFlow Serving 为 TensorFlow 模型提供服务。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 构建机器学习模…...

深入理解C++ 中的list容器

目录 一、引言 二、list的基本介绍 2.1 底层结构 2.2 特性 三、list的使用 3.1 构造函数 3.2 迭代器的使用 3.3 容量相关操作 3.4 元素访问相关操作 3.5 修改器操作 3.6 迭代器失效问题 四、list的模拟实现 4.1 节点定义 4.2 迭代器实现 4.3 list类实现 五、lis…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼,用两张图说明大模型发展业态方向,以及大模型主体技术架构。(目前还需要进一步验证我的Thought && ideas,等待机会吧.........) 图一:探究大模型三个层次应用方向,浅层次入门简…...

Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)

目录 一、国密标准中,关于SM2签名验签的定义二、SM2签名和验签的实现原理1. 前置知识2. 签名生成过程3. 验签过程4. 数学正确性证明5. 安全性与注意事项 三、带userId、不带userId的区别1. 核心区别2.算法区别(1) 哈希计算过程(2) 签名验签流程 四、Java代码实现1. …...

贪心算法~~

目录 一、理论基础 二、题目练习 (1)455. 分发饼干 (2)53. 最大子数组和 - 力扣 (3)122. 买卖股票的最佳时机 II - 力扣(LeetCode) (4)860. 柠檬水找零…...

XYNU2024信安杯-REVERSE(复现)

前言 记录记录 1.Can_you_find_me? 签到题,秒了 2.ea_re 快速定位 int __cdecl main_0(int argc, const char **argv, const char **envp) {int v4; // [esp0h] [ebp-1A0h]const char **v5; // [esp4h] [ebp-19Ch]const char **v6; // [esp8h] [ebp-198h]char v7;…...

NLP系列【自然语言处理的深度学习模型综述】

自然语言处理的深度学习模型 摘要传统自然语言处理模型(略 不作重点)神经网络自然语言处理模型经典神经网络CNN网络模型Word2Vec模型RNN模型GPT网络模型BERT网络模型 BERT变体模型提升模型性能模型压缩 摘要 在自然语言处理任务方面,依据语料…...