【Spring Cloud】gateway详细介绍

gateway是什么?

该项目提供了一个库,用于在 Spring WebFlux 之上构建 API 网关。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。

特点

  • 基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建。
  • 能够匹配任何请求属性的路由。
  • 谓词和过滤器特定于路由。
  • 断路器集成。
  • Spring Cloud Discovery客户端集成。
  • 易于编写谓词和过滤器。
  • 请求速率限制。
  • 路径重写。

词汇表

Route:网关的基本构建块。它由 ID、目标 URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由。

谓词:这是一个Java 8 函数谓词。输入类型是Spring FrameworkServerWebExchange。这使您可以匹配来自 HTTP 请求的任何内容,例如标头或参数。

过滤器GatewayFilter:这些是使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

gateway是如何工作的呢?

在这里插入图片描述

  1. Gateway 接收客户端请求。
  2. 请求与 Predicate 进行匹配,获得到对应的 Route。匹配成功后,才能继续往下执行。
  3. 请求经过 Filter 过滤器链,执行前置(prev)处理逻辑。例如说,修改请求头信息等。
  4. 请求被 Proxy Filter 转发至目标 URI,并最终获得响应。一般来说,目标 URI 是被代理的微服务,如果是在 Spring Cloud 架构中。
  5. 响应经过 Filter 过滤器链,执行后置(post)处理逻辑。
  6. Gateway 返回响应给客户端。

在这里插入图片描述

路由谓词工厂

after_route

before_route

between_route

cookie_route

header_route

host_route

method_route

path_route

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

query_route

remoteaddr_route

weight_high

GatewayFilter工厂

-AddRequestHeader

-AddRequestParameter

-AddResponseHeader

-DedupeResponseHeader

- Hystrix

- CircuitBreaker

- RewritePath

spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://example.org
        predicates:
        - Path=/red/**
        filters:
        - RewritePath=/red(?<segment>/?.*), $\{segment}

对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。请注意,由于 YAML 规范,$ 应将其替换为 $\。

FallbackHeaders

- MapRequestHeader

- PrefixPath=/mypath

/mypath这将作为所有匹配请求路径的前缀。因此,/hello将向 发送请求/mypath/hello

- PreserveHostHeader

- RedirectTo=302, https://acme.org

- RemoveRequestHeader=X-Request-Foo

这会在将X-Request-Foo标头发送到下游之前将其删除。

- RemoveResponseHeader=X-Response-Foo

这将X-Response-Foo在返回给网关客户端之前从响应中删除标头。

- RemoveRequestParameter=red

这将在将red参数发送到下游之前将其删除。

- RewritePath=/red(?/?.*), ${segment}

对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。请注意,由于 YAML 规范, 应 将 其 替 换 为 。 应将其替换为。 \

- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,

- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***

- SaveSession

- SetPath=/{segment}

对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。

- SetRequestHeader=foo, bar-{segment}

- SetResponseHeader=foo, bar-{segment}

- SetStatus=401

- StripPrefix=2

spring:
  cloud:
    gateway:
      routes:
      - id: nameRoot
        uri: https://nameservice
        predicates:
        - Path=/name/**
        filters:
        - StripPrefix=2

当通过网关向发出请求时/name/blue/red,向 发出的请求nameservice看起来像nameservice/red。

- name: RequestSize

      args:
        maxSize: 5000000

- name: SetRequestHostHeader

      args:
        host: example.org

针对于上面每个谓词及过滤器,大家可以针对官网进行学习了解。

个人实践

application.yml文件

server:
  port: 7001
spring:
  cloud:
    gateway:
      routes:  # 路由配置项,对应RouteDefinition数组
        - id: api_route  #路由的编号
          uri: lb://apis-service #路由到的目标地址
          predicates: #断言,谓词,作为路由的匹配条件,对应RouteDefinition数组
            - Path=/**
          filters: #过滤器,对请求进行拦截,实现自定义的功能,对应FilterDefinition数组
            - StripPrefix=0
        - id: oschina  #路由的编号
          uri: https://www.oschina.net #路由到的目标地址
          predicates: #断言,谓词,作为路由的匹配条件,对应RouteDefinition数组
            - Path=/oschina
          filters: #过滤器,对请求进行拦截,实现自定义的功能,对应FilterDefinition数组
            - StripPrefix=1

用配置文件中第二个 -id 进行举例说明,浏览器输入:http://localhost:7001/oschina,直接路由到 :https://www.oschina.net

注:① 如果配置多个 -id,这里有一点需要注意的,他们有一个执行顺序,从上至下执行,如果你的服务有先后顺序一定要注意。
② 配置文件中的路由 uri,可不要写成url。要不然导致项目起不来哦。

在这里插入代码片

在这里插入图片描述

总结

所学即所得,大家可以参考 官网 进行学习。
参考:芋道 Spring Cloud 网关 Spring Cloud Gateway 入门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值