Spring cloud Gateway 配置详解

这篇具有很好参考价值的文章主要介绍了Spring cloud Gateway 配置详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Cloud Gateway 的核心功能:

断言(Predicate):参照 Java8 的新特性Predicate,允许开发人员匹配 HTTP 请求中的任何内容,比如请求头或请求参数,最后根据匹配结果返回一个布尔值。 路由(route):由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则转发到该路由。 过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容。

1、路由 Route

Route 主要由 路由id、目标uri、断言集合和过滤器集合组成,那我们简单看看这些属性到底有什么作用。 (1)id:路由标识,要求唯一,名称任意(默认值 uuid,一般不用,需要自定义) (2)uri:请求最终被转发到的目标地址 (3)order: 路由优先级,数字越小,优先级越高 (4)predicates:断言数组,即判断条件,如果返回值是boolean,则转发请求到 uri 属性指定的服务中 (5)filters:过滤器数组,在请求传递过程中,对请求做一些修改

2、断言 Predicate

Predicate 来自于 Java8 的借口。Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。 Predicate 可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。Spring Cloud Gateway 内置了许多 Predict,这些 Predict 的源码在 org.springframework.cloud.gateway.handler.predicate 包中,有兴趣可以阅读一下

3、过滤器 filter

Gateway 过滤器的生命周期: PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。 POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。 Gateway 过滤器从作用范围可分为两种: GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置) GlobalFilter:应用到所有的路由上(无需配置,全局生效) (1)局部过滤器 GatewayFilter: Spring Cloud Gateway 中内置了许多的局部过滤器;局部过滤器需要在指定路由配置才能生效,默认是不生效的

(2)自定义局部过滤器: 虽说内置的过滤器能够解决很多场景,但是难免还是有些特殊需求需要定制一个过滤器,下面就来介绍一下如何自定义局部过滤器。

(3) GlobalFilter 全局过滤器: 全局过滤器应用全部路由上,无需开发者配置,Spring Cloud Gateway 也内置了一些全局过滤器。GlobalFilter 的功能其实和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是绑定在指定的路由配置上。多个 GlobalFilter 可以通过 @Order 或者 getOrder() 方法指定执行顺序,order值越小,执行的优先级越高。 注意,由于过滤器有 pre 和 post 两种类型,pre 类型过滤器如果 order 值越小,那么它就应该在pre过滤器链的顶层,post 类型过滤器如果 order 值越小,那么它就应该在 post 过滤器链的底层

(4) 过滤器规则(Filter)

过滤规则 实例 说明 PrefixPath - PrefixPath=/app 在请求路径前加上app RewritePath - RewritePath=/test, /app/test 访问localhost:9022/test,请求会转发到localhost:8001/app/test SetPath SetPath=/app/{path} 通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径 RedirectTo 重定向 RemoveRequestHeader 去掉某个请求头信息 注:当配置多个filter时,优先定义的会被调用,剩余的filter将不会生效

4、Predicate 断言条件(转发规则)介绍

每一个Predicate的使用,你可以理解为:当满足这种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

Path 方式匹配转发

通过Path转发示例,我们讲解下上面的两种配置,分别是application.yml以及RouteLocator。

配置文件匹配地址转发

我们在application.yml配置文件内添加对应的路由配置,如下所示:

spring:

application:

name: spring-cloud-gateway-sample

cloud:

gateway:

routes:

- id: blog

uri: http://blog.xx.com

predicates:

# 匹配路径转发

- Path=/api-boot-datasource-switch.html

# 端口号

server:

port: 9090

先来解释下route的组成部分:

id:路由的ID uri:匹配路由的转发地址 predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。 在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.xx.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。

访问效果如下所示:

spring-cloud-gateway-path-predicate.png

RouteLocator 匹配路径转发

在上面的配置中,如果使用RouteLocator方式该怎么进行配置呢?

如下所示:

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("blog", r ->
r.path("/api-boot-datasource-switch.html").uri("http://blog.xx.com"))
.build();
}

Before 方式匹配转发

当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]

在上面配置中,我们允许2019-05-01日凌晨之前通过路由转发到​ ​http://blog.xx.com​​,通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud Gateway的Before断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

After 方式匹配转发

After Predicate与Before配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- After=2019-04-29T00:00:00+08:00[Asia/Shanghai]

在上面配置中允许2019-04-29凌晨之后进行转发到​ ​http://blog.xx.com​​。

Between 方式匹配转发

那如果是一个时间段内允许请求转发,通过Before、After组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]

在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发到​ ​http://blog.xx.com​​。

Cookie 方式匹配转发

Spring Cloud Gateway 还提供了根据Cookie值的方式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Cookie=hengboy, leo

在上面配置中,如果客户端发送请求时携带了"hengboy=leo"的Cookie信息,则允许请求转发。

测试Cookie方式转发:

curl http://localhost:9090 --cookie "hengboy=leo" 通过上面方式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致无法转发,出现404。

Header 方式匹配转发

Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Header=X-Request-Id, \d+

在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到​ ​http://blog.xx.com​​,我们通过如下方式进行测试:

curl http://localhost:9090 -H "X-Request-Id:123456" 如果头信息为X-Request-Id:abc时,就会转发失败,出现404。

Host 方式匹配转发

Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许\\.xx.com域名进行访问,那么配置如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Host=\*\*.xx.com

测试如下所示:

1. curl http://localhost:9090 -H "Host: xx.com" // 匹配
2. curl http://localhost:9090 -H "Host: api.xx.com" // 匹配
3. curl http://localhost:9090 -H "Host: admin.xx.com" // 匹配
4. curl http://localhost:9090 -H "Host: hengboy.com" // 不匹配

请求方式 方式匹配转发

Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允许POST请求访问,那么配置如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Method=POST

发送GET请求测试:

~ curl http://localhost:9090

{"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null} 我们的请求并未被Spring Cloud Gateway进行转发,那么我们再来通过POST请求进行测试:

curl -X POST http://localhost:9090 是可以被转发到目标地址uri的,不过我的这个博客是OSS部署的,阿里云限制了POST访问,尽管如此我们也证明了可以转发。

请求参数 方式匹配转发 Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

请求中存在xxx参数 cloud: gateway: routes: - id: blog uri: ​ ​http://blog.xx.com​​predicates: - Query=xxx 我们通过curl ​​http://localhost:9090​​\?xxx\=123是可以被成功转发的,只要参数存在xxx就会被成功转发,否则出现404转发失败。

请求中存在xxx参数且值为zzz cloud: gateway: routes: - id: blog uri: ​ ​http://blog.xx.com​​predicates: - Query=xxx, zzz 根据上面配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。

请求路径 方式匹配转发 Spring Cloud Gateway提供了请求路径变量方式匹配转发,如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Path=/article/{articleId}

在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1、/article/abc等,测试如下所示:

~ curl http://localhost:9090/article/1 // 匹配
~ curl http://localhost:9090/article/abc // 匹配
~ curl http://localhost:9090/article/1/1 // 不匹配

请求IP 方式匹配转发

Spring Cloud Gateway可以限制允许访问接口的客户端IP地址,配置后只对指定IP地址的客户端进行请求转发,配置如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- RemoteAddr=192.168.1.56/24

在上面我们配置了192.168.1.56/24,其中192.168.1.56是客户端的IP地址,而24则是子网掩码。

组合示例

相同的Predicate也可以配置多个,请求的转发是必须满足所有的Predicate后才可以进行路由转发,组合使用示例如下所示:

spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Query=author, hengboy
- Query=leo
- Method=GET
- Cookie=hengboy, leo
- Header=X-Request-Id, \d+
- RemoteAddr=192.168.1.56/24

总结

本章节讲解了Spring Cloud Gateway的相关谓词、断言基本使用方式,GateWay内部提供了很多种灵活的路由转发规则,在同一个路由内存在多个Predicate时,同时满足规则后请求才会被路由转发。文章来源地址https://www.toymoban.com/news/detail-485504.html

到了这里,关于Spring cloud Gateway 配置详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud Gateway 过滤器详解

    Spring Cloud Gateway根据作用范围划分为:GatewayFilter和GlobalFilter 由filter工作流程点,可以知道filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输

    2023年04月08日
    浏览(40)
  • Spring Cloud Gateway 路由配置策略

    Spring Cloud Gateway 是一个基于 Spring Boot 2.x 和 Spring WebFlux 的轻量级网关服务,用于构建微服务架构中的 API 网关。它提供了一种简单、高效、灵活和可扩展的方式来路由请求到后端的微服务。 Spring Cloud Gateway 的核心特性包括: 路由功能:可以根据请求的属性(路径、参数等)将

    2024年01月20日
    浏览(42)
  • Spring Cloud Gateway:配置HTTP超时

    可以为所有路由配置HTTP超时(响应和连接),并针对每个特定路由进行覆盖配置。 1.全局超时时间配置 您可以为Spring Cloud Gateway配置全局的超时时间,以应用于所有路由。这样可以确保所有请求在特定时间内完成,无论是否针对每个路由进行了单独的超时配置。 要配置全局

    2024年02月16日
    浏览(36)
  • spring cloud gateway中配置uri

    gateway中配置uri配置有三种方式: websocket方式:uri: ws://localhost:9000 http方式: uri: http://localhost:8130/ lb注册中心配置方式(注册的服务名称): uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则:

    2024年02月12日
    浏览(41)
  • 【Spring Cloud】Gateway的配置与使用

    Gateway其实是 springcloud 原生 的东西,但是我还是想放在这里讲,因为我们使用nacos时,前端调用服务之后,一般会调用到我们的网关上面,然后网关选择我们的nacos服务,再调用后端的服务 在当今微服务架构中,网关起着至关重要的角色。它充当着应用程序和外部世界之间的

    2024年02月09日
    浏览(35)
  • Spring Cloud Gateway过滤器GlobalFilter详解

    一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守卫就可以做很多工作,比如对来访

    2024年02月14日
    浏览(41)
  • spring cloud gateway跨域配置CORS Configuration

    表象看:浏览器上的 IP,域名,端口 和你页面内请求的IP,域名,端口 之间组合不一致。这说法不够严谨,但不是本文的重点,更多概念自行检索。 spring-cloud-gateway3.x.x为例 官方说明 Spring Cloud Gateway 配置参数说明:CorsConfiguration (Spring Framework 5.0.20.RELEASE API)    附中文文档说明

    2024年02月13日
    浏览(43)
  • Spring Cloud Gateway GlobalFilter(全局过滤器)详解(官方原版)

    GlobalFilter接口具有与GatewayFilter相同的签名。这些是有条件地应用于所有路由的特殊过滤器。 当请求与路由匹配时,过滤web处理程序会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链中。这个组合过滤器链由org.springframework.core.Ordered接口排序,您可以通

    2024年02月09日
    浏览(45)
  • 【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

    目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关

    2023年04月16日
    浏览(55)
  • Spring Cloud Gateway系例—参数配置(CORS 配置、SSL、元数据)

    你可以配置网关来控制全局或每个路由的 CORS 行为。两者都提供同样的可能性。 “global” CORS配置是对 Spring Framework CorsConfiguration 的URL模式的映射。下面的例子配置了 CORS。 Example 77. application.yml 在前面的例子中,对于所有GET请求的路径,允许来自 docs.spring.io 的请求的CORS请求

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包