# 01.微服务-架构认识
# 1.架构演进总览
| 架构阶段 | 核心技术 | 核心思想 | 拆分方式 |
|---|---|---|---|
| 单体架构 | ORM | 大一统 | 所有模块在一个进程内 |
| 垂直架构 | MVC | 按业务线拆分 | 拆成多个独立单体应用 |
| 分布式服务架构 | RPC | 前后端 + 服务拆分 | 按 “前后端 + 服务层” 拆分 |
| SOA 架构 | ESB/Dubbo | 服务总线统一治理 | 面向服务、依赖 ESB 总线 |
| 微服务架构 | Spring Cloud | 去中心化、服务自治 | 按领域拆成小而独立的微服务 |
# 2.各架构的优缺点与区别
- 单体架构(ORM 阶段)
核心特点:
- 一个工程包,包含前端、后端、数据库访问所有代码
- 部署方式:打成一个 war/jar 包,扔到服务器运行
- 典型技术栈:SSM、Spring Boot 单应用
优点:
- 开发、测试、部署都极简单,无分布式复杂度
- 性能高:进程内调用,无网络开销
- 运维成本低:只需要维护一个服务
缺点:
- 全部功能集成在一个工程中,对于大型项目来讲不易开发和维护
- 项目模块之间紧密耦合,单点容错率低
- 无法针对不同模块进行优化和扩展
- 垂直架构(MVC 阶段)
核心特点
- 按业务线拆分,比如电商拆成「用户系统、订单系统、商品系统」
- 每个业务线都是独立的单体应用,互不依赖
- 典型技术栈:多套独立的 SSM/Spring Boot 项目
优点:
- 实现了流量分担,解决了并发问题,可以针对不同模块进行优化和扩展
- 一个系统的问题不会影响到其他系统,提高容错率
缺点:
- 系统之间相互独立,无法进行相互调用,会有重复的开发任务
- 分布式服务架构(RPC 阶段)
核心特点:
- 把「前后端应用」和「通用服务层」拆分
- 公共服务(如用户、订单、支付)下沉为独立服务,供多个上层应用调用
- 典型技术:Dubbo、Thrift 等 RPC 框架
优点:
- 公共服务复用,解决了垂直架构的重复开发问题
- 服务可以独立部署、扩容,粒度比垂直架构更细
- 前后端应用和服务解耦,服务升级不影响上层应用
缺点:
- 依赖复杂: 随着服务增多,服务之间的调用关系错综复杂,系统耦合度高,难以维护。
- SOA 架构(ESB/Dubbo 阶段)
核心特点:
- 面向服务架构,引入 ESB(企业服务总线) 做统一治理
- 所有服务调用都经过总线,由总线做路由、协议转换、监控
- 典型技术:Dubbo + ESB、WebService
优点:
- 通过注册中心和ESB解决了服务间调用的自动调节和统一管理问题。(不限语言)
缺点:
服务间有依赖关系,一旦某个环节出错影响较大(服务雪崩)
服务关系复杂,运维困难
- 微服务架构(Spring Cloud 阶段)
核心特点:
- 按领域驱动设计(DDD) 拆分为小而自治的微服务
- 去中心化治理,无统一总线,服务之间通过轻量级协议(HTTP/REST)通信
- 每个微服务独立开发、部署、扩容,甚至可以用不同技术栈
- 典型技术:Spring Cloud / Spring Cloud Alibaba 生态
优点:
- 服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展
- 微服务之间采用Restful等轻量级http协议相互调用
缺点:
- 复杂度极高,带来了分布式事务、数据一致性、链路追踪、服务熔断等一系列技术挑战。
- 运维成本暴涨,需要完善的自动化运维基建(如容器化K8s、CI/CD流水线)支撑。
微服务架构与SOA架构的不同
| 维度 | SOA (面向服务的架构) | 微服务架构 |
|---|---|---|
| 核心目标 | 企业异构系统集成与复用 | 敏捷开发、快速迭代与弹性扩展 |
| 通信中枢 | ESB (企业服务总线),中心化治理 | 轻量级API (REST/gRPC),去中心化 |
| 服务粒度 | 较粗,按业务领域划分 | 极细,严格遵循单一职责 |
| 数据存储 | 倾向于共享数据库 | 每个服务拥有独立数据库 |
| 部署方式 | 集中式部署 (虚拟机/物理机) | 独立部署,高度适配容器化(K8s) |
微服务架构比SOA架构粒度会更加精细,让专业的人去做专业的事情,目的提高效率,每个服务与服务之间互不影响。
微服务架构中,每个服务必须独立部署。
微服务架构更加轻巧。
SOA架构中可能数据库存储发生共享,微服务强调每个服务是单独的数据库。
# 3.微服务架构的常见问题
这么多小服务,如何管理他们?(服务治理注册中心[服务注册发现剔除])nacos
这么多小服务,他们之间如何通讯?(restful rpc dubbo feign)httpclient("url",参数),springBoot restTemplate("url",参数),,feign
这么多小服务,客户端怎么访问他们?(网关)gateway
这么多小服务,一旦出现问题了,应该如何自处理? (容错)
这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)
以上这些下面都会一一学习