Spring Cloud Gateway简介
这个项目为在 Spring WebFlux 或 Spring WebMVC 之上构建 API 网关提供了库。Spring Cloud Gateway 旨在提供一种简单但有效的方式来路由到 API,并为它们提供诸如安全性、监控/指标和弹性等方面的横切关注点。
Spring Cloud Gateway 的特性:
- 基于 Spring 框架和 Spring Boot
- 能够根据任何请求属性匹配路由。
- 断言和过滤器特定于路由。
- 断路器集成。
- Spring Cloud DiscoveryClient 集成
- 易于编写断言和过滤器
- 请求速率限制
- 路径重写
1. 网关里面写了哪些代码?
-
跨域,路由(动态路由,负载均衡)ip 黑名单拦截,Token 的校验,对请求进行过滤(请求参数校验) 对响应做处理(状态码,响应头) 熔断 限流
-
微服务的网关,可以很好地将具体的服务和浏览器隔离开,只暴露网关的地址给到浏览器
-
在微服务网关中,可以很好的实现校验认证,负载均衡(lb),黑名单拦截,限流等。
GlobalCorsFilter全局的跨域配置
AuthFilter权限认证
BlackListUrlFilter黑名单过滤器
ForwardAuthFilter转发认证过滤器(内部服务外网隔离)
网关限流配置、自定义限流异常处理
路由配置信息
2. 有哪些常见的网关?
- 以下是几个常见的网关系统:
Spring Cloud Gateway:Spring Cloud Gateway 是基于 Spring Framework 5、Spring Boot 2 和 Project Reactor 等技术构建的网关系统。它提供了路由、过滤、负载均衡、熔断、限流等功能,可以作为微服务架构中的统一入口,实现请求的转发和管理。Spring Cloud Gateway 是一个轻量级的网关解决方案,易于集成和扩展。
Netflix Zuul:Zuul 是由 Netflix 开发的网关系统,属于 Netflix OSS(Open Source Software)家族的一员。它提供了路由、过滤、负载均衡等功能,可以与 Eureka、Ribbon、Hystrix 等 Netflix 开源组件集成使用。Zuul 1.x 版本基于 Servlet 技术栈实现,而 Zuul 2.x 版本采用了 Netty 作为底层实现。
Kong:Kong 是一个快速、可扩展和分布式的开源 API 网关,它基于 Nginx 构建,并提供了管理界面和插件系统。Kong 支持动态路由、认证授权、限流、监控等功能,可以与多种后端服务(如微服务、数据库等)进行集成,使用方便简单。
Traefik是一个现代HTTP反向代理和负载均衡器,它提供了强大的路由、负载均衡、健康检查等功能。Traefik支持多种后端服务(如Docker、Swarm、Kubernetes等),并且可以自动动态配置。此外,Traefik还提供了丰富的中间件插件,可以方便地实现各种功能,如限流、熔断、认证等。Traefik适用于容器化部署的微服务架构,特别是需要与Kubernetes等容器编排工具集成的场景。
- 以上是一些常见的网关系统,它们都提供了类似的基本功能,包括路由转发、负载均衡、认证授权、限流、监控等。选择适合自身需求的网关系统时,可以根据具体的技术栈、性能要求、可扩展性和社区支持等因素进行评估和选择。
3. 开发过程中经常使用的路由断言有哪些
- Path 断言:根据请求的路径进行匹配。例如:
Path=/api/user
表示只有当请求路径是/api/user
时才匹配。 - Method 断言:基于 HTTP 请求方法(如 GET、POST、PUT 等)进行匹配。比如:
Method=GET
仅匹配 GET 请求。 - Header 断言:通过请求头的键值对进行匹配。比如:
Header=X-Requested-With, XMLHttpRequest
,当请求头中有X-Requested-With
且值为XMLHttpRequest
时匹配。 - Query 断言:依据请求参数进行匹配。例如:
Query=param1, value1
,当请求中包含参数param1
且值为value1
时匹配。 - Cookie 断言:根据 Cookie 的键值对来匹配。比如:
Cookie=sessionId, 123456
,当 Cookie 中有名为sessionId
且值为123456
时匹配。 - Host 断言:基于请求的主机名进行匹配。例如:
Host=example.com
,只有请求的主机是example.com
时才匹配。
4. Gateway的优缺点是什么?
- 统一入口:提供了统一的API入口,对外隐藏了微服务的细节实现。
- 动态路由:能够根据请求的路径、类型等条件动态地将请求路由到不同的后端服务。
- 过滤器:可以通过过滤器对请求进行修改、验证、日志记录等操作。
- 集成服务发现和负载均衡:能够与服务发现组件和负载均衡组件集成,实现动态的服务发现和负载均衡。
- 安全性:支持安全相关的功能,如认证、授权等。
- 监控和指标:提供了监控和指标的功能,可以对网关的性能进行监控和分析。
缺点:
- 单点故障:网关成为了系统的单点故障,一旦网关出现问题,整个系统的访问都会受到影响。(可以将多个网关实例部署在不同的服务器上,通过负载均衡器来分发流量,从而避免单点故障的问题)
- 性能开销:网关需要处理大量的请求转发和过滤操作,可能会带来一定的性能开销。
- 复杂性:配置和管理网关可能会增加系统的复杂性,特别是在处理大规模微服务的情况下。
- 学习成本:使用和定制网关可能需要一定的学习成本,特别是对于初学者来说。
5. Spring Cloud Gateway支持限流吗?
Spring Cloud Gateway 自带了限流过滤器,对应的接口是 RateLimiter
,RateLimiter
接口只有一个实现类 RedisRateLimiter
(基于 Redis + Lua 实现的限流),提供的限流功能比较简易且不易使用。
Spring Cloud Gateway 可以结合 Sentinel 来实现限流。
从 Sentinel 1.6.0 版本开始,Sentinel 引入了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:route 维度和自定义 API 维度。也就是说,Spring Cloud Gateway 可以结合 Sentinel 实现更强大的网关流量控制。
Sentinel 是一个强大的流量控制组件,能够为 Spring Cloud Gateway 提供更精细和灵活的限流策略。
在实现过程中,需要进行相关的配置和整合。首先,引入 Sentinel 和 Spring Cloud Gateway 相关的依赖。然后,配置 Sentinel 的规则,例如针对特定的路由设置每秒允许的请求数、并发数等。
6. Spring Cloud Gateway 路由断言是什么?
断言就是对一个表达式进行 if 判断,结果为真或假,如果为真则做这件事,否则做那件事。
在 Gateway 中,如果客户端发送的请求满足了断言的条件,则映射到指定的路由器,就能转发到指定的服务上进行处理。
断言配置的示例如下,配置了两个路由规则,有一个 predicates 断言配置
spring:
cloud:
# 网关配置
gateway:
# 打印请求日志(自定义)
requestLog: true
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
# 认证中心
- id: yuan-auth
uri: lb://yuan-auth
# 断言
predicates:
- Path=/auth/**
filters:
# 验证码处理
- ValidateCodeFilter
- StripPrefix=1
# 系统模块
- id: yuan-system
uri: lb://yuan-system
# 断言
predicates:
- Path=/system/**
filters:
- StripPrefix=1
# 资源服务
- id: yuan-resource
uri: lb://yuan-resource
# 断言
predicates:
- Path=/resource/**
filters:
- StripPrefix=1