目录
6.3.3、追溯 AddRequestHeaderGatewayFilterFactory 源码实现
6.1、网关的理解
网关是流量的入口,在微服务中是很重要的,常见的功能还有路由转发,权限校验,限流控制等作用。
网关通常作用:
- 路由:协议转换,路由转发
- 监控:流量聚合,对流量进行监控
- 日志:日志输出
- 限流:作为整个系统的前端工程,对流量进行控制,有限流的作用
- 安全:外部流量只能通过网关才能访问系统
- 鉴权:可以在网关层做权限的控制
- 缓存:可以在网关层做缓存
服务网关的理解:
客户端向 Spring Cloud Gateway 发出请求,如果 Gateway Handler Mapping 确定请求与路由匹配(这时候用到 predicate,predicate 决定了一个请求走哪一个路由),则将其发送到 Gateway web handler 处理。Gateway web handler 处理请求时会经过一系列的过滤器链。过滤器链被虚线划分的原因是过滤器链可以在发送代理请求之前或之后执行过滤逻辑。先执行所有“pre”过滤器逻辑,然后进行代理请求。在发出代理请求之后,收到代理服务的响应之后执行“post”过滤器逻辑,在这里可以响应数据进行修改,比如响应头、协议的转换等。
6.2、Predicate 断言
6.2.1、Predicate 理解
predicate 来自于 java8 的接口。predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 predicate 组合成其他复杂的逻辑(比如:与或非)可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。add——与、or——或、negate——非。
org.springframework.cloud.gateway.handler.predicate 列举各种 Predicate:
6.2.2、Predicate 实战
//1、依赖Jar
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
//2、配置文件 application.yml
server:
port: 8081
spring:
profiles:
##//指定你要激活的文件配置,对应下面所有配置的profiles的值。
active: query_route
---# 断言:在这个时间之后的可以访问。也就说,下面这个时间设置,你访问的话是报404的。
spring:
profiles: after_route
cloud:
gateway:
routes:
- id: after_route
uri: http://localhost:8080/hello
predicates:
- After=2019-01-20T17:42:47.789-07:00[America/Denver]
---# 断言:加头部信息。 //$ curl -H 'X-Request-Id:1' localhost:8081
predicates:
- Header=X-Request-Id, \d+
---# 断言: 加Cookie信息。//$ curl -H 'Cookie:name=forezp' localhost:8081
predicates:
- Cookie=name, forezp
---# 断言:按域名拦截。//curl -H 'Host:www.fangzhipeng.com' localhost:8081
predicates:
- Host=**.xbmchina.cn
---# 断言:按请求方式拦截。//$ curl -XPOST localhost:8081
predicates:
- Method=GET
---# 断言:按地址路由拦截。//$ curl localhost:8081/hello
predicates:
- Path=/hello
---# 断言:按查询参数拦截。// curl localhost:8081?foo=bar
predicate