Gateway 网关
Spring Cloud Gateway 网关 组件核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对 应的服务。
补充说明&优点
- Gateway 替换了 Netflix Zuul 的一套解决方案
- 隐藏 服务的 IP/端口 等信息
- 提供统一的API路由管理方式 (url管理)
- Gateway 核心功能 过滤/路由/断言
- Gateway 也是个微服务,需要注册到 Eureka
核心功能
Route
(路由) :路由信息由 ID、目标URL、一组断言、一组Filter 组成 (一般情况会通过断言进行判断 路由匹配)Predicate
(断言) :定义匹配的 HTTP 中的任何信息(如:请求头/参数等…Filter
(过滤器) :可在 请求/响应 进行一些业务上的处理
工作流程
说明:
客户端 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 的微服务中进行处理,此时处理运行特定的请求过滤器链
过滤器虚线分开的原因:会在发送代理请求的 请求/响应 执行逻辑(所有 pre 过滤器逻辑先执行,然后执行 代理请求;代理请求完成后,执行 post 过滤器逻辑,进行响应)
示例
代码在 01Spring Cloud 的基础上进行编辑
-
创建新Maven工程(无骨架)
我创建的工程名称 gateway -
gateway 依赖配置
pom.xml
<!-- gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
gateway 启动类
@SpringBootApplication @EnableDiscoveryClient // Eureka客户端 public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
-
gateway 配置
application.yml
server : port : 10010 spring : application : name : api-gateway cloud : gateway : routes : # 路由id (随意) - id : user-service-route # 代理服务的地址 # uri: http://localhost:9091 # 方式1 固定代理 uri : lb://user-service # 方式2 动态代理 # 路由断言,可以配置的映射路径 predicates: - Path=/user/** eureka : client : service-url : defaultZone : http://localhost:10086/eureka instance : # 优先应用ip,并非 host prefer-ip-address : true
注意:
- 填写路由断言的路径 不能存在空格
- Path=/user/**
说明:
- 代理路径 http://localhost:10010/user/1 ==> http://localhost:9091/user/1
- 代理路由 有两种方式写,但一般不会写死,因此应用第二种方式
- 路由配置中uri所用的协议为lb时,gateway 将使用 LoadBalancerClient 把 user-service 通过 eureka 解析为 实际IP 和 端口,并进行ribbon负载均衡
- 填写路由断言的路径 不能存在空格
-
测试
- 依次打开 Eureka、server、gateway 三个服务
- 访问 http://localhost:10010/user/1(返回 数据代表成功)
过滤器
通过以上工作流程可得知 ,Gateway 的路由 过滤器允许 修改传入 请求/响应 的HTTP,只作用于特定的路由
过滤器生命周期
Spring Cloud Gateway 的 Filter 有两种: pre
(请求被执行前调用)、post
(请求被执行后调用) ,以上的工作流程可看出
使用场景
- 请求鉴权:过滤器链式 调用到 filter()方法 前,如果发现无权限,返回Null
- 异常处理:过滤器链式 调用到 filter()方法 后,记录异常并返回
- 服务调用时长统计:过滤器链式 调用到 filter()方法 前后,根据时长统计
常用过滤器工厂
Gateway 中有很多内置的过滤器工厂,我们只需了解常用的过滤器
过滤器工厂名称 | 说明 |
---|---|
AddRequestHeader | 对匹配上的请求加上Header(请求头) |
RemoveRequestHeader | 对匹配上的请求去除Header(请求头) |
AddRequestParameter | 对匹配上的请求路由添加参数 |
SetStatus | 设置 HTTP请求 的响应码< |