这篇文章详细介绍一下断言(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路径前添加一部分前缀。