学习猫学习猫
目录
微服务是什么?一文看懂微服务架构、原理与应用场景
一句话理解
基础信息
什么是微服务?
为什么需要微服务?
1. 单体项目越来越复杂
2. 不同业务需要独立扩展
3. 独立部署
微服务的核心特点
1. 服务独立
2. 独立部署
3. 独立扩展
4. 服务之间通过网络通信
微服务架构是怎么工作的?
微服务的核心组件
1. API Gateway
2. 服务注册与发现
3. 配置中心
4. 负载均衡
5. 消息队列
6. 分布式缓存
7. 分布式链路追踪
微服务之间如何通信?
同步通信
异步通信
微服务如何进行服务拆分?
微服务为什么强调“业务边界”?
什么是高内聚、低耦合?
高内聚
低耦合
微服务为什么通常强调“数据库独立”?
微服务中的分布式事务
微服务中的容错
什么是服务熔断?
什么是服务降级?
微服务和单体架构有什么区别?
微服务的优点
1. 独立部署
2. 独立扩展
3. 技术栈更加灵活
4. 降低大型项目复杂度
5. 团队可以并行开发
微服务的缺点
1. 系统复杂度提高
2. 网络通信带来问题
3. 运维更加复杂
4. 分布式事务更复杂
5. 调试更加困难
微服务常见技术栈
微服务和 Docker、Kubernetes 有什么关系?
微服务
Docker
Kubernetes
微服务适合什么项目?
什么项目不适合微服务?
微服务不是越多越好
一个 AI 平台的微服务示例
常见问题 FAQ
微服务是什么?
微服务和单体架构哪个好?
微服务一定要使用 Spring Cloud 吗?
微服务一定需要 Docker 吗?
微服务一定要有 Kubernetes 吗?
一个服务应该多大?
微服务可以共享数据库吗?
微服务适合个人项目吗?
总结
相关知识
延伸阅读

微服务架构

微服务是什么?一文看懂微服务架构、原理与应用场景

微服务(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 → 微服务架构设计

这样可以从单体应用开发逐渐过渡到真正的分布式系统开发。

评论
登录后参与讨论
暂无数据
还没有评论,来说点什么吧