Skip to content

微服务整体架构认知

1.1 单体架构的问题

传统单体应用通常把所有功能都放在一个项目中:

text
用户模块
订单模块
库存模块
支付模块
营销模块
后台管理模块

这些模块最终被打包成一个应用,例如:

text
mall-system.jar

单体架构的优点是:

text
开发简单
部署简单
调用简单
适合小项目

但当业务变复杂后,问题会越来越明显:

text
1. 代码越来越大,维护困难
2. 模块之间耦合严重
3. 一个模块出问题,可能影响整个系统
4. 无法针对某个模块单独扩容
5. 多团队协作容易互相影响
6. 发布一次需要重新部署整个系统

1.2 微服务架构是什么?

微服务架构会把一个大系统拆分成多个小服务。

例如商城系统可以拆成:

text
用户服务 user-service
订单服务 order-service
库存服务 stock-service
支付服务 payment-service
网关服务 gateway-service

每个服务都是一个独立的 Spring Boot 应用。

它们之间通过 HTTP、RPC、消息队列等方式进行通信。

典型结构:

text
用户请求

Spring Cloud Gateway

order-service

stock-service

payment-service

1.3 微服务带来的新问题

微服务拆分之后,也会引入新的技术问题。

1.3.1 服务地址怎么管理?

以前单体项目只有一个地址:

text
localhost:8080

微服务之后可能有很多地址:

text
user-service    192.168.1.11:8081
order-service   192.168.1.12:8082
stock-service   192.168.1.13:8083
payment-service 192.168.1.14:8084

而且服务可能会扩容:

text
order-service 192.168.1.12:8082
order-service 192.168.1.15:8082
order-service 192.168.1.16:8082

所以需要一个注册中心。

在 Spring Cloud Alibaba 中,通常使用:

text
Nacos Discovery

1.3.2 配置怎么统一管理?

每个服务都有自己的配置:

text
端口
数据库地址
Redis 地址
开关配置
业务参数
限流规则
日志级别

如果配置散落在每个服务本地,修改起来很麻烦。

所以需要配置中心。

在 Spring Cloud Alibaba 中,通常使用:

text
Nacos Config

1.3.3 服务之间怎么调用?

订单服务要调用库存服务,如果直接写 RestTemplate,会比较麻烦:

java
restTemplate.getForObject("http://stock-service/stock/reduce", String.class);

更优雅的方式是声明一个接口,让 Spring 帮我们生成远程调用代理。

在 Spring Cloud 中,通常使用:

text
OpenFeign

1.3.4 接口流量太大怎么办?

如果某个接口突然被大量访问,服务可能被打崩。

需要限流组件来保护服务。

在 Spring Cloud Alibaba 中,通常使用:

text
Sentinel

1.3.5 下游服务挂了怎么办?

例如订单服务调用库存服务,如果库存服务挂了,订单服务不能一直卡死。

需要熔断降级机制:

text
下游异常过多

暂时熔断

快速失败或返回兜底数据

等待一段时间后尝试恢复

在 Spring Cloud Alibaba 中,也通常使用:

text
Sentinel

1.3.6 前端怎么访问多个服务?

前端不应该直接访问很多微服务:

text
http://user-service/user/info
http://order-service/order/list
http://stock-service/stock/list

一般会统一访问网关:

text
http://gateway-service/api/user/info
http://gateway-service/api/order/list
http://gateway-service/api/stock/list

网关负责:

text
统一入口
统一鉴权
统一跨域
统一日志
统一转发
统一限流
统一上下文透传

在 Spring Cloud 中,通常使用:

text
Spring Cloud Gateway

1.4 本笔记的最终实战架构

我们最终会搭建下面几个服务:

text
nacos-server
sentinel-dashboard

gateway-service      网关服务,端口 9000
order-service        订单服务,端口 8081
stock-service        库存服务,端口 8082

调用链路:

text
浏览器 / Postman

gateway-service

order-service

OpenFeign

stock-service

上下文透传链路:

text
请求头 X-Request-Id
请求头 X-User-Id
请求头 X-Tenant-Id

gateway-service

order-service Controller

order-service Feign RequestInterceptor

stock-service Controller

Released under the MIT License.