微服务整体架构认知
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-service1.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 Discovery1.3.2 配置怎么统一管理?
每个服务都有自己的配置:
text
端口
数据库地址
Redis 地址
开关配置
业务参数
限流规则
日志级别如果配置散落在每个服务本地,修改起来很麻烦。
所以需要配置中心。
在 Spring Cloud Alibaba 中,通常使用:
text
Nacos Config1.3.3 服务之间怎么调用?
订单服务要调用库存服务,如果直接写 RestTemplate,会比较麻烦:
java
restTemplate.getForObject("http://stock-service/stock/reduce", String.class);更优雅的方式是声明一个接口,让 Spring 帮我们生成远程调用代理。
在 Spring Cloud 中,通常使用:
text
OpenFeign1.3.4 接口流量太大怎么办?
如果某个接口突然被大量访问,服务可能被打崩。
需要限流组件来保护服务。
在 Spring Cloud Alibaba 中,通常使用:
text
Sentinel1.3.5 下游服务挂了怎么办?
例如订单服务调用库存服务,如果库存服务挂了,订单服务不能一直卡死。
需要熔断降级机制:
text
下游异常过多
↓
暂时熔断
↓
快速失败或返回兜底数据
↓
等待一段时间后尝试恢复在 Spring Cloud Alibaba 中,也通常使用:
text
Sentinel1.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 Gateway1.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