springcloud gateway简介(一)

  • Post author:
  • Post category:其他




前言

Spring Cloud Gateway该项目提供了一个构建在 Spring 生态系统(包括

Spring 5

,

Spring Boot 2



Project Reactor

)之上的 API 网关,旨在提供一种简单而有效的方法来路由到 api,并为它们提供横切关注点,例如: 安全性、监视 / 度量和弹性扩容。

官方原文链接



1. 引入

要在项目中包含 Spring Cloud Gateway,请使用具有

org.springframework.cloud

组 ID 和

spring-cloud-starter-gateway

项目 ID 的 starter,如果包含了 starter,但不希望启用 gateway,请设置

spring.cloud.gateway.enabled=false

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

注意:

1.Spring Cloud Gateway需要Spring Boot和Spring Webflux提供的Netty环境运行,所以不能在传统的servlet容器(tomcat,jboss)中或者war包的方式运行。

2. Spring Cloud Gateway是基于Spring Boot 2.x, Spring WebFlux, Project Reactor的响应式编程的,因此部分spring框架它上面可能不能工作(Spring Security ,spring data的mysql等传统数据库(Nosql可以使用))。如果不熟悉这些项目,建议首先阅读它们的文档,以便在使用 Spring Cloud Gateway 之前熟悉一些新概念。



2. 词汇

  • Route:路由,网关的基本组件,它由一个 ID、一个目标 URI、一组Predicate和一组Filter组成。
  • Predicate:断言: 这是Java 8新特性。输入类型是

    Spring Framework ServerWebExchange

    ,以匹配来自 HTTP 请求的任何内容,比如

    header



    parameter

  • Filter:过滤器。这些是

    Spring Framework GatewayFilter

    的实现,它们是用特定的工厂构建的。 这里,可以在发送下游请求之前或之后修改请求和响应。



3.工作流程

下面的图表概述了 Spring Cloud Gateway 的工作原理:

在这里插入图片描述

客户端向 Spring Cloud Gateway 网关发出请求。如果

Gateway Handler Mapping

确定请求与路由匹配,则将其发送到

Gateway Web Handler

。该

Handler

通过特定于请求的过滤器链来运行请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的前置过滤器执行完毕后,发出代理请求,最后执行后置过滤器。

注意:如果

route



url

没有声明端口号,则使用http或者https的默认端口号。



4.配置路由断言和过滤器

有两种配置断言和过滤器的方法: 简洁方式和完全扩展的参数。 下面的大多数例子都使用了简洁方式。

名称和参数名称将在每个部分的第一个或两个句子中作为代码列出。 参数通常按快捷配置所需的顺序列出。



4.1 简易配置

简易配置由固定的过滤器名称,后面跟着

=

和其他由

,

隔开的参数构成。


application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

上面的示例使用两个参数定义了

Cookie

路由断言,这两个参数是 Cookie 名称(mycookie) 和与 mycookivalee 匹配的值。



4.2 完全展开的配置

完全展开的配置看起来更像带有

名称 / 值

对的标准 yaml 配置。 通常,会有一个 name 键和一个 args 键。 args 用于配置断言或过滤器的键值对。


application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

上面两个例子分别展示了断言的简易配置和完全展开的配置。