从单体架构到微服务:为什么需要 Nacos 和 Gateway?
前言
大家好!我是小尤~。在传统项目开发中,我们经常看到一个 Spring Boot 项目直接连接数据库,然后提供接口给前端调用。
例如:
前端 | | Spring Boot | | MySQL这种架构在项目初期完全没有问题。
但是随着业务越来越复杂,一个项目可能包含:
- 用户模块
- 商品模块
- 订单模块
- 支付模块
- 库存模块
如果全部写在一个项目里面,代码会越来越庞大。
于是很多企业开始采用:
微服务架构
将一个大的系统拆分成多个独立服务。
例如:
前端 | | API Gateway | ------------------------------------------------ | | | | 用户服务 商品服务 订单服务 支付服务但是拆成微服务之后,又产生了新的问题:
- 服务之间怎么找到对方?
- 服务地址变化怎么办?
- 配置文件怎么统一管理?
- 前端请求应该访问哪个服务?
于是出现了:
- Nacos
- Gateway
这两个非常重要的组件。
一、Nacos 是什么?
Nacos 是一个服务发现和配置管理平台。
官方定位:
Nacos 主要解决服务发现、服务配置管理等问题。 ([Nacos 官网][1])
简单理解:
Nacos 就是微服务世界里的“通讯录 + 配置中心”。
它主要有两个作用:
- 服务注册与发现
- 配置管理
二、为什么需要服务注册中心?
假设没有 Nacos。
现在有:
订单服务 需要调用 用户服务订单服务可能直接写:
http://192.168.1.10:8080/user刚开始没问题。
但是生产环境:
用户服务可能部署多个:
user-service 192.168.1.10:8080 192.168.1.11:8080 192.168.1.12:8080那么问题来了:
订单服务到底调用哪个?
如果某台服务器挂了怎么办?
如果新增服务器怎么办?
没有注册中心的问题
每个服务自己维护地址:
订单服务 知道用户服务地址 商品服务 知道用户服务地址 支付服务 知道用户服务地址结果:
每增加一个服务:
所有地方都需要修改。
维护成本非常高。
三、有 Nacos 后是什么样?
引入 Nacos:
Nacos | 保存所有服务信息 | --------------------------------- | | | 用户服务 商品服务 订单服务服务启动的时候:
主动告诉 Nacos:
我是 user-service 地址: 192.168.1.10:8080Nacos 保存:
user-service 实例1: 192.168.1.10:8080 实例2: 192.168.1.11:8080当订单服务需要调用用户服务:
不会直接找 IP。
而是:
订单服务 | | 询问 Nacos "user-service在哪里?" | | Nacos返回地址这个过程叫:
服务发现
四、Nacos 如何保证服务可用?
Nacos 有健康检查机制。
例如:
用户服务启动:
注册 user-service 192.168.1.10然后定期发送:
heartbeat 我还活着如果:
超过时间没有响应Nacos 会认为:
服务不可用 删除实例避免其他服务继续调用故障机器。
五、Nacos 第二个作用:配置中心
除了服务发现,Nacos 还有一个非常重要的功能:
配置管理
以前:
每个服务都有:
application.yml
例如:
用户服务:
mysql:url:xxxredis:host:xxx订单服务:
mysql:url:xxxredis:host:xxx商品服务:
mysql:url:xxxredis:host:xxx如果数据库地址变化。
需要修改几十个服务。
使用 Nacos:
统一保存:
Nacos shop-prod.yaml mysql: url: xxx redis: host: xxx所有服务启动:
从 Nacos 获取配置。
结构:
Nacos 配置中心 | ----------------------------- | | | 用户服务 商品服务 订单服务六、Gateway 是什么?
如果说:
Nacos 是通讯录。
那么:
Gateway 就是公司前台。
它负责:
所有请求进入系统的统一入口。
没有 Gateway:
前端 | |------ 用户服务 | |------ 商品服务 | |------ 订单服务前端需要知道:
- 用户服务地址
- 商品服务地址
- 订单服务地址
非常麻烦。
有 Gateway:
前端 | | Gateway | -------------------------------- 用户服务 商品服务 订单服务前端只访问:
api.xxx.com所有请求进入 Gateway。
七、Gateway 的核心功能
1. 请求路由
例如:
用户请求:
/api/user/loginGateway:
/api/user/** | ↓ user-service订单:
/api/order/** | ↓ order-service2. 统一鉴权
如果没有 Gateway:
每个服务都判断:
Token 权限 登录状态例如:
用户服务判断一次 订单服务判断一次 商品服务判断一次代码重复。
有 Gateway:
请求 | Gateway | 检查Token | 通过 | 进入业务服务3. 限流
例如:
接口:
/api/pay突然大量请求。
Gateway 可以限制:
1秒最多1000次超过:
拒绝请求保护后端服务。
4. 日志记录
Gateway 可以统一记录:
请求用户 请求路径 响应时间 状态码方便排查问题。
八、Nacos 和 Gateway 是什么关系?
很多初学者容易混淆。
它们负责不同事情。
Nacos:
解决:
服务在哪里?
例如:
user-service 192.168.1.10Gateway:
解决:
请求应该去哪?
例如:
/user/** 发送给 user-service组合起来:
前端 | ↓ Gateway | ↓ 查询 Nacos | ↓ 找到 user-service | ↓ 用户服务九、企业常见微服务架构
实际项目中经常看到:
用户 | ↓ Gateway网关 | ↓ Nacos | ------------------------------------------------ 用户服务 商品服务 订单服务 | ↓ MySQL Redis技术组合:
Spring Boot Spring Cloud Spring Cloud Alibaba Nacos Gateway Feign Redis MySQL十、作为前端为什么需要了解?
虽然前端不会直接开发 Nacos。
但是日常开发经常会遇到:
1. 接口为什么404?
可能:
Gateway路由错误。
2. 后端服务为什么调用失败?
可能:
Nacos没有注册。
3. 测试环境接口为什么突然变化?
可能:
配置中心修改。
4. 为什么所有接口都是/api开头?
因为:
Gateway统一入口。
总结
微服务里面:
Nacos
负责:
服务注册 服务发现 配置管理一句话:
告诉系统“服务在哪里”。
Gateway
负责:
统一入口 请求路由 权限校验 限流 日志一句话:
决定“请求应该去哪里”。
最终关系:
Nacos 服务注册中心 ↑ | 前端 → Gateway → 微服务理解:
Nacos 管服务,Gateway 管请求。
掌握这两个组件,基本就能看懂大部分企业 Spring Cloud 微服务项目的整体架构。