Spring-cloud-gateway 路由配置方式及匹配规则

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

Spring-cloud-gateway 路由配置方式及匹配规则

1、路由配置⽅式

路由是⽹关配置的基本组成模块,和Zuul的路由配置模块类似。⼀个Route模块由⼀个 ID,⼀个⽬标 URI,⼀组断⾔和⼀组过滤器定义。如果断⾔为真,则路由匹配,⽬标URI会被访问。

1.1 基础路由配置⽅式

如果请求的⽬标地址,是单个的URI资源路径,配置⽂件实例如下:

spring:
    application:
      name: api-gateway 
    cloud: 
      gateway: 
        routes: 
          - id: service1 
            uri: https://blog.csdn.net 
            predicates: 
              - Path=/csdn

各字段含义如下。

  • id:我们⾃定义的路由 ID,保持唯⼀

  • uri:⽬标服务地址

  • predicates:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默

    认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。

上⾯这段配置的意思是,配置了⼀个 id 为 url-proxy-1的URI代理规则,路由的规则为,当访问地址

http://localhost:8080/csdn/1.jsp时,会路由到上游地址https://blog.csdn.net/1.jsp。

1.2 基于代码的路由配置⽅式

转发功能同样可以通过代码来实现,我们可以在启动类 GateWayApplication 中添加⽅法 customRouteLocator() 来定制转发规则。

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes().route("path_route", r -> r.path("/csdn").uri("https://blog.csdn.net")).build();
    }
}

1.3 和注册中⼼相结合的路由配置⽅式

在uri的schema协议部分为⾃定义的lb:类型,表示从微服务注册中⼼(如Eureka)订阅服 务,并且通过负载均衡进⾏服务的路由。代码如下。

server:
	port: 9005
spring:
    application:
      name: api-gateway 
    cloud: 
      gateway: 
        routes: 
          - id: service1 
            uri: https://blog.csdn.net 
            predicates: 
              - Path=/csdn
          - id: service2
          # uri: http://127.0.0.1:9001 
          	uri: lb://cloud-payment-service 
          	predicates: 
          	- Path=/payment/**
eureka: 
	client: 
		service-url: 
			defaultZone: http://127.0.0.1:9004/eureka

注册中⼼相结合的路由配置⽅式,与单个URI的路由配置,区别其实很⼩,仅仅在于URI的 schema协议不同。单个URI的地址的schema协议,⼀般为http或者https协议。启动多个⽀付微 服务,会发现端⼝9000,9001轮流出现。

2、路由匹配规则

Spring Cloud Gateway的主要功能之⼀是转发请求,转发规则的定义主要包含三个部分,如表所示。

Route(路由) 路由是⽹关的基本单元,由ID、URI、⼀组Predicate、⼀组Filter组成,根据Predicate进⾏匹配转发。
Predicate(谓语、断⾔) 路由转发的判断条件,⽬前SpringCloud Gateway⽀持多种⽅式,常⻅如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式
Filter(过滤器) 过滤器是路由转发请求时所经过的过滤逻辑,可⽤于修改请求、响应内容

2.1Predicate 断⾔条件

说⽩了 Predicate 就是为了实现⼀组匹配规则,⽅便让请求过来找到对应的 Route 进⾏处理,接下来我们接下 Spring Cloud GateWay 内置⼏种 Predicate 的使⽤。转发规则(predicates),假设 转发uri都设定为http://localhost:9001,常⻅Predicate,如表所示

规则 实例 说明
Path - Path=/gate/,/rule/ 当请求的路径为gate、rule开头的时,转发到 http://localhost:9001服务器上
Before - Before=2017-01-20T17:42:47.789-07:00[America/Denver] 在某个时间之前的请求才会被转发到 http://localhost:9001 服务器上
After - After=2017-01-20T17:42:47.789- 07:00[America/Denver] 在某个时间之后的请求才会被转发
Between - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01- 21T17:42:47.789-07:00[America/Denver] 在某个时间段之间的才会被转发
Cookie - Cookie=chocolate, ch.p 名为chocolate的表单或者满⾜正则ch.p的表单才会被匹配到 进⾏请求转发
Header - Header=X-Request-Id, \d+ 携带参数X-Request-Id或者满⾜\d+的请求头才会匹配
Host - Host=www.hd123.com 当主机名为www.hd123.com的时候直接转发到 http://localhost:9001服务器上
Method - Method=GET 只有GET⽅法才会匹配转发请求,还可以限定POST、PUT等
2.1.1 通过请求参数匹配

Query Route Predicate ⽀持传⼊两个参数,⼀个是属性名⼀个为属性值,属性值可以是正则表达 式

spring:
  cloud:
    gateway:
      routes:
        - id: service3 
          uri: https://www.baidu.com 
          order: 0 
          predicates:
             - Query=smile

这样配置,只要请求中包含 smile 属性的参数即可匹配路由。使⽤ curl 测试,命令⾏输⼊:curl localhost:9005?smile=x&id=2,经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。 还可以将 Query 的值以键值对的⽅式进⾏配置,这样在请求过来时会对属性值和正则进⾏匹配,匹配上才会⾛路由。

spring:
  cloud:
    gateway:
      routes:
        - id: service3 
          uri: https://www.baidu.com 
          order: 0 
          predicates:
             - Query=keep, pu.

这样只要当请求中包含 keep 属性并且参数值是以 pu 开头的⻓度为三位的字符串才会进⾏匹配和路由。 使⽤ curl 测试,命令⾏输⼊:curl localhost:8080?keep=pub,测试可以返回⻚⾯代码,将 keep 的属 性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进⾏路由。

2.1.2 通过Header匹配

Header Route Predicate 和 Query Route Predicate ⼀样,也是接收 2 个参数,⼀个 header 中属性名称和⼀个正则表达式,这个属性值和正则表达式匹配则执⾏。

spring:
  cloud:
    gateway:
      routes:
        - id: service4
          uri: https://www.baidu.com 
          order: 0 
          predicates:
             - Header=X-Request-Id, \d+

使⽤ curl 测试,命令⾏输⼊:curl http://localhost:9005 -H “X-Request-Id:88”,则返回⻚⾯代 码证明匹配成功。将参数-H "X-Request-Id:88"改为-H “X-Request-Id:spring”,再次执⾏时返回 404证明没有匹配。

2.1.3 通过Cookie匹配

Cookie Route Predicate 可以接收两个参数,⼀个是 Cookie name ,⼀个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执⾏路由,如果没有匹配 上则不执⾏。

spring:
  cloud:
    gateway:
      routes:
        - id: service5
          uri: https://www.baidu.com 
          predicates:
             - Cookie=sessionId, test

使⽤ curl 测试,命令⾏输⼊,curl http://localhost:9005 --cookie “sessionId=test”,则会返回⻚⾯代码,如果去掉–cookie “sessionId=test”,后台汇报 404 错误。

2.1.4 通过Host匹配

Host Route Predicate 接收⼀组参数,⼀组匹配的域名列表,这个模板是⼀个 ant 分隔的模板, ⽤.号作为分隔符。它通过参数中的主机地址作为匹配规则。

spring:
  cloud:
    gateway:
      routes:
        - id: service6
          uri: https://www.baidu.com 
          predicates:
             - Host=**.baidu.com

使⽤ curl 测试,命令⾏输⼊,curl http://localhost:9005 -H "Host: www.baidu.com"或者curl http://localhost:8080 -H “Host: md.baidu.com”,经测试以上两种 host 均可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。

2.1.5 通过请求⽅式匹配
spring:
  cloud:
    gateway:
      routes:
        - id: service7
          uri: https://www.baidu.com 
          predicates:
             - Method=PUT

使⽤ curl 测试,命令⾏输⼊,curl -X PUT http://localhost:9005,测试返回⻚⾯代码,证明匹配 到路由,以其他⽅式,返回 404 没有找到,证明没有匹配上路由

2.1.6 通过请求路径匹配

Path RoutePredicate 接收⼀个匹配路径的参数来判断是否路由。

spring:
  cloud:
    gateway:
      routes:
        - id: service8
          uri: https://www.baidu.com 
          predicates:
             - Path=/payment/{segment} 

如果请求路径符合要求,则此路由将匹配, curl 测试,命令⾏输⼊,curl http://localhost:9005/payment/1, 可以正常获取到⻚⾯返回值,curl http://localhost:9005/payment2/1,报404,证明路由是通过指定路由来匹配

2.1.7 组合匹配
spring:
  cloud:
    gateway:
      routes:
        - id: service9
          uri: http://127.0.0.1:9001 
          predicates:
             - Host=**.foo.org 
             - Path=/headers
             - Method=GET 
             - Header=X-Request-Id, \d+ 
             - Query=foo, ba. 
             - Query=baz 
             - Cookie=chocolate, ch.p

各种 Predicates 同时存在于同⼀个路由时,请求必须同时满⾜所有的条件才被这个路由匹配。 ⼀个请求满⾜多个路由的断⾔条件时,请求只会被⾸个成功匹配的路由转发

2.2 过滤器规则

列举⼏个过滤器,如表所示。

过滤规则 实例 说明
PrefixPath - PrefixPath=/app 在请求路径前加上app
RewritePath - RewritePath=/test, /app/test 访问localhost:9022/test,请求会转发到 localhost:8001/app/test
SetPath SetPath=/app/{path} 通过模板设置路径,转发的规则时会在路径前增加 app,{path}表示原请求路径
RedirectTo 重定向
RemoveRequestHea 去掉某个请求头信息\1. PrefixPath
2.2.1 PrefixPath

​ 对所有的请求路径添加前缀

spring:
  cloud:
    gateway:
      routes:
        - id: service10
          uri: http://127.0.0.1:9001 
          predicates:
             - Path=/payment/{segment} 
          filters:
          	- PrefixPath=/payment

访问/123请求被发送到http://127.0.0.1:9001/payment/123。

2.2.2 StripPrefix

跳过指定的路径

spring:
  cloud:
    gateway:
      routes:
        - id: service11
          uri: http://127.0.0.1:9001 
          predicates:
             - Path=/payment/{segment} 
          filters:
          	- StripPrefix=1 
          	- PrefixPath=/payment

此时访问http://localhost:9005/api/123,⾸先StripPrefix过滤器去掉⼀个/api,然后PrefixPath 过滤器加上⼀个/payment,能够正确访问到微服务。

2.2.3 RewritePath
spring:
  cloud:
    gateway:
      routes:
        - id: service12
          uri: http://127.0.0.1:9001 
          predicates:
             - Path=/payment/{segment} 
          filters:
          	- RewritePath=/api/(?<segment>.*), /$\{segment}

请求http://localhost:9005/api/payment/123路径,RewritePath过滤器将路径重写为 http://localhost:9005/payment/123,能够正确访问微服务。

2.2.4 SetPath

SetPath和Rewrite类似,代码如下

spring:
  cloud:
    gateway:
      routes:
        - id: service13
          uri: http://127.0.0.1:9001
          predicates:
             - Path=/payment/{segment} 
          filters:
          	- SetPath=/payment/{segment}

请求http://localhost:9005/api/payment/123路径,SetPath过滤器将路径设置为 http://localhost:9005/payment/123,能够正确访问微服务。

2.2.5 RemoveRequestHeader

去掉某个请求头信息。

spring:
  cloud:
    gateway:
      routes:
        - id: removerequestheader_route
          uri: https://example.org  
          filters:
          	- RemoveRequestHeader=X-Request-Foo 12345678

去掉请求头X-Request-Foo

2.2.6 RemoveResponseHeader

去掉某个回执头信息

spring:
  cloud:
    gateway:
      routes:
        - id: removerequestparameter_route
          uri: https://example.org  
          filters:
          	- RemoveRequestParameter=red
2.2.7 SetRequestHeader

设置请求头信息

spring:
  cloud:
    gateway:
      routes:
        - id: setrequestheader_route
          uri: https://example.org  
          filters:
          	- SetRequestHeader=X-Request-Red, Blue

2.2.8 default-filters

对所有的请求添加过滤器

spring:
  cloud:
    gateway:
      routes:
        - id: service14
          uri: http://127.0.0.1:9001
          predicates:
                - Path=/9001/{segment}
        - id: service15
          uri: http://127.0.0.1:9000
          predicates:
                - Path=/9000/{segment}
      default-filters:
        - StripPrefix=1
        - PrefixPath=/payment

对所有的请求添加过滤器文章来源地址https://www.toymoban.com/news/detail-440821.html

spring:
  cloud:
    gateway:
      routes:
        - id: service14
          uri: http://127.0.0.1:9001
          predicates:
                - Path=/9001/{segment}
        - id: service15
          uri: http://127.0.0.1:9000
          predicates:
                - Path=/9000/{segment}
      default-filters:
        - StripPrefix=1
        - PrefixPath=/payment

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

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

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

相关文章

  • spring-cloud-gateway版本和springboot版本不匹配

    在搭建gateway服务的时候,启动出现以下问题: Description: An attempt was made to call a method that does not exist. The attempt was made from the following location:     org.springframework.cloud.gateway.config.GatewayAutoConfiguration$NettyConfiguration.buildConnectionProvider(GatewayAutoConfiguration.java:798) The following method did no

    2024年02月16日
    浏览(106)
  • 芝法酱躺平攻略(14)——Nginx与Spring-Cloud-Gateway

    上一章芝法酱躺平攻略(12)展望了微服务下常见的技术需求与常见解决方案,本期来讲解第一部分,Nginx与SpringCloud-Gateway。 本章将实践在nginx和spring-cloud-gateway的简单使用。 首先,去官网查找最新稳定版,把下载的nginx包放到DOWNLOAD文件夹下。 而后把该包解压到SOFTWARE文件夹

    2024年02月07日
    浏览(43)
  • Spring-Cloud-Gateway修改请求(json,form带文件请求)参数,返回值参数

    新项目需要在getway统一做入参、出参加解密,记录日志。记录一下form,x-www-form-urlencoded , json 这几种修改数据的方式。 gateway做拦截器是实现GlobalFilter接口,修改json方式网上有很多文章,后来又想研究研究能不能实现修改form-data参数,以及文件请求,后者文章不多大部分是怎

    2024年02月16日
    浏览(47)
  • Spring Cloud Gateway 路由配置策略

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

    2024年01月20日
    浏览(41)
  • Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

    Actuator 是 Spring Boot 提供的用来对应用系统进行监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator 的核心是端点 Endpoint 。 Endpoint 可以让我们监视应用程序并与其交互。 Spring Boot 包含许多内置端点,并允许您添加自己的端

    2024年02月09日
    浏览(60)
  • 三分钟了解Spring Cloud Gateway路由转发之自动路由

    大家好,我是冰点,今天和大家分享一下关于Spring Cloud Gateway 利用服务注册与发现实现自动路由的原理和源码解读。希望对大家有所帮助。 今天有个新同学,问我 为什么我们的网关服务Spring Cloud Gateway,没有配置路由就可以将请求到路由服务 ,说他们之前的项目的网关是将

    2024年02月08日
    浏览(35)
  • spring cloud gateway网关(一)之网关路由

    1、gateway相关介绍 在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。这种客户

    2024年02月08日
    浏览(41)
  • 【Spring Cloud Alibaba】8.路由网关(Gateway)

    接下来对服务消费者添加路由网关来实现统一访问接口,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0 , Spring Boot 2.0 和 Project Reactor 等技术开发的网关,该项目提供了一个库,用于在 Spring W

    2023年04月24日
    浏览(40)
  • spring.cloud.gateway 说明和使用方式

    spring.cloud.gateway 是 SpringCloud 技术栈中的网关组件,提供了基于路由的请求转发、请求限流、服务降级、负载均衡等功能。使用方式如下: 引入依赖 在 SpringBoot 项目中,添加以下依赖: 配置路由规则 在项目的配置文件中,配置路由规则,例如: 以上配置指定了两个路由规则

    2024年02月10日
    浏览(45)
  • 【源码】Spring Cloud Gateway 是在哪里匹配路由的?

    我们知道,经过网关的业务请求会被路由到后端真实的业务服务上去,假如我们使用的是Spring Cloud Gateway,那么你知道Spring Cloud Gateway是在哪一步去匹配路由的吗? 源码之下无秘密,让我们一起从源码中寻找答案。 Spring Cloud Gateway 的入口为 DispatcherHandler 的 handle 方法,其中主

    2023年04月24日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包