上一篇中简单介绍了网关gateway的用法

这篇文章详细介绍一下断言(Predicate)、路由(route)、过滤器(filter)

0.基础概念
  • 断言(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 可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。

这里说一下Path的主要用法,Path在实际操作中用的比较多。

我们的例子1如下:

server:
  port: 10050 #服务的端口
#spring相关配置
spring:
  application:
    name: service-gateway #服务的名称
  #gateWay配置
  cloud:
    gateway:

      routes:
        # 例子1
        - id: s-cloud-gateway1  # 路由ID,命名随意,只要保证唯一性即可
          uri: http://127.0.0.1:8002  # 设置一个地址,指向前面的一个消费者端口
          predicates:
            - Method=GET,POST #只匹配GET和POST请求
            - Path=/gateway1/**

#eureka配置
eureka:
  client:
    service-url:
      # 填写注册中心服务器地址
      defaultZone: http://localhost:7001/eureka
    # 是否需要将自己注册到注册中心
    register-with-eureka: true
    # 是否需要搜索服务信息
    fetch-registry: true
  instance:
    # 使用ip地址注册到注册中心
    prefer-ip-address: true
    # 注册中心列表中显示的状态参数
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

这里访问的8002端口,在前面文章中,我们8002端口是可以正常访问的

127.0.0.1:8002/consumerFeign/getUser

这里用网关的方法代理8002端口,Path=/gateway1/** ,网关会自动匹配8002端口以gateway1开头的接口,但是,很明显,这个路由并不能匹配成功,那么大概率会报错Whitelabel Error Page(status=404)

我们改成下面这样

  routes:
        # 例子1
        - id: s-cloud-gateway1  # 路由ID,命名随意,只要保证唯一性即可
          uri: http://127.0.0.1:8002  # 设置一个地址,指向前面的一个消费者端口
          predicates:
            - Method=GET,POST #只匹配GET和POST请求
            - Path=/consumerFeign/**

那么我们把Path改成 /consumerFeign/** 这表示去匹配8002端口以consumerFeign开头的接口。而8002端口有以consumerFeign开头的接口,所以能正常访问。

可以看出我们可以正常访问我们的微服务接口。

3.Filter过滤器

首页要介绍的就是StripPrefix,表示去掉部分URL路径。我们拿上面那个错误例子来说明:

 routes:
        # 例子1
        - id: s-cloud-gateway1  # 路由ID,命名随意,只要保证唯一性即可
          uri: http://127.0.0.1:8002  # 设置一个地址,指向前面的一个消费者端口
          predicates:
            - Method=GET,POST #只匹配GET和POST请求
            - Path=/gateway1/**
          filters:
            - StripPrefix=1
        #例子2
        - id: s-cloud-gateway2
          uri: lb://service-provider1 #以 lb:// 开头,后面的是注册在eureka上的服务名
          predicates:
            - Path=/gateway2/**
          filters:
            - StripPrefix=1

如果没有加filters访问接口时就会报错,但是现在加上了StripPrefix,就会去掉部分前缀,StripPrefix=1表示去掉第一部分,那么从外部访问的是:

127.0.0.1:8002/gateway1/consumerFeign/getUser

因为StripPrefix=1的原因,实际到内部的路由就会变成

127.0.0.1:8002/consumerFeign/getUser

这样就会访问成功了。

而PrefixPath则表示在URL路径前添加一部分前缀。