微服务架构
微服务是什么?一文看懂微服务架构、原理与应用场景
微服务(Microservices) 是一种将大型应用拆分成多个相对独立的小型服务的架构方式。每个服务通常围绕一个明确的业务能力进行设计,可以独立开发、部署和扩展,并通过网络接口与其他服务进行通信。
一句话理解
微服务 = 把一个很大的应用,拆成多个可以独立运行的小应用。
例如一个电商系统,如果采用传统单体架构,可能是:
电商系统
├── 用户
├── 商品
├── 订单
├── 支付
├── 库存
└── 营销
而微服务架构会将它拆分成:
电商系统
│
┌────────┼───────────┐
↓ ↓ ↓
用户服务 商品服务 订单服务
↓ ↓ ↓
支付服务 库存服务 营销服务
每个服务负责自己的业务,并可以独立运行。
基础信息
项目 | 内容 |
|---|---|
中文名称 | 微服务 |
英文名称 | Microservices |
类型 | 软件架构风格 |
核心思想 | 将大型系统拆分为多个独立服务 |
服务特点 | 独立开发、独立部署、独立扩展 |
服务通信 | HTTP、RPC、消息队列等 |
常见组件 | API Gateway、服务注册中心、配置中心、消息队列 |
常见技术 | Spring Boot、Spring Cloud、Docker、Kubernetes |
适用场景 | 大型系统、复杂业务、高并发、分布式系统 |
什么是微服务?
微服务是一种软件架构思想。
它的核心思想是:
将一个复杂的大型应用拆分成多个职责明确、相对独立的服务。
例如一个 AI 平台可能包含:
- 用户系统
- 登录认证
- AI 对话
- Prompt 管理
- 模型管理
- 文件管理
- 知识库
- 资源管理
- 支付系统
- 消息系统
如果全部写在一个项目中:
AI平台
│
├── 用户
├── AI对话
├── Prompt
├── 知识库
├── 文件
├── 模型
├── 资源
├── 支付
└── 消息
随着系统不断发展,代码会越来越复杂。
采用微服务后,可以拆成:
API Gateway
│
┌──────────┼───────────────┐
↓ ↓ ↓
用户服务 AI服务 知识库服务
│ │ │
↓ ↓ ↓
用户数据库 AI数据库 向量数据库
每个服务负责自己的业务领域。
为什么需要微服务?
微服务并不是为了“把项目拆得越多越好”。
它主要是为了解决大型单体应用发展过程中遇到的问题。
1. 单体项目越来越复杂
早期项目可能只有:
用户
商品
订单
一个 Spring Boot 项目完全可以解决。
但随着业务发展:
用户
商品
订单
支付
库存
营销
物流
会员
消息
搜索
推荐
所有代码都放在一起,就会越来越难维护。
2. 不同业务需要独立扩展
例如:
商品服务
每天 10 万请求
AI 服务
每天 1000 万请求
如果采用单体架构,就可能需要整个系统一起扩容。
微服务可以只扩展 AI 服务:
AI服务
├── Instance 1
├── Instance 2
├── Instance 3
├── Instance 4
└── Instance 5
而其他服务保持原来的规模。
3. 独立部署
单体架构中:
修改订单功能
↓
重新部署整个系统
微服务架构中:
修改订单服务
↓
只部署订单服务
这样可以降低部分业务修改对其他模块的影响。
微服务的核心特点
1. 服务独立
每个微服务通常负责一个相对明确的业务能力。
例如:
用户服务 → 用户相关业务
订单服务 → 订单相关业务
支付服务 → 支付相关业务
2. 独立部署
每个服务可以单独打包和部署。
例如:
user-service.jar
order-service.jar
payment-service.jar
其中一个服务升级时,不一定需要重新部署整个系统。
3. 独立扩展
如果某个服务压力特别大,可以单独增加实例。
例如:
订单服务
↓
Instance 1
Instance 2
Instance 3
Instance 4
4. 服务之间通过网络通信
微服务之间通常不是直接调用对方代码,而是通过网络进行通信。
例如:
订单服务
↓
HTTP / RPC
↓
库存服务
常见通信方式包括:
- HTTP
- REST API
- RPC
- gRPC
- 消息队列
微服务架构是怎么工作的?
一个典型的微服务系统可能是:
用户
↓
Nginx
↓
API Gateway
↓
┌────────────┼───────────────┐
↓ ↓ ↓
用户服务 订单服务 商品服务
↓ ↓ ↓
MySQL MySQL MySQL
如果订单服务需要查询商品:
订单服务
↓
调用商品服务
↓
商品服务
↓
返回商品信息
如果订单创建成功后需要扣库存:
订单服务
↓
发送消息
↓
库存服务
↓
扣减库存
因此,一个完整的微服务系统通常还需要很多基础设施。
微服务的核心组件
微服务本身并不是一个具体的软件。
它是一种架构。
为了让大量服务能够正常运行,通常需要配套的基础设施。
1. API Gateway
API Gateway,即 API 网关。
它可以作为系统统一的入口。
例如:
用户
↓
API Gateway
↙ ↓ ↘
用户服务 订单服务 AI服务
网关通常可以负责:
- 请求路由
- 身份认证
- 权限控制
- 限流
- 日志
- 请求转发
- API 聚合
这样前端不需要直接知道所有微服务的地址。
2. 服务注册与发现
当系统有很多服务时:
user-service
order-service
payment-service
inventory-service
服务实例可能动态增加或者减少。
这时候需要一种机制,让服务能够找到其他服务。
例如:
注册中心
↙ ↓ ↘
用户服务 订单服务 商品服务
服务启动时向注册中心登记:
订单服务
IP:10.0.0.10
Port:8080
其他服务需要调用订单服务时,可以向注册中心查询。
3. 配置中心
微服务通常有大量配置:
数据库地址
Redis地址
消息队列地址
第三方API
服务配置
如果每个服务都维护自己的配置:
user-service → 配置
order-service → 配置
payment-service → 配置
维护起来会比较麻烦。
配置中心可以统一管理:
配置中心
↙ ↓ ↘
用户服务 订单服务 支付服务
4. 负载均衡
一个服务可能运行多个实例:
订单服务
├── Instance 1
├── Instance 2
└── Instance 3
如果所有请求都访问 Instance 1,就无法充分利用其他服务器。
负载均衡可以将请求分配到不同实例:
请求
↓
负载均衡
↙ ↓ ↘
Instance1 Instance2 Instance3
这样可以提高系统吞吐量和可用性。
5. 消息队列
微服务之间并不一定都需要同步调用。
例如订单创建完成后,需要发送通知:
订单服务
↓
消息队列
↓
通知服务
订单服务不需要一直等待通知服务完成。
常见消息队列包括:
- Kafka
- RabbitMQ
- RocketMQ
消息队列可以用于:
- 异步处理
- 服务解耦
- 流量削峰
- 消息通知
- 事件驱动
6. 分布式缓存
微服务系统通常也会使用 Redis。
例如:
用户服务
↓
Redis
↓
MySQL
Redis 可以用于:
- 缓存
- Session
- 分布式锁
- 计数
- 排行榜
- 临时数据
7. 分布式链路追踪
微服务最大的一个问题之一就是:
一次请求可能经过很多服务。
例如:
用户
↓
网关
↓
用户服务
↓
订单服务
↓
库存服务
↓
支付服务
如果请求出现异常,很难直接知道:
到底是哪一个服务出了问题?
因此微服务系统通常需要链路追踪。
可以将一次请求串起来:
Trace ID
↓
Gateway
↓
User Service
↓
Order Service
↓
Inventory Service
↓
Payment Service
这样可以快速定位问题。
微服务之间如何通信?
主要可以分为两种。
同步通信
例如订单服务调用商品服务:
订单服务
↓
HTTP / RPC
↓
商品服务
↓
返回结果
订单服务需要等待商品服务返回结果。
常见方式:
- HTTP
- REST API
- RPC
- gRPC
异步通信
例如订单创建后发送消息:
订单服务
↓
消息队列
↓
库存服务
订单服务发送消息之后,不一定需要等待库存服务立即返回。
这种方式可以降低服务之间的耦合。
微服务如何进行服务拆分?
这是微服务设计中非常重要的问题。
并不是:
一个 Controller 拆成一个服务。
正确的思路应该是:
按照业务领域进行拆分。
例如电商系统:
电商平台
│
├── 用户服务
├── 商品服务
├── 订单服务
├── 库存服务
├── 支付服务
└── 物流服务
AI 平台也可以:
AI平台
│
├── 用户服务
├── AI对话服务
├── Prompt服务
├── 模型服务
├── 文件服务
├── 知识库服务
└── 资源服务
每个服务应该具有相对明确的业务边界。
微服务为什么强调“业务边界”?
如果服务之间互相依赖太严重:
A服务
↓
B服务
↓
C服务
↓
D服务
↓
A服务
就容易形成复杂的依赖关系。
结果可能变成:
虽然拆成了微服务,但实际上比单体项目还复杂。
因此微服务设计中非常重要的一点就是:高内聚、低耦合。
什么是高内聚、低耦合?
高内聚
一个服务内部的功能应该尽可能围绕同一个业务领域。
例如订单服务:
订单创建
订单查询
订单取消
订单状态
这些功能都属于订单领域。
低耦合
不同服务之间应该尽量减少不必要的依赖。
例如:
订单服务
↓
库存服务
订单服务只需要调用库存服务提供的接口,而不应该直接操作库存服务的数据库。
微服务为什么通常强调“数据库独立”?
一个常见原则是:
每个微服务拥有自己的数据边界。
例如:
用户服务 → 用户数据库
订单服务 → 订单数据库
商品服务 → 商品数据库
库存服务 → 库存数据库
而不是:
所有服务
↓
同一个数据库
如果所有服务直接访问同一个数据库,那么服务之间仍然存在非常强的耦合。
微服务中的分布式事务
当系统拆成多个服务后,一个业务操作可能涉及多个数据库。
例如下单:
订单服务
↓
创建订单
库存服务
↓
扣库存
支付服务
↓
创建支付订单
这三个操作可能分别属于不同服务。
如果:
创建订单 → 成功
扣库存 → 成功
支付 → 失败
就需要考虑数据如何保持最终一致。
因此微服务系统需要考虑:
- 本地事务
- 消息队列
- 最终一致性
- TCC
- Saga
- 事务消息等方案
具体选择取决于业务场景。
微服务中的容错
分布式系统中,一个服务出现问题可能影响其他服务。
例如:
订单服务
↓
支付服务
↓
支付服务宕机
如果订单服务一直等待:
等待
↓
等待
↓
等待
↓
线程耗尽
最终可能导致订单服务也出现问题。
因此微服务通常需要:
- 超时
- 重试
- 限流
- 熔断
- 降级
- 隔离
什么是服务熔断?
假设支付服务出现故障。
如果订单服务持续请求:
订单服务
↓↓↓↓↓↓↓↓↓
支付服务
×
可能导致故障不断扩大。
熔断机制可以暂时停止对故障服务的调用:
订单服务
↓
熔断器
↓
支付服务
×
经过一段时间后,再尝试恢复请求。
这样可以防止故障进一步扩散。
什么是服务降级?
当某个服务无法正常提供完整功能时,可以提供一个简化版本。
例如:
正常情况下:
推荐服务
↓
个性化推荐
推荐服务出现问题时:
推荐服务异常
↓
返回热门内容
虽然功能降低了,但整个系统仍然可以使用。
这就是服务降级。
微服务和单体架构有什么区别?
对比 | 单体架构 | 微服务架构 |
|---|---|---|
系统结构 | 一个整体 | 多个独立服务 |
部署 | 整体部署 | 服务独立部署 |
扩展 | 通常整体扩展 | 可以独立扩展 |
服务通信 | 代码内部调用 | 网络调用 |
数据库 | 常见共享数据库 | 倾向于服务数据边界独立 |
开发复杂度 | 相对简单 | 较复杂 |
运维复杂度 | 较低 | 较高 |
故障定位 | 相对简单 | 更复杂 |
适合 | 中小型系统 | 大型、复杂系统 |
微服务的优点
1. 独立部署
一个服务升级,不一定需要重新部署整个系统。
2. 独立扩展
可以针对高负载服务单独扩容。
3. 技术栈更加灵活
不同服务可以根据业务需要选择合适的技术。
4. 降低大型项目复杂度
通过业务边界拆分大型系统。
5. 团队可以并行开发
不同团队可以负责不同服务。
例如:
团队A → 用户服务
团队B → AI服务
团队C → 知识库服务
团队D → 资源服务
微服务的缺点
微服务并不是“高级版单体架构”,它也会带来大量额外复杂度。
1. 系统复杂度提高
原来:
一个应用
现在:
10个服务
20个服务
50个服务
需要管理大量服务。
2. 网络通信带来问题
服务之间通过网络通信,因此可能出现:
- 网络延迟
- 网络故障
- 超时
- 重试
- 服务不可用
3. 运维更加复杂
需要管理:
- 服务部署
- 日志
- 监控
- 链路追踪
- 服务发现
- 配置
- 容器
- 集群
4. 分布式事务更复杂
单体应用中的事务可能比较简单。
微服务中,一个业务可能跨越多个服务和数据库。
5. 调试更加困难
一个请求可能经过:
Gateway
↓
A服务
↓
B服务
↓
C服务
↓
D服务
出现问题后需要追踪完整链路。
微服务常见技术栈
Java 生态中的一个典型微服务技术栈可以是:
前端
↓
Nginx
↓
API Gateway
↓
Spring Boot
↓
微服务
↓
MySQL / Redis
↓
Kafka / RabbitMQ
↓
Docker
↓
Kubernetes
不同项目的技术选型会有所不同。
例如 Java 项目常见技术包括:
- Spring Boot
- Spring Cloud
- Spring Cloud Gateway
- Nacos
- Redis
- MySQL
- Kafka
- RabbitMQ
- Docker
- Kubernetes
微服务和 Docker、Kubernetes 有什么关系?
这三个概念经常一起出现,但它们并不是同一种东西。
微服务
解决:
应用应该如何拆分?
Docker
解决:
应用如何进行标准化打包和运行?
Kubernetes
解决:
大量容器如何部署、管理、扩缩容?
可以理解为:
微服务
↓
拆分应用
↓
Docker
↓
打包服务
↓
Kubernetes
↓
管理大量服务实例
微服务适合什么项目?
微服务更适合:
- 大型互联网平台
- 电商系统
- SaaS 平台
- AI 平台
- 金融系统
- 大型企业系统
- 高并发系统
- 业务复杂的平台
例如一个大型 AI 平台可能存在:
用户服务
AI对话服务
模型服务
Prompt服务
知识库服务
文件服务
支付服务
消息服务
这时候微服务架构就可能比较合适。
什么项目不适合微服务?
如果只是一个简单的网站:
登录
文章
评论
后台管理
用户量也不大。
这时候直接使用:
React
+
Spring Boot
+
MySQL
+
Redis
可能就已经足够。
没有必要为了“使用微服务”而强行拆分。
微服务不是越多越好
这是学习微服务时非常重要的一点。
错误的思路:
“我们的系统要先进,所以拆成 100 个微服务。”
更合理的思路是:
根据业务边界和系统实际规模进行拆分。
例如刚开始:
Spring Boot 单体应用
随着业务发展:
单体
↓
模块化单体
↓
部分服务拆分
↓
微服务
↓
分布式系统
微服务应该是解决实际问题的手段,而不是项目本身的目标。
一个 AI 平台的微服务示例
假设 AI学习猫未来需要支持大量用户、AI对话、知识库和资源服务,可以设计为:
用户
↓
API Gateway
↓
┌────────────┼───────────────┐
↓ ↓ ↓
用户服务 AI服务 内容服务
↓ ↓ ↓
MySQL Redis MySQL
│
┌───────────┼────────────┐
↓ ↓ ↓
LLM API RAG服务 Prompt服务
↓
向量数据库
同时还可以增加:
文件服务
资源服务
消息服务
搜索服务
管理服务
最终形成完整的平台架构。
常见问题 FAQ
微服务是什么?
微服务是一种软件架构方式,将一个大型应用拆分成多个职责明确、可以相对独立运行和部署的服务。
微服务和单体架构哪个好?
没有绝对的好坏。小型项目通常单体架构更加简单,大型、复杂、高并发系统则可能更适合微服务。
微服务一定要使用 Spring Cloud 吗?
不一定。Spring Cloud 是 Java 生态中常见的微服务解决方案,但微服务是一种架构思想,并不依赖某一个框架。
微服务一定需要 Docker 吗?
不一定。Docker 非常适合微服务部署,但微服务本身并不要求必须使用 Docker。
微服务一定要有 Kubernetes 吗?
也不一定。Kubernetes 主要用于容器编排和集群管理。小规模微服务系统完全可以使用其他部署方式。
一个服务应该多大?
没有固定标准。通常应该按照业务能力和领域边界拆分,而不是按照代码文件数量拆分。
微服务可以共享数据库吗?
技术上可以,但如果所有服务都直接访问同一个数据库,会增加服务之间的耦合。更常见的设计是让服务拥有相对独立的数据边界,并通过 API 或消息进行数据交互。
微服务适合个人项目吗?
如果项目规模很小,通常没有必要。个人项目优先考虑简单、易维护的架构,随着业务规模增长再逐步拆分服务。
总结
微服务是一种面向大型、复杂系统的软件架构方式。
它的核心思想可以概括为:
按照业务能力,将一个大型应用拆分成多个相对独立的服务。
一个完整的微服务体系通常包括:
微服务架构
│
├── 服务拆分
├── API Gateway
├── 服务注册与发现
├── 配置中心
├── 负载均衡
├── 服务通信
├── 消息队列
├── 分布式缓存
├── 分布式事务
├── 熔断与降级
├── 日志与监控
└── 链路追踪
微服务最大的价值不是“把一个项目拆成很多项目”,而是:
让大型系统能够按照业务边界进行独立开发、部署、扩展和维护。
但与此同时,微服务也会引入网络通信、分布式事务、服务治理、监控运维等新的复杂度。
因此实际项目中应该遵循:业务需要 → 合理拆分 → 独立部署 → 服务治理 → 持续演进
而不是为了使用微服务而使用微服务。
相关知识
- 单体架构
- 分布式系统
- SOA
- Spring Boot
- Spring Cloud
- API Gateway
- 服务注册与发现
- 负载均衡
- Docker
- Kubernetes
- Redis
- 消息队列
- Kafka
- RabbitMQ
- 分布式事务
- 服务熔断
- 服务降级
- 链路追踪
延伸阅读
如果想系统学习微服务,可以按照下面的路线:
Java基础 → Spring Boot → MySQL → Redis → HTTP/API → Spring Cloud → 服务注册与发现 → API Gateway → 配置中心 → 服务通信 → 消息队列 → 分布式事务 → 服务熔断与降级 → Docker → Kubernetes → 微服务架构设计
这样可以从单体应用开发逐渐过渡到真正的分布式系统开发。