5.SpringCloud 网关-Gateway

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过滤器就是在请求转发路由的时候,自动额外添加参数。

猜你喜欢

转载自blog.csdn.net/weixin_45698637/article/details/123673237