Gateway

简介

特点:

  • 限流
  • 路径重写
  • 集成SpringCloud DiscoveryClient
  • 集成Hystrix断路器
    和Zuul对比
  1. Zuul是Netfix公司的开源产品,Spring Cloud Gateway是Spring家族中的产品,可以和Spring家族中的其他组件更好的融合
  2. Zuul不支持长链接(长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。)
  3. Spring Cloud Gateway支持限流
  4. 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

这个过滤器就是在请求转发路由的时候,自动额外添加参数。

posted @ 2020-08-15 20:21  柒丶月  阅读(708)  评论(0编辑  收藏  举报