从单体架构到微服务为什么需要 Nacos 和 Gateway前言大家好我是小尤。在传统项目开发中我们经常看到一个 Spring Boot 项目直接连接数据库然后提供接口给前端调用。例如前端 | | Spring Boot | | MySQL这种架构在项目初期完全没有问题。但是随着业务越来越复杂一个项目可能包含用户模块商品模块订单模块支付模块库存模块如果全部写在一个项目里面代码会越来越庞大。于是很多企业开始采用微服务架构将一个大的系统拆分成多个独立服务。例如前端 | | API Gateway | ------------------------------------------------ | | | | 用户服务 商品服务 订单服务 支付服务但是拆成微服务之后又产生了新的问题服务之间怎么找到对方服务地址变化怎么办配置文件怎么统一管理前端请求应该访问哪个服务于是出现了NacosGateway这两个非常重要的组件。一、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 后是什么样引入 NacosNacos | 保存所有服务信息 | --------------------------------- | | | 用户服务 商品服务 订单服务服务启动的时候主动告诉 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 微服务项目的整体架构。