返回顶部
首页 > 资讯 > 精选 >Java之Springcloud Gateway内置路由的示例分析
  • 689
分享到

Java之Springcloud Gateway内置路由的示例分析

2023-06-20 21:06:45 689人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关Java之SpringCloud Gateway内置路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。spring cloud Gateway路由匹配是spring WEBFl

这篇文章给大家分享的是有关Java之SpringCloud Gateway内置路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

spring cloud Gateway路由匹配是spring WEBFlux基础功能的一部分,在Spring Cloud Gateway中内置了很多路由断言工厂类。不同的断言工厂类针对Http请求的不同属性。多个断言工厂类可以使用逻辑“and”进行组合使用。

4.1 After Route Predicate Factory

       这个Predicate工厂的实现类是AfterRoutePredicateFactory,使用一个时间参数,如果当前请求的时间在配置的赶时间之后,此断言才会返回true。在application.yml中如下配置所示:

spring:  cloud:    gateway:      routes:      - id: after_route        uri: http://www.test111.com  # 如果断言返回true,路由到的URI        predicates:        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

注意这个类使用的时间类是ZonedDateTime,表示ISO-8601日历系统中具有时区的日期时间,所以在application.yml中的时间配置格式只能是:2017-01-20T17:42:47.789-07:00[America/Denver],字符串的时间格式转化为ZonedDateTime使用的是StringToZonedDateTimeConverter类。如果想使用其它的时间格式,得需要自己实现一个单独的转化类了。通过源码中的测试例子可以看到,如果请求在配置的时间之前,网关会返回404,如果在配置的时间之后,网关路由成功到www.test111.com 网站。

      这里简单说一下spring.cloud.gateway.routes的配置,它对应的是一个List列表,List列表存储的对象类型是RouteDefinition,这是一个路由的定义类。id是在这个List列表中所有的路由定义中必须唯一,可以随便定义。在RouteDefinition声明的字段,在application.yml中的spring.cloud.gateway.routes中都可以配置。

4.2 Before Route Predicate Factory

       这个Predicate工厂的实现类是BeforeRoutePredicateFactory,它和AfterRoutePredicateFactory的实现基本上是一致的,在application.yml中的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: before_route        uri: http://www.test111.com # 路由到的URI        predicates:        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

如果当前请求的时间在配置的时间之前,此断言返回true,网关将请求路由到www.test111.com网站。否则,返回404。

4.3 Between Route Predicate Factory

       这个Predicate的工厂实现类是BetweenRoutePredicateFactory,它有两个参数,datatime1,datetime2,在application.yml中的配置如下:

spring:  cloud:    gateway:      routes:      - id: between_route        uri: http://www.test111.com        predicates:        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

当请求网关的时间在datatime1之后,在datetim2之前时,这个断言返回true,会将请求路由到www.test111.com网站。这个断言对于维护一个时间窗口很有用。比如限制在基某段时间内开启的活动,非这个时间段不可以访问等。

4.4 Cookie Route Predicate Factory

       这个Predicate工厂的实现类是CookieRoutePredicateFactory,它有两个参数,一个是name,另一个是正则表达式。在application.,yml中的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: cookie_route        uri: http://www.test111.com        predicates:        - Cookie=username, wgslcuky

如果请求的Cookie中有name的值,并且根据name取出的值都匹配配置的正则表达式,这个断方就返回true,会将请求路由到http://www.test111.com网站。上面的配置就是表示Cookie中username的值是wgslucky时,断言返回true.

4.5 Header Route Predicate Factory

       这个Predicate工厂的实现类是HeaderRoutePredicateFactory,它有两个参数,一个是name,另一个是正则表达式。在application.yml中的配置如下所示:

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

如果请求的Header里面有name的值,并且它的值与配置的正则表达式匹配,则断言返回true,如果没有配置正则表达式的值,断言也是返回true(断方只检测带正则表达式的配置),将会把请求路由到http://www.test111.com网站。上面的配置示例表示Header中必须有X-Request-Id,且它的值必须是数字。

4.6 Host Route Predicate Factory

       这个Predicate的工厂的实现类是HostRoutePredicateFactory,这有一个参数,这个参数是一人List列表,它可以包含多个主机名字匹配的样式。它遵循Ant的样式风格,以点(.)分隔。在application.yml中的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: host_route        uri: http://www.test111.com        predicates:        - Host=**.somehost.org,**.anotherhost.org,{sub}.myhost.org

上面示例中Host对应的URI模板变量同样也支持{sub}.myhost.org格式的配置。如果请求的Header中的Host的值是www.sonmehost.org,abc.somehost.org,api.anotherhost.org,这个断言就会返回true,将请求路由到http://www.test111.com网站。

在断方工厂中会提取上面配置中Host对应的URI模板变量(比如上面的sub),把匹配的URI放到一个Map中,这个Map会被添加到ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)的属性集中。可以在后面的Gateway Filter工厂类使用。

注意,在配置Host的时候,如果Host不是80端口,在配置的时候也需要添加上端口。如:localhost:8080

4.7 Method Route Predicate Factory

       这个Predicate的实现类是MethodRoutePredicateFactory,它有一个参数:指定的Http方法名。在application.yml中的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: method_route        uri: http://www.test111.com        predicates:        - Method=GET

如果这个请求的方法名是GET,断言将返回true,将请求路由到http://www.test111.com网站。

4.8 Path Route Predicate Factory

       这个Predicate的实现类是PathRoutePredicateFactory,它有两个参数,一个是匹配样式列表,另一个是boolean值,表示是否匹配分隔线。在application.yml中的配置好下所示:

spring:  cloud:    gateway:      routes:      - id: path_route        uri: http://www.test111.com        predicates:        - Path=/foo/{segment},/bar/{segment}

如果请求的URI中的路径是/foo/1,/foo/bar或/bar/baz,这个断言将返回true,会将请求路由到http://www.test111.com网站。这个断言工厂将会提取配置的URI格式中的变量(比如上面配置的segment),并将它转化为Map,替换掉ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)中的值。这个值可以在GatewayFilter工厂中使用。有一个方法可以方便的访问这些值,如下面代码所示:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);String segment = uriVariables.get("segment");

4.9 Query Route Predicate Factory

    这个是参数路由断言工厂,它的实现类是QueryRoutePredicateFactory,它有两个参数,一个是参数(param),这个是必须的,另一个是可选参数,是一个正则表达式。在application.yml中不带正则的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: query_route        uri: http://www.test111.com        predicates:        - Query=baz

如果请求的参数中包含baz参数,断言将返回true,并将请求路由到http://www.test111.com网站。带正则表达式的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: query_route        uri: http://example.org        predicates:        - Query=foo, ba.

如果请求的参数中包含foo,且它的值匹配ba.,断言将返回true,并将请求路径到http://www.test111.com网着。

4.10 RemoteAddr Route Predicate Factory

    这个是远程地址路由断言工厂,它的实现类是RemoteAddrRoutePredicateFactory,它有一个List列表的参数,这些参数是CIDR-notation(IPv4和IPv6)的地址字符串,比如192.168.0.1/16(192.168.0.1是ip地址,16是一个子网掩码)。在application.yml中的配置如下所示:

spring:  cloud:    gateway:      routes:      - id: remoteaddr_route        uri: http://www.test111.com        predicates:        - RemoteAddr=192.168.1.1/24

如果请求的客户端的ip地址是192.168.1.1到192.168.1.24的范围,此断言返回true,并将请求路由到http://www.test111.com网站。比如192.168.1.10。

4.10.1修改远程地址的解析方式

    默认情况下,RemoteAddrRoutePredicateFactory中用到的远程客户端的IP地址是从请求中获取的,但是,如果Spring Cloud Gateway是部署在一个代理服务之后的话,这可能就匹配不到真实的客户端IP地址。这样的话,你可以实现RemoteAddressResolver接口,自定义一个IP地址的解析方式。在Spring Cloud Gateway中有一个非默认的远程IP地址解析器XForwardedRemoteAddressResolver,它是基于X-Forwarded-For header实现的。XForwardedRemoteAddressResolver有两个静态的构造方法,可以用于不同的安全策略:XForwardedRemoteAddressResolver::trustAll方法返回一个RemoteAddressResolver实例,它返回从X-Forwarded-For header获取到的第一个IP地址。这种方式容易受到欺骗攻击,恶意的客户端可以给X-Forwarded-For设置一个初始化的值,这个值对于解析器来说是可以接受的。XForwardedRemoteAddressResolver::maxTrustedIndex需要一个索引值做为参数,这个值和Spring Cloud Gateway前面受信任的代理设备数量相关。比如,如果Spring Cloud Gateway只可以通过HAPoxy访问,那么maxTrustedIndex应该设置为1,如果需要通过两个受信任的设备访问,那么这个值应该设置为2。比如在Header中的X-Forwarded-For值如下所示:

X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3

那么maxTrustedIndex的值与下面的远程相对应:

maxTrustedIndexresult
[Integer.MIN_VALUE,0](invalid, IllegalArgumentException during initialization
10.0.0.3
20.0.0.2
30.0.0.1
[4, Integer.MAX_VALUE]0.0.0.1

如下面代码所示:

RemoteAddressResolver resolver = XForwardedRemoteAddressResolver    .maxTrustedIndex(1);....route("direct-route",    r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24")        .uri("https://downstream1").route("proxied-route",    r -> r.remoteAddr(resolver,  "10.10.1.1", "10.10.1.1/24")        .uri("https://downstream2"))

感谢各位的阅读!关于“Java之SprinGCloud Gateway内置路由的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java之Springcloud Gateway内置路由的示例分析

本文链接: https://lsjlt.com/news/300107.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java之Springcloud Gateway内置路由的示例分析
    这篇文章给大家分享的是有关Java之Springcloud Gateway内置路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Cloud Gateway路由匹配是Spring WebFl...
    99+
    2023-06-20
  • Java之Springcloud Gateway内置路由案例讲解
    Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spring Cloud Gateway中内置了很多路由断言工厂类。不同的断言工厂类...
    99+
    2024-04-02
  • SpringCloud Gateway 路由配置定位原理分析
    环境:springcloud Hoxton.SR11 本节主要了解系统中的谓词与配置的路由信息是如何进行初始化关联生成路由对象的。每个谓词工厂中的Config对象又是如何被解析配置的...
    99+
    2024-04-02
  • SpringCloud之SpringCloud gateway网关路由怎么配置
    本篇内容介绍了“SpringCloud之SpringCloud gateway网关路由怎么配置”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够...
    99+
    2023-07-05
  • 从0到1学SpringCloud之SpringCloud gateway网关路由配置示例详解
    目录一、前言二、代码演示1、配置文件2、pom依赖 3、创建微服务三、请求测试1、微服务请求转发2、第三方请求转发一、前言 微服务中经常用到gateway作为网关,它有什么...
    99+
    2023-05-14
    SpringCloud gateway网关路由 SpringCloud gateway网关路由配置 SpringCloud gateway
  • Java之springcloud Sentinel的示例分析
    小编给大家分享一下Java之springcloud Sentinel的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Sentinel是什么?Senti...
    99+
    2023-06-20
  • Angular4路由设置的示例分析
    这篇文章主要介绍Angular4路由设置的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.路由相关配置路由类设置 import { RouterMo...
    99+
    2024-04-02
  • angular路由之angular-router的示例分析
    这篇文章主要介绍了angular路由之angular-router的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:创建项目...
    99+
    2024-04-02
  • Vue3中路由和路由配置方式的示例分析
    这篇文章给大家分享的是有关Vue3中路由和路由配置方式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。路由的基本配置安装插件npm install vue-router@next&nb...
    99+
    2023-06-22
  • 解决SpringCloud Gateway配置自定义路由404的坑
    目录问题背景问题现象解决过程1 检查网关配置2 跟源码,查找可能的原因3 异常原因分析解决方法心得问题背景 将原有项目中的websocket模块迁移到基于SpringCloud Al...
    99+
    2024-04-02
  • vue2路由vue-router配置的示例分析
    小编给大家分享一下vue2路由vue-router配置的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue路由配置以及...
    99+
    2024-04-02
  • React-router v4路由配置的示例分析
    这篇文章主要介绍了React-router v4路由配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一. Switch 、Rou...
    99+
    2024-04-02
  • vue动态路由配置及路由传参的示例分析
    这篇文章主要介绍了vue动态路由配置及路由传参的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。动态路由:  当我们很多个页面或者组件...
    99+
    2024-04-02
  • Angular中路由的示例分析
    这篇文章将为大家详细讲解有关Angular中路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 摘要简单来说地址栏中,不同的地址(URL)对应不同的页面,这...
    99+
    2024-04-02
  • vue-router路由的示例分析
    这篇文章将为大家详细讲解有关vue-router路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。官方文档:旧版:https://github.com/vuej...
    99+
    2024-04-02
  • Spring Cloud Zuul中路由配置的示例分析
    这篇文章将为大家详细讲解有关Spring Cloud Zuul中路由配置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先我们来回忆一下配置路由规则的那两行代码:zuul.routes.api-...
    99+
    2023-05-30
    spring cloud zuul
  • Angular 4.x路由的示例分析
    这篇文章给大家分享的是有关Angular 4.x路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Installing the router首先第一件事,我们需要安装 ...
    99+
    2024-04-02
  • Angular中Route路由的示例分析
    这篇文章主要介绍Angular中Route路由的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Angular 路由(Route)我们可以将路由器理解成控制整个应用状态的视图对象, 每个应用都有一个路由器; 路...
    99+
    2023-06-14
  • IS-IS路由协议的示例分析
    小编给大家分享一下IS-IS路由协议的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!IS-IS路由协议(Intermed...
    99+
    2024-04-02
  • Vue中路由跳转的示例分析
    这篇文章给大家分享的是有关Vue中路由跳转的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近项目上需要用Vue用来做app,在Vue中使用路由时遇到下面的问题。路由设置...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作