架构选型:5大主流架构一次讲透-图解系列
你不需要维护办公室,不需要考虑水电费,在需要时预订会议室,用完即走,按使用时间付费。比如,当"下雨了"这个事件发生,有人会拿伞(一个处理器),有人会关窗(另一个处理器),但发出"下雨了"消息的人不需要知道谁会对此做出什么反应。方才在24年5月仅备考一个月便拿下架构师,会持续分享有价值的备考经验和技术文章,我相信对你一定有帮助,也可以扫码加入备考交流群。,你的支持是我持续输出干货的动力!分层架构是最
点这里 ↑ ↑ ↑ 记得 关注✔ 标星⭐ 哦
为什么有些软件能够经受住时间的考验,而有些却在短短几年内就被淘汰?
为什么有些应用能够轻松应对百万级用户的访问,而有些却在流量稍微增加时就崩溃了?
答案往往藏在一个看不见却至关重要的地方——软件架构。
作为系统的骨架与灵魂,软件架构决定着产品的质量与长期命运。好的架构能降低复杂度、提升可维护性,为业务增长提供弹性支撑。对每位开发者而言,掌握软件架构已成为必备技能。
接下来,就由我为你揭开软件架构的神秘面纱...
01.什么是软件架构?
如果把软件比作一座城市,那么软件架构就是这座城市的整体规划图。
城市规划决定了道路如何铺设、商业区和住宅区如何分布、交通如何流通;软件架构决定了软件系统中各个组件如何组织、数据如何流动、功能如何分配。
软件架构就是软件的"骨架"和"神经系统",定义了软件各部分如何协同工作、如何应对变化和挑战。
02.主流软件架构
1. 分层架构(Layered Architecture)
分层架构是最传统也是最基础的软件架构模式之一,主要是将系统按照不同的职责划分为多个水平层次,每一层都有明确的职责和边界。

如图所示,分导层架构包含以下几个层次:
表示层 :负责用户界面和用户交互;
业务逻辑层 :实现核心业务规则和流程;
数据访问层 :处理数据的持久化和检索;
数据层 :实际存储数据的数据库或文件系统;
每一层只能与相邻的层进行通信,具备严格的依赖关系,确保了系统的模块化和可维护性。上层依赖下层,而下层不感知上层的存在。
适用场景:
-
业务逻辑相对稳定的企业应用;
-
团队技能水平参差不齐,需要明确的职责划分;
-
系统复杂度中等,但结构清晰;
优势:结构清晰,易于理解,开发效率高;
劣势:层间耦合,整体扩展性有限;
实战案例:大多数企业级Java应用
// 表示层(Controller)
@RestController
publicclass UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public UserDTO getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
// 业务层(Service)
@Service
publicclass UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public UserDTO getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
return convertToDTO(user);
}
}
// 数据访问层(Repository)
@Repository
publicinterface UserRepository extends JpaRepository<User, Long> {
// Spring Data JPA自动实现基础CRUD
}
分层架构像办公楼:一楼是接待处(表示层),负责接待客户;二楼是业务部门(业务层),处理核心业务;三楼是档案室(数据访问层),负责文件管理;地下室是仓库(数据层),存储所有资料。信息按照楼层顺序传递,不能跨层。
2. 微服务架构(Microservices)
微服务架构,主要是将单体应用拆分为多个小型、独立有服务,每个服务负责特定的业务功能。
其特点如下图所示:

单一职责
每个微服务专注于特定的业务领域边界,每个服务只干一件事。
自治性
每个服务能"自己做主",具备技术栈独立性和部署自主性。
去中心化
数据主权分散化管理,每个服务有自己的数据库,一个服务的数据库挂了不影响其他服务。
弹性设计
系统具备故障隔离能力,一个服务挂了,整个系统还能跑。
API网关
供统一接入层,处理跨切面关注点如认证、路由和协议转换,所有外部请求先到网关,再分配给不同服务。
服务发现
实现服务实例的动态注册与发现机制。服务地址可能经常变,需要有个地方随时告知 "xx服务现在在哪"。
容错机制
有备无患。设置超时、断路器、重试等机制。
微服务架构组件,如下图所示:

通常包含以下几个组件:
-
服务注册与发现:动态定位服务实例
-
API网关:请求路由和聚合
-
配置中心:集中管理配置
-
负载均衡:分发流量到服务实例
-
服务熔断与降级:处理服务故障
-
分布式跟踪:全链路监控
-
消息总线:服务间异步通信
适用场景:
-
大型复杂系统,需要独立扩展不同模块;
-
多团队并行开发,需要明确的服务边界;
-
需要技术栈多样化,不同服务可以使用不同技术;
优势:高度解耦,独立部署,弹性扩展;
劣势:分布式系统复杂性,运维成本高,服务间通信开销。
实战案例:Netflix、Amazon、Alibaba等大型互联网平台
// 用户服务API
@RestController
@RequestMapping("/api/users")
publicclass UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public UserDTO getUserById(@PathVariable String id) {
return userService.findById(id);
}
}
// 订单服务调用用户服务
@Service
publicclass OrderServiceImpl implements OrderService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "getUserFallback")
public UserDTO getUser(String userId) {
return restTemplate.getForObject(
"http://user-service/api/users/" + userId,
UserDTO.class);
}
public UserDTO getUserFallback(String userId) {
// 降级逻辑,返回基础用户信息
returnnew UserDTO(userId, "Unknown", "");
}
}
// 服务注册
@SpringBootApplication
@EnableEurekaClient
publicclass OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
微服务架构像购物中心,里面有各种专卖店(服务)。每家店只卖一类商品(单一职责),有自己的收银系统(独立数据库)。商场有一个总服务台(API网关)引导顾客,有一个电子导航屏(服务发现)显示每家店的位置。即使某家店关门(服务故障),其他店铺照常营业(弹性设计)。
3. 事件驱动架构(Event-Driven Architecture)
事件驱动架构是一种以事件为中心的设计模式,系统组件通过事件的发布与订阅进行松耦合通信。

主要包含4个核心组件:
事件生产者:负责检测事件并发布事件消息;
事件通道:传输事件的管道,可以是消息队列、事件总线等;
事件处理器:订阅并处理特定类型的事件;
事件存储:可选组件,用于持久化事件以支持重放和审计;
适用场景:
-
不需要实时响应的系统;
-
组件间高度解耦的场景;
-
需要异步处理的工作流;
-
IoT设备数据收集分析;
-
复杂工作流和状态机实现;
优势:高度解耦,可扩展性强,适合实时处理;
劣势:事件追踪困难,调试复杂,最终一致性挑战;
实战案例:实时数据处理系统、IoT平台
// Kafka生产者(事件发布)
@Service
publicclass OrderEventPublisher {
@Autowired
private KafkaTemplate<String, OrderEvent> kafkaTemplate;
public void publishOrderCreatedEvent(Order order) {
OrderEvent event = new OrderEvent("ORDER_CREATED", order);
kafkaTemplate.send("order-events", event);
log.info("Published order created event: {}", order.getId());
}
}
// Kafka消费者(事件订阅)
@Service
publicclass InventoryEventHandler {
@Autowired
private InventoryService inventoryService;
@KafkaListener(topics = "order-events")
public void handleOrderEvent(OrderEvent event) {
if ("ORDER_CREATED".equals(event.getType())) {
Order order = event.getOrder();
inventoryService.reserveItems(order.getItems());
log.info("Reserved inventory for order: {}", order.getId());
}
}
}
事件驱动架构像一个广播系统。当重要事情发生时(事件),系统会广播一条消息。谁对这个消息感兴趣,谁就可以收听并作出反应。比如,当"下雨了"这个事件发生,有人会拿伞(一个处理器),有人会关窗(另一个处理器),但发出"下雨了"消息的人不需要知道谁会对此做出什么反应。
4. 云原生架构(Cloud-Native Architecture)
基于云计算模型设计的架构,充分利用云平台的弹性和服务能力,其核心在于以云为中心。

特点:
-
容器化:应用及其依赖打包为容器;
-
编排与调度:使用Kubernetes等工具管理容器的生命周期;
-
服务网格:处理服务间通信和策略;
-
不可变基础设施:基础设施作为代码,避免手动修改;
-
声明式API:通过声明期望状态而非命令式操作;
-
自动化:CI/CD流水线实现自动化部署和测试;
-
弹性系统:动态扩缩容和自愈能力;
-
可观测性:全面的监控、日志和追踪能力;
技术生态:
-
容器技术:Docker、containerd
-
编排平台:Kubernetes
-
服务网格:Istio、Linkerd
-
云原生存储:Rook、Longhorn
-
可观测性工具:Prometheus、Grafana、Jaeger
-
GitOps工具:ArgoCD、Flux
适用场景:
-
需要高弹性的业务关键型应用;
-
流量波动大的互联网服务;
-
需要快速迭代的产品;
-
计划上云或多云部署的应用;
-
需要现代化DevOps流程的团队;
-
大规模微服务集群管理;
优势:技术异构、独立开发与故障隔离,高弹性扩展和快速交付;
劣势:分布式复杂度增高,需处理跨服务事务与运维治理,增加系统设计和管理成本。
实战案例:
# Kubernetes部署文件示例(deployment.yaml)
apiVersion:apps/v1
kind:Deployment
metadata:
name:user-service
labels:
app:user-service
spec:
replicas:3
selector:
matchLabels:
app:user-service
template:
metadata:
labels:
app:user-service
spec:
containers:
-name:user-service
image:mycompany/user-service:v1.2.3
ports:
-containerPort:8080
resources:
limits:
cpu:"0.5"
memory:"512Mi"
requests:
cpu:"0.2"
memory:"256Mi"
livenessProbe:
httpGet:
path:/health
port:8080
initialDelaySeconds:30
periodSeconds:10
云原生架构像乐高城市。每个应用都是一个乐高积木(容器),可以随时添加或移除。有一个智能管理系统(Kubernetes)负责决定每个积木放在哪里,需要多少个相同的积木。城市有自动化的交通系统(服务网格)、自我修复能力(弹性系统)和全方位的监控摄像头(可观测性)。整个城市可以根据人流量自动扩展或收缩(动态扩缩容)。
5. 无服务架构(Serverless Architecture)
无服务架构(Serverless)架构将应用进一步分解为更细粒度的函数,运行在由云提供商管理的计算环境中。开发者无需关心服务器的管理和扩展,只需编写和部署代码,按实际使用量付费。
无服务架构主要包含两种核心服务模式:
-
函数即服务(FaaS):如AWS Lambda、Azure Functions,开发者编写事件触发的函数
-
后端即服务(BaaS):如Firebase、AWS AppSync,提供现成的后端服务
无服务架构的工作流程如下:

-
事件源(如HTTP请求、数据库变更)触发函数执行
-
云服务提供商动态分配资源运行函数
-
函数执行完毕后释放资源
-
开发者只需关注业务逻辑,无需管理基础设施
技术组件:

-
函数运行时:AWS Lambda、Azure Functions、GCP Cloud Functions
-
API网关:管理和路由HTTP请求到函数
-
身份认证:管理用户认证和授权
-
数据存储:托管数据库和对象存储
-
事件总线:事件源和触发器管理
-
边缘计算网络:内容分发和计算下沉
优势:运维、自动扩缩容和按需计费,大幅降低开发成本,开发者可以专注业务逻辑。
劣势:启动慢(尤其第一次),调试复杂,容易与云厂商“绑死”;实时性要求高或长期运行的场景成本激增。
适用场景:
-
突发流量或低频任务(如秒杀、临时活动)
-
事件驱动+短时任务(如文件处理、消息通知)
-
快速试错与原型开发(MVP验证)
-
轻量级云服务集成(云AI/DB调用)
-
免运维需求团队(初创公司/小团队)
-
定时/后台任务(数据备份、爬虫)
适用总结:低频 + 短时 + 突发 + 事件触发
AWS Lambda图片处理示例:
// AWS Lambda函数 - 图片处理服务
exports.handler = async (event) => {
const AWS = require('aws-sdk');
const sharp = require('sharp');
// 初始化S3客户端
const s3 = new AWS.S3();
// 获取触发事件的桶名和文件名
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
try {
// 从S3获取原始图片
const originalImage = await s3.getObject({
Bucket: bucket,
Key: key
}).promise();
// 使用sharp处理图片 - 创建缩略图
const thumbnail = await sharp(originalImage.Body)
.resize(200, 200, { fit: 'inside' })
.toBuffer();
// 上传缩略图到S3
const thumbnailKey = `thumbnails/${key.split('/').pop()}`;
await s3.putObject({
Bucket: bucket,
Key: thumbnailKey,
Body: thumbnail,
ContentType: 'image/jpeg'
}).promise();
console.log(`成功为 ${key} 创建缩略图`);
return {
statusCode: 200,
body: JSON.stringify({
message: '图片处理成功',
thumbnail: thumbnailKey
})
};
} catch (error) {
console.error('图片处理失败:', error);
return {
statusCode: 500,
body: JSON.stringify({
message: '图片处理失败',
error: error.message
})
};
}
};
无服务架构类似于租用一个共享办公空间,你只在需要开会时才付费。你不需要维护办公室,不需要考虑水电费,在需要时预订会议室,用完即走,按使用时间付费。云提供商负责所有的"后勤工作",你只需要专注于你的"会议内容"(业务逻辑)。这种方式特别适合不频繁但重要的会议(低频任务),或者临时突发的需求(突发流量)。
整体对比
通过上述架构特点描述,总结对比如下:
|
架构类型 |
复杂度 |
扩展性 |
开发速度 |
维护成本 |
适合团队规模 |
最佳应用场景 |
|---|---|---|---|---|---|---|
|
分层架构 |
低-中 |
中 |
快 |
低 |
小-中型 |
企业内部应用 |
|
微服务 |
高 |
高 |
中 |
高 |
中-大型 |
复杂互联网应用 |
|
事件驱动 |
中-高 |
高 |
中 |
中-高 |
中型 |
实时数据处理 |
|
云原生 |
高 |
极高 |
中 |
中-高 |
中-大型 |
需高弹性的应用 |
|
无服务 |
中 |
极高 |
极快 |
低 |
小型 |
低频高突发场景 |
03.写在最后
在实际项目中,主流架构往往采用混合模式灵活组合,如:微服务 + 云原生 、微服务 + 事件驱动、微服务 + 云原生 + 事件驱动,具体选型需根据业务规模、团队能力和技术需求综合评估。
而对于开发者而言,掌握架构设计能力,既能让你的代码更加优雅,还能让你在技术道路上走得更远。
无论你是刚入行的新手,还是经验丰富的老兵,都值得花时间深入学习软件架构。在软件世界中,架构不仅是技术,更是艺术。
如果觉得内容不错,不妨点赞、收藏、分享,你的支持是我持续输出干货的动力!你现在对软件架构有什么疑问?或者你在实践中遇到了哪些架构难题?欢迎在评论区留言或私信交流!
推荐阅读:一个月拿下软考架构师!
ps: 最近在备考架构师的伙伴,可以关注方才!方才在24年5月仅备考一个月便拿下架构师,会持续分享有价值的备考经验和技术文章,我相信对你一定有帮助,也可以扫码加入备考交流群。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)