1 引言
Spring Cloud Gateway 是 Spring Cloud 生态系统中的一部分,它是一个基于 Spring Framework 构建的 API 网关解决方案,用于构建微服务架构中的路由、过滤和转发请求,是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。它的主要作用和意义包括:
1.路由和转发:
路由管理:Gateway 可以将传入的请求路由到不同的微服务。这通过定义路由规则来实现,这些规则可以基于请求的路径、头信息或其他条件来决定请求应该被转发到哪个服务。
请求转发:一旦确定了目标服务,Gateway 将请求转发到相应的服务,并将响应返回给客户端。
2.安全性:
认证和授权:Gateway 可以集中处理安全性需求,如基于令牌的认证、OAuth2 认证等,确保只有经过授权的请求才能访问后端服务。
SSL/TLS 终止:可以在 Gateway 级别处理 SSL/TLS,减轻后端服务的负担,提高性能和安全性。
3.负载均衡:
请求分发:通过集成 Ribbon 或 Spring Cloud LoadBalancer,Gateway 可以实现请求的负载均衡,确保请求能够平均分配到多个实例上,提高系统的可用性和性能。
4.限流和熔断:
流量控制:通过内置的限流器(如 Redis RateLimiter),Gateway 可以限制对后端服务的访问频率,防止服务过载。
熔断机制:集成 Hystrix 或 Resilience4j 等熔断器,可以在后端服务失败时提供后备处理,防止级联失败。
6.API 聚合和组合:
请求聚合:可以将多个微服务的响应组合成一个单一的响应返回给客户端,简化客户端的调用逻辑。
请求修改:在请求被转发之前,可以对请求进行修改(如添加或修改头信息),或在响应返回之前对响应进行修改。
7.监控和日志记录:
集中日志:通过集成 Sleuth 和 Zipkin,Gateway 可以收集并记录所有通过网关的请求和响应的信息,便于监控和问题追踪。
指标监控:与 Prometheus 或其他监控系统集成,可以实时监控网关的性能和健康状况。
8.易于扩展和维护:
动态路由配置:通过配置中心(如 Spring Cloud Config),可以动态地更新路由规则,无需重启应用。
插件化架构:Spring Cloud Gateway 的设计允许通过添加自定义过滤器轻松扩展功能。
总之,Spring Cloud Gateway 通过提供高效、安全和灵活的路由、过滤和转发机制,极大地简化了微服务架构中的API管理任务,帮助开发者构建可伸缩、可靠且易于维护的系统。
2 什么是微服务网关?
微服务网关是位于服务之前或者应用程序之前的一个切面,用于保护、增强和控制微服务的访问。
其常见的作用有:
- 鉴权校验:验证是否认证和授权
- 统一入口:提供所有微服务的入口点,起到隔离作用,保障服务的安全性
- 限流熔断
- 路由转发
- 负载均衡
- 链路追踪
3 网关如何选型?
至于为什么使用Gateway而放弃Zuul?
SpringCloud 生态提供了两种API网关产品,分别是Netflix开源的Zuu1和Spring自己开发的SpringCloud Gateway,SpringCloud以Finchely版本为分界线,之前版本使用Zuul作为API网关,之后更推荐使用Gateway。
Netflix已经在2018年开源了Zuul2,但是SpringCloud已经推出了Gateway,并且在github标识没有集成Zuul2的计划。
SpringCloud Gateway和Zuul对比及技术选型?
4 快速入门
示例代码对应:
sc-gateway-demo01
本小节我们来对 Spring Cloud Gateway 进行快速入门。创建一个sc-gateway-demo01
项目,最终项目结构如下图:
4.1 引入依赖
创建 pom.xml 文件中,主要引入 Spring Cloud Gateway 相关依赖。代码如下:
<properties>
<spring.boot.version>3.4.4</spring.boot.version>
<spring.cloud.version>2024.0.1</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.1.2</spring.cloud.alibaba.version>
</properties>
<!--
引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope