简介
- 限流
- 路径重写
- 动态路由
与 Zuul 对比
- Zuul 是 Netflix 公司产品, GateWay 是 Spring 家族产品
- Zuul1 不支持长连接,例如 websocket
- GateWay 支持限流
- GateWay 基于 Netty 开发,实现了异步和非阻塞,占用资源小,性能更强
微服务用法
GateWay 有两种用法
- 编码式
- yml式
新建项目,添加依赖,注意不要添加 webmvc 依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
编码式
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
// 自定义路由
.route("southyin_route",r->r.path("hello1").uri("http://localhost:8888"))
.build();
}
}
yml式
application 配置
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 192.168.189.101:8848
gateway:
discovery:
locator:
enabled: true
logging:
level:
org.southyin.gateway: debug
server:
port: 2020
启动项目,访问测试,这里访问可以直接 http://localhost:2020/prover/hello1 通过应用名去访问,并且自动支持负载均衡
也可以自己定义路由
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 192.168.189.101:8848
gateway:
routes:
- id: southyin_route # 路由名称,自定义
uri: http://localhost:8888 # 转发地址
predicates: # 定义接口,是个数组
- Path=/hello1
discovery:
locator:
enabled: true
logging:
level:
org.southyin.gateway: debug
server:
port: 2020
访问时如下图测试
Predicate
这是 Spring Cloud 强大的原因之一,举例说明
1.之前的 yml 是用 Path 来匹配
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- Path=/hello1
discovery:
locator:
enabled: true
2.配置的路由也可以靠时间来匹配
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- After=2021-09-05T01:01:01+08:00[Asia/Shanghai]
discovery:
locator:
enabled: true
表示请求时间在 2021-09-05 09:01:01 会被路由,还有两个关键字
- Before: 表示在某个时间点之前
- Between:表示在某两时间点之间,两个时间点用逗号分隔
3.也可以通过请求方法匹配
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- Method=GET
discovery:
locator:
enabled: true
表示只会路由 GET 请求
4.还可以用过请求路径匹配
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- Path=/test/{segment}
discovery:
locator:
enabled: true
表示 test 前缀都可以转发
5.通过参数来匹配
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- Query=name
discovery:
locator:
enabled: true
表示请求中必须有 name 参数才能进行转发
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: http://localhost:8888
predicates:
- Query=name,test.*
discovery:
locator:
enabled: true
表示 name 参数的 value 必须以 test 开始
Filter的用法
Gateway 中过滤器分为两大类:
- GatewayFilter
- GlobalFilter
spring:
cloud:
gateway:
routes:
- id: southyin_route
uri: lb://provider # lb,loadBalance 表示自动负载均衡
filters:
- AddRequestParameter=name,southyin
predicates:
- Method=GET
discovery:
locator:
enabled: true
这个过滤器表示在转发时自动添加 name 参数,value 值为 southyin