一、路由过滤器
路由过滤器( GatewayFilter )是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
如图:网关路由过滤器:
路由过滤器的作用是:
1.对路由的请求或响应做加工处理,比如添加请求头
2.配置在路由下的过滤器只对当前路由的请求生效
Spring提供了31种不同的路由过滤器工厂。例如:
官网:
名称 | 说明
-AddRequestHeader | 给当前请求添加一个请求头
-RemoveRequestHeader | 移除请求中的一个请求头
-AddResponseHeader | 给响应结果中添加一个响应头
-RemoveResponseHeader | 从响应结果中移除有一个响应头
-RequestRateLimiter | 限制请求的流量
示例:给所有进入userservice的请求添加一个请求头:Truth=IT is freaking awesome!
实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:
只需要修改gateway服务的application.yml文件,添加路由过滤即可:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters: # 过滤器
- AddRequestHeader=Truth, IT is freaking awesome! # 添加请求头
当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。
默认过滤器:defaultFilters的作用是:对所有路由都生效的过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
default-filters: # 默认过滤项
- AddRequestHeader=Truth, IT is freaking awesome!
二、路由断言工厂
路由断言工厂Route Predicate Factory,我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来 处理的,像这样的断言工厂在SpringCloudGateway还有:
名称 - 说明 - 示例
- After : 是某个时间点后的请求
示例: After=2037-01-20T17:42:47.789-07:00[America/Denver] :
- Before : 是某个时间点之前的请求
示例: Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] :
- Between : 是某两个时间点之前的请求
示例: Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] :
- Cookie : 请求必须包含某些cookie
示例: Cookie=chocolate, ch.p :
- Header : 请求必须包含某些header
示例: Header=X-Request-Id, \d+ :
- Host : 请求必须是访问某个host(域名)
示例: Host=**.somehost.org,**.anotherhost.org :
- Method : 请求方式必须是指定方式
示例: Method=GET,POST :
- Path : 请求路径必须符合指定规则
示例: Path=/red/{segment},/blue/** :
- Query : 请求参数必须包含指定参数
示例: Query=name, Jack或者- Query=name :
- RemoteAddr : 请求者的ip必须是指定范围
示例: RemoteAddr=192.168.1.1/24 :
- Weight : 权重处理
路由工厂作用(PredicateFactory):读取用户配置的断言规则,而后解析成判断条件,对用户请求做判断