Gateway路由谓词工厂实例

本文编写一些测试例子来说下gateway中的内置路由谓词工厂。


环境准备

为了测试gateway的使用,使用springboot搭建了简单服务。服务是注册在注册中心nacos中,网关没有在注册中心注册,后面介绍动态网关的时候再进行注册。

在这里插入图片描述

搭建了一个端口为8581的order服务

在这里插入图片描述


常见路由谓词工厂

官网给出的内置路由谓词工厂

在这里插入图片描述


实战部分

路径-谓词工厂

-Path=路径1

exmaple: 请求Url包含/order/**时触发路由 ,将请求转发到order-service服务中

具体配置如下:

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            #匹配对应URL的请求,将匹配到的请求追加在目标URI之后
            - Path=/order/**

网关测试

在这里插入图片描述

先看实际效果,再分析

通过访问网关的http://localhost:8888/order/getNameAndPort 接口调用到了 order服务 localhost:8581/order/getNameAndPort 接口。这个是最简单,也是常用的路由规则。


后时刻-谓词工厂

可以设置一个时间点,当系统时间大于设置时间点时才会将请求进行路由。

– After=时刻

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            # [Asia/Shanghai] 为时间所对应的时区
            - After=2020-10-10T21:21:21.993+08:00[Asia/Shanghai]

测试结果

在这里插入图片描述
这样设置后谓词工厂后呢,即是当系统时间(上海时区)大于2020年10月10日21点21分21秒后 ,才会将请求进行路由。


前时刻-谓词工厂

与后路径谓词工厂一样,一样是支持一个时间点设置,当当前请求时间小于设置的路由时间时,才会将请求进行路由。

– Before=时刻

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            # [Asia/Shanghai] 为时间所对应的时区
            - Before=2022-10-10T21:21:21.993+08:00[Asia/Shanghai]

测试结果

在这里插入图片描述


时间段-谓词工厂

这个时间段路由谓词呢,实际就是 前时刻 后时刻 两个路由谓词的综合,其配置需要设置两个时间点,当请求时间在这两个时间点之间,则会触发路由,反之则不进行路由。

-Between=时刻1,时刻2

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            # [Asia/Shanghai] 为时间所对应的时区
            - Between=2022-01-01T22:22:22.993+08:00[Asia/Shanghai],
            2022-10-10T10:10:10.993+08:00[Asia/Shanghai]

测试结果

在这里插入图片描述


cookie-谓词工厂

看名字,即可猜出当前路由触发条件了,即当我们的请求包含某cookie的时候才会进行路由,

– Cookie=cookie名字,值(值支持正则表达式)

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Cookie=username,zs

如果按照我这么配置,那么我们的请求必须携带userme的cookie ,且其值必须为zs。

在这里插入图片描述

当cookie不满足时,则无法触发路由

在这里插入图片描述


方法-谓词工厂

所谓方法谓词工厂,即是根据HTTP请求类型匹配来路由,例如GET、POST、PUT、DELETE等等,可配置多种请求方法。

– Method=GET,POST

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Method=GET,POST

测试结果

在这里插入图片描述

当为put请求的时候

在这里插入图片描述


请求头-谓词工厂

例如我们在实际开发中,通常会设置一个token请求头,当有些接口需要登录访问,则会校验当前请求是否携带一个token请求头…

或者说,我们前后端交互的时候,要求前端向后端传输JSON格式的参数,那么在HTTP请求的时候,需要加上一个Content-Type= application/json 的一个键值对请求头…

我们的请求头谓词呢,即是要求当前HTTP请求必须携带定义的请求头才会触发路由

– Header=Authentication,zs

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Header=Authentication,zs

当我们的请求没有携带设置的请求头时

在这里插入图片描述

当我们的请求携带设置的请求头时

在这里插入图片描述


查询参数-谓词工厂

即当我们的请求中含有某个请求参数时,才会进行路由。此设置则只要求请求参数中必须携带参数名为:【参数名】

– Query=【参数名】

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Query=name

无设置的参数请求

在这里插入图片描述

有gateway路由谓词设置的参数请求

在这里插入图片描述


主机-谓词工厂

即需要我们的请求头中必须要携带设置的主机信息,才会对我们的请求进行路由。

主机名列表可设置多个,例如下边这样

– Host=主机1,主机2,主机3…

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Host=**.zs.org

** 则支持模糊匹配

携带Host信息的时候

在这里插入图片描述

不携带或者错误的host信息

在这里插入图片描述


RemoteAddr/网段-路由谓词工厂

当前谓词呢,即只接受设置的某一网段类的请求,当请求来自于某一网段时,才会触发路由

–RemoteAddr=192.168.0.1/24

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - RemoteAddr=192.168.0.1/24

即当请求方的IP为192.168.0.1-192.168.0.24之间时,才会触发路由。

在这里插入图片描述


权重-谓词工厂

我们做后端的,都应该知道这个词:负载均衡。而在负载均衡中呢,又涉及到了负载的权重策略 ,例如随机、轮询、权重等。何为权重?权重,说白了就是某一因素对某一事物的重要程度,程度的高低则为权重的高低。

在路由谓词的时候即支持权重了,可根据我们配置的权重比,将请求进行相应量化的转发,其需要设置两个参数一个是group一个是weight,即权重分组和权重比。

– Weight=组, 权重比

server:
  port: 8888

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #路由规则
      routes:
        #路由ID,唯一
        - id: server-order
          #目标URI,路由到微服务地址
          uri: http://localhost:8581
          #断言,判断条件
          predicates:
            - Weight=testWeight, 2
        - id: server-order2
          #目标URI,路由到微服务地址
          uri: http://localhost:8582
            #断言,判断条件
          predicates:
            - Weight=testWeight, 1

两次8581的服务,一次8582的服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


本文小结

本文介绍了现在常用的gateway各种内置的路由谓词工厂,编写了简单的实例来进行说明。

课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值