环境:SpringBoot2.7.18 + SpringCloud Gateway2021.0.7
1. 简介
Spring Cloud Gateway是Spring Cloud生态系统中的官方API网关解决方案,它构建在Spring Framework 5、Spring Boot以及Project Reactor之上,旨在为微服务架构提供动态路由、监控、弹性、请求限流、路径重写、过滤等功能。作为Zuul的替代方案,Spring Cloud Gateway具备非阻塞、异步的特性,能够处理高并发的请求。
Spring Cloud Gateway提供了灵活的网关解决方案,允许开发者通过简单的配置实现路由、负载均衡、安全认证、限流、监控和日志等功能。它支持多种路由策略,包括基于路径、请求参数、请求头、主机等的路由,并预置了许多常用的过滤器,如请求限流、熔断器等,也支持自定义过滤器。
Spring Cloud Gateway基于Actuator提供了一些非常实用的API帮助管理API接口。引入Actuator依赖后就可以直接使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 实战案例
2.1 查看路由详细信息
Spring Cloud Gateway添加了一种新的、更详细的格式。它为每个路由添加了更多的细节,让你可以查看与每个路由关联的谓词和过滤器以及任何可用的配置。接口/actuator/gateway/route的示例如下:
[
{
"predicate": "Paths: [/cloud-gateway/**], match trailing slash: true",
"metadata": {
"nacos.instanceId": null,
"nacos.weight": "1.0",
"nacos.cluster": "DEFAULT",
"nacos.ephemeral": "true",
"nacos.healthy": "true",
"management.port": "8188",
"preserved.register.source": "SPRING_CLOUD"
},
"route_id": "ReactiveCompositeDiscoveryClient_cloud-gateway",
"filters": [
"[[StripPrefix parts = 1], order = 1]",
"[[RewritePath /cloud-gateway/?(?<remaining>.*) = '/${remaining}'], order = 1]"
],
"uri": "lb://cloud-gateway",
"order": 0
},
...
]
通过如下配置可以关闭此功能
spring:
cloud:
gateway:
actuator:
verbose:
enabled: false
2.2 全局过滤器查看
要查看应用于路由的全局过滤器,通过接口/actuator/gateway/globalfilters以 GET方式请求。示例如下:
{
"org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@1d1deb11": 2147483646,
"org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter@221961af": 10150,
"org.springframework.cloud.gateway.filter.ForwardRoutingFilter@1cfb7450": 2147483647,
"org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@1e288c76": -2147483648,
"org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@738ed8f5": 10000,
"org.springframework.cloud.gateway.filter.GatewayMetricsFilter@18d1d137": 0,
"com.pack.common.filters.SecondFilter@38874eb5": 0,
"com.pack.gray.loadbalancer.GrayReactiveLoadBalancerClientFilter@76b019c4": 10150,
"org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@41463c56": -2147482648,
"org.springframework.cloud.gateway.filter.LoadBalancerServiceInstanceCookieFilter@32ddcca": 10151,
"org.springframework.cloud.gateway.filter.NettyRoutingFilter@1ddc8fc": 2147483647,
"com.pack.common.filters.BrushProofFilter@55202ba6": -2,
"org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@77d58f3a": -1,
"com.pack.common.filters.FirstFilter@2ef1fc8a": 1,
"org.springframework.cloud.gateway.filter.ForwardPathFilter@478c84aa": 0
}
每一个过滤器后的数字是该过滤器的执行顺序,值越小,越先执行。
2.3 路由过滤器
要获取应用在路由上的GatewayFilter工厂,通过接口/actuator/gateway/routefilters 以GET方式请求,示例如下:
图片
以上包括了系统默认的及自定义的网关过滤器工厂【CustomGatewayFilterFactory】。
2.4 路由刷新
要清除路由缓存,通过接口/executor/gateway/refresh 以POST方式请求。该请求返回一个没有响应体的200。
图片
当首次访问路由时会通过RouteLocator进行路由的查找,而这个具体实现是通过CachingRouteLocator进行查找路由,查找到路由以后会将其缓存在Map集合中。该RouteLocator是个监听程序,会监听RefreshRoutesEvent事件,当收到该事件后会重新获取路由进行缓存。
2.5 获取定义的路由
要获取网关中定义的路由,通过接口/executor/gateway/routes以GET方式请求。
[
{
"predicate": "Paths: [/cloud-gateway/**], match trailing slash: true",
"metadata": {
"nacos.instanceId": null,
"nacos.weight": "1.0",
"nacos.cluster": "DEFAULT",
"nacos.ephemeral": "true",
"nacos.healthy": "true",
"management.port": "8188",
"preserved.register.source": "SPRING_CLOUD"
},
"route_id": "ReactiveCompositeDiscoveryClient_cloud-gateway",
"filters": [
"[[StripPrefix parts = 1], order = 1]",
"[[RewritePath /cloud-gateway/?(?<remaining>.*) = '/${remaining}'], order = 1]"
],
"uri": "lb://cloud-gateway",
"order": 0
},
...
]
字段说明:
属性 | 类型 | 描述 |
route_id | String | 路由id |
route_object.predicate | Object | 路由谓词 |
route_object.filters | Array | 应用于路由的 GatewayFilter 工厂 |
order | Number | 路由顺序 |
2.6 获取特定路由信息
要获取单个路由的信息,通过接口 /actuator/gateway/routes/{id}(例如,/actuator/gateway/routes/first_route)以GET方式请求。示例如下:
图片
字段说明:
属性 | 类型 | 描述 |
id | String | 路由ID |
predicates | Array | 路由谓词集合。每项都定义了给定谓词的名称和参数 |
filters | Array | 应用于路线的过滤器集合 |
uri | String | 路由的目标 URI |
order | Number | 路由顺序 |
2.7 创建&删除路由
要创建路由,通过接口/gateway/routes/{id_route_to_create}以POST方式请求,请求内容为指定路由字段的 JSON 格式(请参阅 2.6)。
要删除路由,通过接口 /gateway/routes/{id_route_too_delete}以DELETE方式请求。
创建路由
图片
查询创建的路由
图片
注意:默认创建的路由是存储在内存中的,重启服务后就没有了。
删除路由
2.8 路由共享
Spring Cloud Gateway 提供两种 RouteDefinitionRepository 实现。第一种是 InMemoryRouteDefinitionRepository,它只存在于一个网关实例的内存中。这种类型的存储库不适合在多个网关实例中填充路由。
为了在 Spring Cloud Gateway 实例集群中共享路由,可以使用 RedisRouteDefinitionRepository。要启用此类存储库,必须将以下属性设置为 true:spring.cloud.gateway.redis-route-definition-repository.enabled 与 RedisRateLimiter 筛选器工厂一样,它也需要使用 spring-boot-starter-data-redis-reactive 。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
开启Redis存储功能
spring:
cloud:
gateway:
redis-route-definition-repository:
enabled: true