对 Gateway 的理解
Gateway(网关)是客户端和后端服务之间的中间层,处理请求的路由、协议转换、负载均衡、安全认证、限流、监控等功能。它充当系统的“入口”,统一管理外部请求与内部服务的交互;
在现实中的具体应用场景:
- 电商平台:
- 场景:一个电商系统包含用户服务、订单服务、商品服务和支付服务。客户端需要调用多个服务获取数据。
- 网关作用:
- 路由:将 /api/product 请求路由到商品服务。
- 认证:验证用户 JWT token,确保只有登录用户才能下单。
- 聚合:将商品详情和库存信息从不同服务聚合为一个响应。
- 限流:在促销活动期间限制每秒请求数,防止服务过载。
- 高并发场景(如秒杀系统):
- 场景:秒杀活动中,短时间内涌入大量请求,可能导致后端服务崩溃。
- 网关作用:
- 限流:限制每个用户每秒的请求数。
- 缓存:将热门商品的静态数据缓存到网关,减少后端压力。
- 降级:在服务不可用时返回默认响应(如“活动已结束”)。
什么是断言
网关用于判断请求是否匹配特定路由规则的条件。网关接收到客户端请求后,会根据断言的匹配结果决定将请求路由到哪个后端服务。
什么是过滤器
网关用于处理请求的组件。过滤器可以在请求到达后端服务之前或响应返回客户端之前执行自定义操作,例如修改请求头、认证、限流、日志记录等。过滤器分为前置过滤器和后置过滤器。
断言决定“路由到哪里”,过滤器决定“路由前后做什么”。
什么是 Nacos
提供分布式配置管理、服务注册与发现,适合动态配置和多环境管理。
Nacos 的使用场景
- 微服务架构的服务注册与发现:
- 场景:在微服务系统中,服务实例动态上下线,需要自动发现可用服务。
- Nacos 作用:电商系统中的订单服务和支付服务通过 Nacos 注册和发现。
- 优势:支持负载均衡。
- 动态配置管理:
- 场景:应用程序需要频繁更新配置(如数据库连接、日志级别)而无需重启。
- Nacos 作用:在促销活动中动态调整限流阈值。
- 优势:支持版本管理和快速回滚,降低配置变更风险。
- 高并发系统的流量控制:
- 场景:高流量场景(如秒杀活动)需要负载均衡和流量分配。
- Nacos 作用:基于用户 ID 分片将流量分配到不同集群。
- 优势:提高系统稳定性和扩展性。
- 服务网格:
- 场景:在复杂微服务系统中,需要管理服务间通信。
- Nacos 作用:作为注册中心和配置中心,与服务网格集成,管理服务发现和配置。
- 优势:提供统一的控制平面,简化服务治理。
总体架构
分为客户端和服务端两部分:
- 服务端:基于 Spring Boot 构建,核心是一个高可用的分布式系统,支持多节点集群部署。
- 客户端:供应用接入服务注册、配置管理等功能。
- 数据存储:支持多种存储方式,包括内置的嵌入式数据库(如 Derby)和外部数据库(如 MySQL),以及 协议实现分布式一致性。
核心功能实现原理
(1) 服务注册与发现
- 服务注册:
- 服务启动后自动注册到 Nacos,控制台可查看服务列表。
- 客户端通过 Nacos 服务端注册服务实例,包含服务名、IP、端口等信息。
- 服务端将实例信息存储在内存中,并通过一致性协议(如 Raft 或 Distro)同步到集群其他节点。
- 注册信息支持临时实例(基于心跳机制)和持久化实例(存储到数据库)。
- 服务发现:
- 消费者通过服务名调用提供者,结合 OpenFeign 或 Ribbon 实现负载均衡。
- 客户端通过 Nacos 查询服务列表,服务端返回可用实例信息。
(2) 配置管理
修改 Nacos 控制台配置,服务端通过 @RefreshScope 注解动态刷新配置。
- 配置存储:
- 配置数据存储在数据库(如 MySQL)或内存中,通过一致性协议同步到集群节点。
- 配置动态更新:
- 客户端订阅配置,服务端通过长连接(如 HTTP 长轮询)实时推送配置变更。
- 客户端监听到变更后,自动更新本地缓存并触发应用逻辑。
- 版本管理和回滚:
- Nacos 记录配置的历史版本,支持快速回滚。
- 配置变更通过事件机制通知所有订阅客户端。
3. 一致性协议
Nacos 提供两种一致性协议,满足不同场景需求:
- Distro 协议(AP 模式):
- 用于临时实例的注册与发现,强调高可用性和分区容错性。
- 各节点独立处理读写请求,通过异步同步实现最终一致性。
- 适合高并发、低延迟的服务注册场景。
- Raft 协议(CP 模式):
- 用于配置管理和持久化实例,强调强一致性。
- 通过 Leader 选举和日志复制,确保集群节点数据一致。
- 适合对数据一致性要求高的场景,如配置管理。
4. 高可用与扩展性
- 集群部署:Nacos 支持多节点集群,通过一致性协议实现数据同步。
- 负载均衡:服务端内置负载均衡策略,分担客户端请求压力。
- 容错机制:支持节点故障自动切换,客户端可自动重连其他可用节点。
- 可扩展性:支持插件机制,可扩展一致性协议、存储方式等。
5. 客户端工作原理
- SDK 集成:客户端通过 Java、Go、Python 等语言的 SDK 集成 Nacos 功能。
- 本地缓存:客户端缓存服务实例和配置信息,减少服务端压力。
- 心跳机制:临时实例通过心跳保持活跃,超时未续约的实例会被剔除。
- 长连接:客户端与服务端通过长连接(如 gRPC)实现实时更新。
6. 关键技术点
- 事件驱动:Nacos 使用事件机制(如观察者模式)处理配置变更、服务实例更新等。
- 长轮询:配置管理中,客户端通过 HTTP 长轮询监听配置变更,降低轮询频率。
- 权限控制:Nacos 提供基于角色的权限管理(RBAC),确保配置和服务的安全性。