Spring Cloud Gateway 网关非常实用的八个开发技巧,太实用了

开发 前端
Spring Cloud Gateway 提供两种 RouteDefinitionRepository 实现。第一种是 InMemoryRouteDefinitionRepository,它只存在于一个网关实例的内存中。这种类型的存储库不适合在多个网关实例中填充路由。

环境: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
责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2022-12-01 16:53:27

NPM技巧

2010-09-01 13:55:14

CSS

2024-03-27 14:06:58

Python代码开发

2023-12-27 14:04:00

Spring框架参数

2016-05-10 10:16:13

JavaScript技巧

2022-03-18 21:27:36

Python无代码

2021-05-19 15:06:44

MySQL数据库命令

2020-05-28 08:59:40

Python机器学习开发

2023-09-21 12:37:34

IDEA

2021-12-11 23:13:16

Python语言技巧

2022-11-01 15:57:44

2024-08-27 12:18:23

函数Python

2022-12-15 16:38:17

2020-09-23 09:13:47

Docker

2022-12-16 17:01:15

Web API开发

2011-05-19 13:15:44

PHP

2024-12-20 17:29:34

SpringBootAOP开发

2017-09-05 08:57:02

Linux命令行技巧

2022-08-11 09:00:31

Audio APIWeb

2025-01-16 08:17:36

点赞
收藏

51CTO技术栈公众号