Spring Cloud GateWay

747 阅读2分钟

简介

  • 限流
  • 路径重写
  • 动态路由

与 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 通过应用名去访问,并且自动支持负载均衡

image.png

也可以自己定义路由

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

访问时如下图测试

image.png

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