Spring Cloud Gateway 初识网关第1篇

目录

一、网关的作用

二、运行工作原理 

 三、Gateway 与 Zuul

四、相关概念(Glossary)

五、开始项目

5.1.项目基础接口和版本依赖

5.2.建立配置文件application.yml

5.3.引入依赖

5.4.创建启动类

5.5.创建测试controller并启动项目运行基础项目

 六、配置路由断言工厂和过滤器工厂

6.1.快捷方式(Shortcut Configuration)常用

6.2.展开方式(Fully Expanded Arguments)

6.3.启动网关服务和启动服务提供者和服务消费者服务

 七、路由断言工厂(Route Predicate Factories)

 7.1.后路由谓词工厂(The After Route Predicate Factory)

7.2.前路由谓词工厂 (The Before Route Predicate Factory)

7.3.除了上面的例子外,还有很多类似的配置,下面主要有以下这些配置


本文是参考Spring Cloud Gateway3.1.4来写的,其提供在Spring WebFlux之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到api,并向它们提供横切关注点,例如:安全性、监视/度量和弹性

This project provides a library for building an API Gateway on top of Spring WebFlux. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.

 一、网关的作用

  • 统一入口:为全部微服务提供统一的入口,是外部访问和内部访问进行隔离,从而保证访问的安全性。
  • 鉴权校验:识别每个请求的权限,拒绝不符合的请求连接
  • 动态路由:动态的将请求的路由路由到不同的后端服务集群中
  • 减少客户端和服务端的耦合度:服务端可以任意发展,并通过网关来作为统一的管理入口

Spring Cloud Gateway 初识网关第1篇_第1张图片

二、运行工作原理 

Spring Cloud Gateway 初识网关第1篇_第2张图片

 客户端向 Spring Cloud Gateway 发起请求。如果网关处理程序映射确定一个请求与路由匹配,它就被发送到网关Web端处理程序。该处理程序通过特定于请求的筛选链运行请求。用虚线分隔过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”过滤器逻辑。然后发出代理请求。在发出代理请求之后,将运行“post”过滤器逻辑。

注:在没有端口的路由中定义的uri对于HTTP和HTTPS uri分别获得默认端口值80和443。

 三、Gateway 与 Zuul

  • Gateway 是 SpringCloud 微服务平台的一个子项目,属于 Spring 开源社区,依赖名叫:spring-cloud-starter-gateway
  • Zuul 是 Netflix 公司的开源项目,SpringCloud 在 Netflix 项目中也已经集成了 zuul,依赖名叫:spring-cloud-starter-netflix-zuul
  • SpringCloud Gateway 基于 Spring 5、projec treactor、springboot 2,使用非阻塞式的 API内置限流过滤器支持长连接(比如 websockets),在高并发和后端服务响应慢的场景下比 zuul的表现要好
  • Zuul 基于 servlet2.x 构建,使用阻塞的 API没有内置限流过滤器不支持长连接

四、相关概念(Glossary

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配.网关的基本构建块。它由一个ID、一个目标URI、一组predicates和一组filters定义。如果聚合predicate 为真,则匹配路由。
  • Predicate(断言): 这是一个Java 8函数Predicate。输入类型是Spring Framework ServerWebExchange。这允许您匹配来自HTTP请求的任何内容,比如头或参数。
  • Filter(过滤器):这些是使用特定工厂构造的GatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

五、开始项目

5.1.项目基础接口和版本依赖

spring boot版本>2.6.11,spring-cloud版本2021.0.4,spring-cloud-starter-gateway版本3.1.4

Spring Cloud Gateway 初识网关第1篇_第3张图片

5.2.建立配置文件application.yml

5.3.引入依赖

 
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
    

5.4.创建启动类

/**
 * Author:Created by @xietao on 2022-09-30-10-51
 * Motto:I am a slow walker, but I never walk backwards
 */
@Slf4j
@SpringBootApplication
public class SpiderGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpiderGatewayApplication.class, args);
        log.info("------------------ @SpiderGatewayApplication启动成功@ ------------------");
    }

}

5.5.创建测试controller并启动项目运行基础项目

@Slf4j
@RestController
public class TestController {

    @RequestMapping("/test")
    public String test1(){
        return "你好,欢迎来到 我的世界!";
    }
}

Spring Cloud Gateway 初识网关第1篇_第4张图片

Spring Cloud Gateway 初识网关第1篇_第5张图片

至此springboot+spring cloud的相关依赖的项目构建完成,下面就开始网关的学习

 六、配置路由断言工厂和过滤器工厂

有两种配置方式:快捷方式和展开配置的方式,很多例子用的是快捷方式,下面就介绍下这两种配置方式

6.1.快捷方式(Shortcut Configuration)常用

通过过滤器名称识别快捷配置,后面是等号(=),后面是用逗号分隔的参数值

application.yml(网关服务配置)

server:
  port: 5000
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          #配置要路由到的跳转地址
          uri: http://localhost:8001
          predicates:
            - Path=/spi/consumer/**
        - id: after_route
            #配置要路由到的跳转地址
            uri: http://localhost:8002
            predicates:
              - Path=/spi/provider/**

示例用两个参数定义了Path断言,当请求地址匹配是惠路由到uri的实际地址 

6.2.展开方式(Fully Expanded Arguments)

完全展开的参数看起来更像具有名称/值对的标准yaml配置。通常,会有一个name键和一个args键。args键是键值对的映射,用于配置断言或过滤器

application.yml

server:
  port: 5000
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          #配置要路由到的跳转地址
          uri: http://localhost:8001
          predicates:
#            - Path=/spi/consumer/**
            - name: Path
              args: /spi/provider/**
        - id: after_route
            #配置要路由到的跳转地址
            uri: http://localhost:8002
            predicates:
#              - Path=/spi/provider/**
              - name: Path
                args: /spi/provider/**

这是上面显示的Path断言的快捷配置的完整配置

6.3.启动网关服务和启动服务提供者和服务消费者服务

访问地址:

http://localhost:5000/spi/consumer/testLog

 Spring Cloud Gateway 初识网关第1篇_第6张图片

 同理访问服务提供者也是一样可以通过网关来进行访问

 七、路由断言工厂(Route Predicate Factories)

Spring cloud gateway 作为Spring WebFlux HandlerMapping基础设施的一部分来匹配路由。Spring cloud gateway包括许多内置的路由断言工厂。所有这些断言都与HTTP请求的不同属性相匹配。可以使用逻辑和语句组合多个路由断言工厂

Spring Cloud Gateway matches routes as part of the Spring WebFlux HandlerMapping infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logical and statements.

 7.1.后路由谓词工厂(The After Route Predicate Factory)

After路由断言工厂接受一个参数,即datetime(这是java的ZonedDateTime)。此断言匹配发生在指定datetime之后的请求。下面的示例配置一个after路由谓词

application.yml(网关改造)

Spring Cloud Gateway 初识网关第1篇_第7张图片

 完整代码

server:
  port: 5000
spring:
  cloud:
    gateway:
      routes:
        - id: after_route_consumer
          #配置要路由到的跳转地址
          uri: http://localhost:8001
          predicates:
            - Path=/spi/consumer/**
            - After=2022-10-04T17:40:00.309+08:00[Asia/Shanghai]
        - id: after_route_provider
            #配置要路由到的跳转地址
          uri: http://localhost:8002
          predicates:
            - Path=/spi/provider/**

此路线匹配2022年10月04日17:40之后的任何请求,在这个时间前通过网关访问报404

Spring Cloud Gateway 初识网关第1篇_第8张图片

 在当前时间大于设置时间17:40访问

Spring Cloud Gateway 初识网关第1篇_第9张图片

7.2.前路由谓词工厂 (The Before Route Predicate Factory)

 Before路由断言工厂有一个参数,一个datetime(这是一个java的ZonedDateTime)。此断言匹配发生在指定datetime之前的请求。下面的示例配置before路由谓词

application.yml(网关改造)

server:
  port: 5000
spring:
  cloud:
    gateway:
      routes:
        - id: after_route_consumer
          #配置要路由到的跳转地址
          uri: http://localhost:8001
          predicates:
            - Path=/spi/consumer/**
#            - After=2022-10-04T17:40:00.309+08:00[Asia/Shanghai]
            - Before=2022-10-04T17:50:00.309+08:00[Asia/Shanghai]
        - id: after_route_provider
            #配置要路由到的跳转地址
          uri: http://localhost:8002
          predicates:
            - Path=/spi/provider/**

上面配置完毕后,重启网关服务当前时间小于17:60前都能访问到服务消费者,但是当当前时间大于17:50时访问就会报404,和After配置相反。

7.3.除了上面的例子外,还有很多类似的配置,下面主要有以下这些配置

  • 路由间断言工厂(The Before Route Predicate FactoryThe Between Route Predicate FactoryThe Before Route Predicate Factory)
  • Cookie路由断言工厂(The Cookie Route Predicate Factory)
  • 报头路由断言工厂(The Header Route Predicate Factory)

  • 主机路由断言工厂(The Host Route Predicate Factory)

  • 方法路由断言工厂(The Method Route Predicate Factory)

  • *路径路由谓词工厂(The Path Route Predicate Factory)

  • 查询路由断言工厂(The Query Route Predicate Factory)

  • RemoteAddr路由断言工厂(The RemoteAddr Route Predicate Factory)

  • 修改远端地址的解析方式( Modifying the Way Remote Addresses Are Resolved)

  • 权重路由断言工厂(The Weight Route Predicate Factory)

  • xforwarding远程地址路由断言工厂(The XForwarded Remote Addr Route Predicate Factory)

具体文档内容,请根据需要参考:Spring Cloud Gateway

Spring Cloud Gateway 初识网关第1篇,这只是入门篇,资料完全来自于官网,接下来Spring Cloud Gateway 初识网关第2篇将对网关的过滤器进行进一步的讲解(多看官网的文档,以其他人翻译为辅助,提升自我读原始文档的能力)本文相关代码:spider-lab: java相关资料代码(基础、微服务、硬件等)

你可能感兴趣的:(java,spring,开发语言)