5.SpringCloud 网关-Gateway
- Gateway 介绍
- Gateway 基本使用
- 编码式配置示例
- yml 配置示例
- Route(路由)
- Predicate(断言)
- Filter(过滤器)
Gateway 介绍
SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul。而为了提升网关的性能,Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的通信框架Netty。
1. Gateway 特征
- 限流
- 路径重写
- 动态路由
- 集成 Spring Cloud DiscoveryClient
- 集成 Hystrix 断路器
2. 核心概念
- Filter(过滤器)
和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为GatewayFilter类的实例。
- Route(路由)
网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
- Predicate(断言)
这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
3. Gateway 与 Zuul 的区别
- Zuul 是 Netflix 公司的开源产品,Spring Cloud Gateway 是 Spring 家族中的产品,可以和 Spring 家族中的其他组件更好的融合。
- Zuul1 不支持长连接,例如 websocket。
- Spring Cloud Gateway 支持限流。
- Spring Cloud Gateway 基于Netty来开发,实现了异步和非阻塞,占用资源更小,性能强于 Zuul。
Gateway 基本使用
Spring Cloud Gateway 支持两种不同的用法:
- 编码式
- yml 配置
编码式配置示例
1.创建 Spring Boot 项目,添加 Spring Cloud Gateway 依赖:
<!-- 网关 gateway 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.项目创建成功后,直接配置一个 RouteLocator 的Bean,就可以实现请求转发。
@Bean
RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
// 设置路由规则
.route("test_route", r -> r.path("/get").uri("http://httpbin.org"))
.build();
}
3.启动项目,访问:http://localhost:8080/get,请求就会转发到http://httpbin.org
yml 配置示例
# gateway路由规则配置
spring:
cloud:
gateway:
# 路由
routes:
# - 表示数组
- id: test_route # id
uri: http://httpbin.org # 目标URI
predicates: # 断言
- Path=/get # 表示根据路径匹配
discovery:
locator:
enabled: true # 开启自动代理
application:
name: gateway
# 将gateway服务注册到 eureka上
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka、
# 日志级别
logging:
level:
org.springframework.cloud.gateway: debug
启动项目,访问接口,http://localhost:8080/get,请求就会转发到http://httpbin.org
Route(路由)
一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
# gateway路由规则配置
spring:
cloud:
gateway:
# 路由
routes:
# - 表示数组
- id: test_route # id
uri: http://httpbin.org # 目标URI
predicates: # 一组断言
- Path=/get # 表示根据路径匹配
filters: # 一组过滤器
- AddRequestParameter=name,zhangsan
Predicate(断言)
1. 通过时间匹配
- After:表示在某个时间点之后进行请求转发
- Before:表示在某个时间点之前进行请求转发
- Between:表示在两个时间点之间进行请求转发,两个时间点用 , 隔开
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://httpbin.org
predicates:
- After=2022-03-22T01:01:01+08:00[Asia/Shanghai]
上述配置表示,请求时间在 2022-03-22T01:01:01+08:00[Asia/Shanghai] 时间之后,才会被路由。
2. 通过请求方式匹配
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://httpbin.org
predicates:
- Method=GET
上述配置表示只给 GET 请求进行路由。
3. 通过请求路径匹配
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://www.javaboy.org
predicates:
- Path=/2019/0612/{segment}
上述配置表示路径满足 /2019/0612/** 这个规则,都会被进行路由。
4. 通过参数进行匹配
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://httpbin.org
predicates:
- Query=name
上述配置表示请求中一定要有 name 参数才会进行路由,否则不会进行路由。
也可以指定参数和参数的值:
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://httpbin.org
predicates:
- Query=name,java.*
上述配置表示请求中一定要有 name 参数,且value值 必须要以 java 开头才会进行路由。
5. 多种匹配方式组合使用
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://httpbin.org
predicates:
- Query=name,java.*
- Method=GET
- After=2022-03-22T01:01:01+08:00[Asia/Shanghai]
Filter(过滤器)
Spring Cloud Gateway 中的过滤器分为两大类:
- GatewayFilter
- GlobalFilter
过滤器使用示例:
spring:
cloud:
gateway:
routes:
- id: test_route
uri: lb://provider # 这里表示路由到provider服务
filters:
- AddRequestParameter=name,javaboy
predicates:
- Method=GET
AddRequestParameter过滤器就是在请求转发路由的时候,自动额外添加参数。