Gateway
简介
特点:
- 限流
- 路径重写
- 集成SpringCloud DiscoveryClient
- 集成Hystrix断路器
和Zuul对比
- Zuul是Netfix公司的开源产品,Spring Cloud Gateway是Spring家族中的产品,可以和Spring家族中的其他组件更好的融合
- Zuul不支持长链接(长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。)
- Spring Cloud Gateway支持限流
- Spring Cloud Gateway基于Netty来开发,实现了异步和非阻塞,占用资源更小,性能强于Zuul
基本用法
SpringCloud Gateway支持两种不同的用法:
- 编码式
- yml配置
两种都来看下。
编码式
首先创建spring boot项目,添加spring cloud gateway模块
项目创建成功后,直接配置一个 RouteLocator 这样一个 Bean,就可以实现请求转发。
@Bean
RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("javaboy_route",r->r.path("/get").uri("http://httpbin.org")).build();
}
这里只需要提供 RouteLocator 这个 Bean,就可以实现请求转发。配置完成后,重启项目,访问:http://localhost:8080/get
properties配置
spring.cloud.gateway.routes[0].id=javaboy_route
spring.cloud.gateway.routes[0].uri=http://httpbin.org
spring.cloud.gateway.routes[0].predicates[0]=Path=/get
YML配置
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Path=/get
服务化(结合微服务)
首先给Gateway添加依赖,将之注册到Eureka上。
加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
加配置:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 开启自动代理
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Path=/get
application:
name: gateway
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka
logging:
level:
org.springframework.cloud.gateway: debug
接下来,就可以通过Gateway访问到其他注册在Eureka上的服务了,访问方式和Zuul一样
Predicate
通过时间匹配:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
表示,请求时间在 2021-01-01T01:01:01+08:00[Asia/Shanghai] 时间之后,才会被路由。
除了 After 之外,还有两个关键字:
Before,表示在某个时间点之前进行请求转发
Between,表示在两个时间点之间,两个时间点用 , 隔开
也可以通过请求方式匹配,就是请求方法:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Method=GET
这个配置表示只给GET请求进行路由。
通过请求路径配置:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Path=/2020/0202/{segment}
表示路径满足 /2019/0612/ 这个规则,都会被进行转发,例如:
http://www.javaboy.org/2020/0202/git-install.html
http://www.javaboy.org/2020/0202/git-basic.html
通过参数进行匹配:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Query=name
表示请求中一定要有name参数才会进行转发,否则不会进行转发。
也可以指定参数和参数的值。
例如参数的 key 为 name,value 必须要以 java 开始:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Query=name,java.*
多种匹配方式也可以组合使用:
spring:
cloud:
gateway:
routes:
- id: javaboy_route
uri: http://httpbin.org
predicates:
- Query=name,java.*
- Method=GET
- After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
Filter
Spring Cloud Gateway中过滤器分为两大类:
- GatewayFilter
- GlobalFilter
AddRequestParameter过滤器使用:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: javaboy_route
uri: lb://provider
filters:
- AddRequestParameter=name,qwl
predicates:
- Method=GET
application:
name: gateway
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka
logging:
level:
org.springframework.cloud.gateway: debug
这个过滤器就是在请求转发路由的时候,自动额外添加参数。