1、核心指导思想:扩展立方体

在讨论具体策略前,先了解著名的扩展立方体(Scale Cube),它定义了三种扩展维度:

  1. X轴:水平复制(克隆)

    • 策略:通过负载均衡器,在多个完全相同的应用实例之间分发请求。

    • 实现:这是最简单、最常用的方式。例如,将一个单体应用部署到多台服务器,前面用 Nginx 或 AWS ALB 做负载均衡。

    • 优点:实现简单,能快速提升系统的吞吐量和可用性。

    • 缺点:每个实例都包含所有功能和数据,缓存、会话等状态需要外部化处理,无法解决单一数据库的瓶颈。

  2. Y轴:功能拆分(解耦)

    • 策略:基于不同的业务功能、服务或领域进行拆分。这就是我们常说的微服务架构

    • 实现:将单体应用拆分为多个独立的服务,如“用户服务”、“订单服务”、“商品服务”。每个服务负责自己的数据和业务逻辑。

    • 优点

      • 高度解耦,团队可以独立开发、部署和扩展各自的服务。

      • 可以针对特定高负载服务进行精准扩容(比如大促时只扩展商品和订单服务)。

      • 技术栈可选,不同服务可以用不同的 Java 框架甚至语言。

    • 缺点:引入了分布式系统的复杂性(网络延迟、最终一致性、分布式事务、调试困难等)。

  3. Z轴:数据分片(分区)

    • 策略:基于特定的数据属性(如用户ID、地区)对数据进行分区,并将请求路由到对应的分区。

    • 实现:例如,user_id % 10 将用户数据散列到 10 个不同的数据库分片中。每个应用实例只处理特定分片的请求。

    • 优点:非常适合海量数据和高写入负载的场景,能有效扩展数据库的写能力。

    • 缺点:应用逻辑变得复杂,跨分片的查询和聚合操作非常困难。

最佳实践:通常从 X 轴开始,随着业务增长,逐步采用 Y 轴和 Z 轴策略。

2、具体策略与实施方案

架构层面

  • 演进式架构:不要一开始就设计一个庞大的微服务系统。优先采用模块化良好的单体架构(如使用 Spring Boot 的模块),随着业务复杂度的提升,再逐步将成熟、边界清晰的模块拆分为微服务。

  • 微服务架构

    • 服务发现:使用 Consul, Eureka, Nacos 等实现服务的自动注册与发现。

    • API 网关:使用 Spring Cloud Gateway 作为统一入口,处理路由、认证、限流、监控等跨切面关注点。

    • 通信:同步调用使用 REST(OpenFeign)或 gRPC;异步消息使用 RabbitMQ, Kafka, RocketMQ 来解耦服务,实现最终一致性和流量削峰。

    • 配置管理:使用 Nacos进行集中化的外部配置管理。

  • 缓存策略

    • 本地缓存:对于极少变化的数据(如元数据),使用 Caffeine 或 Guava Cache,速度极快。

    • 分布式缓存:对于全局共享的数据(如用户会话、热点商品),使用 Redis 。这是解除应用实例状态依赖、提升性能的关键。

  • 数据库扩展

    • 读写分离:主库负责写,多个从库负责读,缓解读压力。

    • 分库分表:使用 ShardingSphere 等框架对数据库进行水平拆分(Z轴扩展)。

    • 数据库选型:根据场景使用不同类型的数据库(多模数据库)。例如,ES 用于搜索,MongoDB 用于存储非结构化数据,TiDB 用于兼容 MySQL 协议且支持水平扩展的 OLTP 场景。

代码与开发层面

  • 无状态设计这是水平扩展(X轴)的前提。应用实例本身不存储用户会话等状态信息。将会话数据存储到外部缓存(如 Redis)中。

  • 池化资源:使用连接池(HikariCP)、线程池(ThreadPoolExecutor)来管理数据库连接、HTTP 客户端连接等昂贵资源,避免频繁创建和销毁带来的开销。

  • 异步与非阻塞

    • 使用 CompletableFuture 进行异步编程。

    • 采用响应式编程模型(如 WebFlux)构建非阻塞的 I/O 密集型服务,用更少的资源处理更高的并发。

  • 容错

    • 断路器:使用 Resilience4j 或 Hystrix 防止服务雪崩。当下游服务失败时,快速失败并提供降级方案。

    • 重试与限流:对暂时性故障进行智能重试;对上游调用进行限流,保护自身系统。

 基础设施与运维层面(DevOps)

  • 容器化与编排

    • 使用 Docker 将应用及其依赖打包成标准镜像。

    • 使用 Kubernetes (K8s) 进行容器编排,实现服务的自动部署、扩缩容(HPA)、自愈和滚动更新。K8s 是实践微服务和云原生扩展的基石。

  • CI/CD(持续集成/持续部署)

    • 自动化构建、测试和部署流程(Jenkins, GitLab, Nexus)。

    • 实现快速、频繁、可靠地发布,这是微服务能独立扩展的前提。

  • 监控与可观测性

    • 指标(Metrics):Prometheus 收集应用(Micrometer)和系统指标,Grafana 进行可视化。

    • 日志(Logging):集中式日志收集(ELK 栈:Elasticsearch, Logstash, Kibana)。

    • 追踪(Tracing):使用 SkyWalking进行分布式链路追踪,快速定位性能瓶颈和故障点。

  • 云原生:充分利用云平台(AWS, Azure, GCP, 阿里云)的弹性伸缩能力(如 AWS Auto Scaling Group),根据 CPU、内存或自定义指标(如消息队列长度)自动增减实例数量。

3、总结:一个可执行的扩展路径

对于大多数项目,推荐一个循序渐进的扩展路径:

  1. 阶段一:优化与垂直扩展

    • 优化代码和 SQL 查询。

    • 增加缓存(Redis)。

    • 数据库读写分离。

    • (必要时)升级服务器配置(垂直扩展)。

  2. 阶段二:水平扩展应用层(X轴)

    • 改造应用为无状态

    • 将应用部署到多台服务器,使用负载均衡器

    • 会话外部化到 Redis。

  3. 阶段三:拆分与解耦(Y轴)

    • 将单体应用拆分为微服务

    • 引入消息队列(Kafka/RabbitMQ)处理异步流程和削峰填谷。

    • 实施 API 网关和服务治理。

  4. 阶段四:数据层深度扩展(Z轴)

    • 对数据库进行分库分表

    • 引入多种类型的数据库(多模架构)。

  5. 全程贯穿

    • 基础设施自动化:使用 Docker 和 K8s。

    • 完善的监控:建立指标、日志、追踪体系。

    • 成熟的 DevOps 文化:自动化一切,快速反馈。

        记住,没有银弹。最好的扩展策略是基于当前的业务规模、团队能力和未来规划做出的最适合的权衡。过早优化和过度设计都是陷阱。始终以测量(Monitoring)为基础,让数据驱动扩展决策。

参考文档:

微服务架构理论-扩展立方体篇 - zygfengyuwuzu - 博客园

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

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

相关文章

HBuilder X 4.76 开发微信小程序集成 uview-plus

简介 本文记录了在HBuilder中创建并配置uni-app项目的完整流程。 首先创建项目并测试运行,确认无报错后添加uView-Plus组件库。 随后修改了main.js、uni.scss、App.vue等核心文件,配置manifest.json并安装dayjs、clipboard等依赖库。 通过调整vite.c…

第4章:内存分析与堆转储

本章概述内存分析是 Java 应用性能调优的核心环节之一。本章将深入探讨如何使用 VisualVM 进行内存分析,包括堆内存监控、堆转储生成与分析、内存泄漏检测以及内存优化策略。通过本章的学习,你将掌握识别和解决内存相关问题的专业技能。学习目标理解 Jav…

面经分享一:分布式环境下的事务难题:理论边界、实现路径与选型逻辑

一、什么是分布式事务? 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 一个典型的例子就是跨行转账: 用户从银行A的账户向银行B的账户转账100元。 这个操作包含两个步骤: 从A账户扣减100元。 向B账户…

C++的演化历史

C是一门这样的编程语言: 兼顾底层计算机硬件系统和高层应用抽象机制从实际问题出发,注重零成本抽象、性能、可移植性、与C兼容语言特性和细节很多,学习成本较高,是一门让程序员很难敢说精通的语言 C是自由的,支持5种…

Qt6实现绘图工具:12种绘图工具全家桶!这个项目满足全部2D场景

项目概述 一个基于Qt框架开发的专业绘图工具,实现了完整的2D图形绘制、编辑和管理功能。该项目采用模块化设计,包含图形绘制、图层管理、命令模式撤销重做、用户界面等多个子系统,是学习现代C++和Qt框架的最佳实践。 核心功能特性 12种专业绘图工具 多图层绘制系统 完整的…

Linux驱动开发学习笔记

第1章 Linux驱动开发的方式mmap映射型设计方法。【不推荐】将芯片上的物理地址映射到用户空间的虚拟地址上,用户操作虚拟地址来操作硬件。使用文件操作集(file_operatiopns)设计方法。【极致推荐】platfrom总线型设置方法。【比较流行】设备树。【推荐】第2章 Linux…

mac中进行适用于IOS的静态库构建

前沿: 进行C开发完成之后,需要将代码编译成静态库,并且在IOS的手机系统中执行,因此记录该实现过程. 1主要涉及内容 1.1 整体文件架构 gongyonglocalhost Attention % tree -L 2 . ├── build │ ├── __.SYMDEF │ ├── cmake_install.cmake │ ├── CMakeCache…

C++二维数组的前缀和

C二维数组的前缀和的方法很简单&#xff0c;可以利用公式res[i][j]arr[i][j]res[i-1][j]prefix[i][j-1]-res[i-1][j-1]。输入4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16输出1 3 6 10 6 14 24 36 15 33 54 78 28 60 96 136#include<bits/stdc.h> using namespace std; int…

Wifi开发上层学习1:实现一个wifi搜索以及打开的app

Wifi开发上层学习1&#xff1a;实现一个wifi搜索以及打开的app 文章目录Wifi开发上层学习1&#xff1a;实现一个wifi搜索以及打开的app背景demo实现1.添加系统权限以及系统签名2.布局配置3.逻辑设计3.1 wifi开关的实现3.2 wifi扫描功能3.3 连接wifi总结一、WiFi 状态控制接口二…

【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”

大家好&#xff0c;欢迎来到 DSP28335 的核心精讲系列。我们已经掌握了如何通过外部中断来响应“外部事件”&#xff0c;但系统内部同样需要一个精准的节拍器来处理“内部周期性任务”。单纯依靠 DELAY_US() 这样的软件延时&#xff0c;不仅精度差&#xff0c;而且会在延时期间…

从零开始:用代码解析区块链的核心工作原理

区块链技术被誉为信任的机器&#xff0c;它正在重塑金融、供应链、数字身份等众多领域。但对于许多开发者来说&#xff0c;它仍然像一个神秘的黑盒子。今天&#xff0c;我们将抛开炒作的泡沫&#xff0c;深入技术本质&#xff0c;用大约100行Python代码构建一个简易的区块链&am…

网络通信IP细节

目录 1.通信的NAT技术 2.代理服务器 3.内网穿透和内网打洞 1.通信的NAT技术 NAT技术产生的背景是我们为了解决IPV4不够用的问题&#xff0c;NAT在通信的时候可以对IP将私网IP转化为公网IP&#xff0c;全局IP要求唯一&#xff0c;但是私人IP不是唯一的。 将报文发给路由器进行…

国内真实的交换机、路由器和分组情况

一、未考虑拥挤情况理想状态的网络通信 前面我对骨干网&#xff1a; 宜春城区SDH网图分析-CSDN博客 数据链路层MAC传输&#xff1a; 无线通信网卡底层原理&#xff08;Inter Wi-Fi AX201&#xff09;_ax201ngw是cnvio转pci-e-CSDN博客 物理层、数据链路层、网络层及传输层…

atomic常用类方法

Java中的java.util.concurrent.atomic包提供了多种原子操作工具类&#xff0c;以下是核心类及其方法&#xff1a;‌1. AtomicBoolean‌‌方法‌&#xff1a;get()&#xff1a;获取当前值set(boolean newValue)&#xff1a;强制设置值compareAndSet(boolean expect, boolean upd…

算法题打卡力扣第3题:无重复字符的最长子串(mid)

文章目录题目描述解法一&#xff1a;暴力解解法二&#xff1a;滑动窗口题目描述 解法一&#xff1a;暴力解 遍历每一个可能的子串&#xff0c;然后逐一判断每个子串中是否有重复字符。 具体步骤&#xff1a; 使用两层嵌套循环来生成所有子串的起止位置&#xff1a; 外层循环 i…

HTML5 简介和基础骨架

一、HTML5 简介HTML5 是 HTML&#xff08;超文本标记语言&#xff09;的第五个主要版本&#xff0c;于 2014 年 10 月由 W3C&#xff08;万维网联盟&#xff09;正式发布。它不仅是对 HTML4.01 和 XHTML 的升级&#xff0c;更是一套完整的 Web 技术标准&#xff0c;包含了新的标…

.NET技术深度解析:现代企业级开发指南

每日激励&#xff1a; “不要一直责怪过去的自己&#xff0c;他曾经站在雾里也很迷茫” &#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1…

苹果手机文本转音频,自行制作背诵素材

当你在学习一段专业内容或者背诵重要知识点时&#xff0c;是不是有时会觉得眼睛看久了疲惫&#xff0c;而且记忆效果也不太理想呢&#xff1f;利用手头的苹果手机或iPad&#xff0c;你可以轻松将文本内容生成音频文件&#xff0c;然后随时随地反复听&#xff0c;这对于备考人士…

电子电子技术知识------MOSFET管

电子电子技术知识------MOSFET管前言一、结构与符号二、工作原理1.小功率MOSFET&#xff08;横向导电&#xff09;2.电力MOS管三、基本特性总结前言 MOSFET是电力场效应晶体管的英文简写&#xff0c;又称功率mos管&#xff0c;mos管 一、结构与符号 二、工作原理 1.小功率M…

仿真波导中超短脉冲传输中的各种非线性效应所产生的超连续谱

在波导中&#xff0c;超短脉冲传输时会受到各种非线性效应的影响&#xff0c;从而产生超连续谱。这些非线性效应包括自相位调制&#xff08;SPM&#xff09;、交叉相位调制&#xff08;XPM&#xff09;、四波混频&#xff08;FWM&#xff09;等。基于MATLAB的仿真程序&#xff…