Spring Cloud Gateway 网关非常实用的8个开发技巧,你知道吗?太实用了

文摘   科技   2024-12-27 08:02   新疆  

Spring Boot 3实战案例合集》现已囊括超过70篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境: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_idString
路由id
route_object.predicateObject
路由谓词
route_object.filtersArray应用于路由的 GatewayFilter 工厂
orderNumber
路由顺序


2.6 获取特定路由信息

要获取单个路由的信息,通过接口 /actuator/gateway/routes/{id}(例如,/actuator/gateway/routes/first_route)以GET方式请求。示例如下:

字段说明:

属性
类型
描述
idString
路由ID
predicatesArray
路由谓词集合。每项都定义了给定谓词的名称和参数
filtersArray
应用于路线的过滤器集合
uriString路由的目标 URI
orderNumber
路由顺序


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 Boot 通过@JsonComponent注解完全控制JSON数据

11条提高Redis性能的技巧

强大!基于 Spring Boot 事件处理4种高级用法,最后一个你一定不知道

太强了!SpringBoot结合Camel实现各种协议路由规则定义

3个经典案例,详解Spring Boot实时推送技术

几个强大的Spring Boot扩展点

考察你对 Spring 基本功掌握能力

提升性能:Java工程师必备的20条SQL最佳实践

自己动手实现精简版SpringBoot原来如此简单

确保Spring Boot定时任务只执行一次方案

Spring Boot REST API版本控制的方案及选择

运行时修改 Spring Boot 属性的N种方式

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章