7.统一网关-Gateway

文章目录

  • 1.统一网关介绍
  • 2.网关开发
  • 3.predicate
  • [4.Route Predicate Factories(路由断言工厂)](#4.Route Predicate Factories(路由断言工厂))
    • [4.1Path 路由断言工厂](#4.1Path 路由断言工厂)
    • [4.2.Method 路由断言工厂](#4.2.Method 路由断言工厂)
    • [4.3 Header 路由断言工厂](#4.3 Header 路由断言工厂)
    • [4.4 Query 路由断言工厂](#4.4 Query 路由断言工厂)
    • [4.5 Host 路由断言工厂](#4.5 Host 路由断言工厂)
    • [4.6 After 路由断言工厂](#4.6 After 路由断言工厂)
    • [4.7 Before 路由断言工厂](#4.7 Before 路由断言工厂)
    • [4.8 Between 路由断言工厂](#4.8 Between 路由断言工厂)
  • [5.Gateway Filter Factories (网关过滤器工厂)](#5.Gateway Filter Factories (网关过滤器工厂))
    • [5.1 The AddRequestHeader GatewayFilter Factory](#5.1 The AddRequestHeader GatewayFilter Factory)
    • [5.2 The AddRequestParameter GatewayFilter Factory](#5.2 The AddRequestParameter GatewayFilter Factory)
    • [5.3 The AddResponseHeader GatewayFilter Factory](#5.3 The AddResponseHeader GatewayFilter Factory)
    • [5.4 The DedupeResponseHeader GatewayFilter Factory](#5.4 The DedupeResponseHeader GatewayFilter Factory)
    • [5.5 Spring Cloud CircuitBreaker GatewayFilter Factory](#5.5 Spring Cloud CircuitBreaker GatewayFilter Factory)
    • [5.6 The FallbackHeaders GatewayFilter Factory](#5.6 The FallbackHeaders GatewayFilter Factory)
    • [5.7 自定义GatewayFilter](#5.7 自定义GatewayFilter)
  • [6.限流 - 限制流量](#6.限流 - 限制流量)
  • 7.GlobalFilter
  • 8.服务部署流程

大家好,我是晓星航。今天为大家带来的是 统一网关-Gateway 相关的讲解!😀

1.统一网关介绍

Spring Cloud Gateway是 Spring Cloud 的一个全新项目,基于 Spring 6.0+Spring Boot 3.0和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式。

网关核心功能:

1.权限控制

2.动态路由

3.负载均衡

4.限流

2.网关开发

1.创建项目

2.引入网关相关依赖

3.写启动类

4.配置文件

yml 复制代码
server:
  port: 10030
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 110.41.51.65:10020
    gateway:
      metrics:
        enabled: true
      routes:
        - id: order-service   #路由规则id, 随便起, 不重复即可
          uri: lb://order-service/ #目标服务地址
          predicates:   #路由条件
            - Path=/order/**,/feign/**
            - After=2024-03-20T00:00:22.370856700+08:00[Asia/Shanghai]
          filters:
            - AddRequestParameter=userName, bite
            - name: Custom    #过滤器名称
              args:
                name: test_custom
        - id: product-service
          uri: lb://product-service/
          predicates:
            - Path=/product/**
      default-filters:
        - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY
management:
  endpoints:
    web:
      exposure:
        include: "*"
#  endpoint:
#    health:
#      show-details: always
#    shutdown:
#      enabled: true

5.测试

3.predicate

在 Spring Cloud 中,Predicate 是指用于路由断言(Route Predicate)的一种组件。Spring Cloud 中的路由(Routing)功能通常用于服务网关(如 Spring Cloud Gateway 或 Zuul),它允许根据请求的特定条件(例如路径、方法、头部信息等)将请求路由到不同的目标服务。

基础写法:

匿名内部类:

lambda表达式:

negate 非

or 判断字符串为 aa或者bb

and 字符串不为空,且由数字组成,比如 "12", "34"

4.Route Predicate Factories(路由断言工厂)

这里便是我们路由断言的作用,例如上面条件为要在2024.03.20日后发送才会有相应的效果

4.1Path 路由断言工厂

根据请求路径匹配路由。

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: http://httpbin.org
        predicates:
        - Path=/foo/**  # 匹配所有以 /foo/ 开头的请求=

4.2.Method 路由断言工厂

根据 HTTP 请求方法匹配路由。

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: http://httpbin.org
        predicates:
        - Method=GET  # 匹配所有 GET 请求

4.3 Header 路由断言工厂

根据请求头的值匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: http://httpbin.org
        predicates:
        - Header=X-Request-Id, \d+  # 匹配请求头 X-Request-Id 存在且值为数字的请求

4.4 Query 路由断言工厂

根据查询参数匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://httpbin.org
        predicates:
        - QueryParam=foo, bar  # 匹配查询参数 foo 的值为 bar 的请求

4.5 Host 路由断言工厂

根据请求的 Host 头部信息匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://httpbin.org
        predicates:
        - Host=**.example.com  # 匹配所有以 example.com 结尾的主机名

4.6 After 路由断言工厂

根据请求时间在指定时间之后匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: http://httpbin.org
        predicates:
        - After=2023-01-20T17:42:47.789-07:00[America/Denver]  # 匹配指定时间之后的请求

4.7 Before 路由断言工厂

根据请求时间在指定时间之前匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: http://httpbin.org
        predicates:
        - Before=2023-01-20T17:42:47.789-07:00[America/Denver]  # 匹配指定时间之前的请求

4.8 Between 路由断言工厂

根据请求时间在两个时间之间匹配路由

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: http://httpbin.org
        predicates:
        - Between=2023-01-20T17:42:47.789-07:00[America/Denver],2023-01-21T17:42:47.789-07:00[America/Denver]  # 匹配两个时间之间的请求

5.Gateway Filter Factories (网关过滤器工厂)

5.1 The AddRequestHeader GatewayFilter Factory

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}

添加头信息:X-Request-Red,value为Blue-{segment},segment是路径里面带的信息

5.2 The AddRequestParameter GatewayFilter Factory

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        predicates:
        - Host: {segment}.myhost.org
        filters:
        - AddRequestParameter=foo, bar-{segment}

添加参数name=foo,value=bar-{segment}

5.3 The AddResponseHeader GatewayFilter Factory

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        predicates:
        - Host: {segment}.myhost.org
        filters:
        - AddResponseHeader=foo, bar-{segment}

5.4 The DedupeResponseHeader GatewayFilter Factory

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: https://example.org
        filters:
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

当网关CROS和下游响应头都有Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin时,将删除重复的响应头

5.5 Spring Cloud CircuitBreaker GatewayFilter Factory

使⽤ Spring Cloud CircuitBreaker的API将⽹关路由包装到断路器中。Spring Cloud CircuitBreaker ⽀持多种库⽤于Spring Cloud Gateway。⽐如Resilience4J。

要启⽤Spring Cloud CircuitBreaker过滤器,你需要引⼊spring-cloud-starter-circuitbreaker-reactor-resilience4j ,如下是配置示例

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: circuitbreaker_route
        uri: lb://backing-service:8088
        predicates:
        - Path=/consumingServiceEndpoint
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/inCaseOfFailureUseThis
        - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint

5.6 The FallbackHeaders GatewayFilter Factory

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: CircuitBreaker
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback
        filters:
        - name: FallbackHeaders
          args:
            executionExceptionTypeHeaderName: Test-Header

The FallbackHeaders GatewayFilter Factory

在该例中,在运⾏circuit breaker 发生异常后,请求将被转发到 http://localhost:9994 的 /fallback 中。异常类型、消息等通过 FallbackHeaders 过滤器添加到请求头中。

5.7 自定义GatewayFilter

过滤器的代码逻辑:

6.限流 - 限制流量

限流算法

1.固定窗口

2.滑动窗口

滑动窗口 也有小问题例如我们应该多久滑动一次呢,是一分钟还是10秒钟呢

3.漏桶算法

请求类似于生产者

请求处理速度类似消费者

露桶类似于队列

应激流量:突然出现的大量流量。

4.令牌算法

限流实现

7.GlobalFilter

GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作用是相同的.

GlobalFilter 会应用到所有的路由请求上,全局过滤器通常用于实现与安全性,性能监控和日志记录等相关的全局功能.

SpringCloud Gateway 内置的全局过滤器也有很多,比如:

  • Gateway Metrics Filter: 网关指标,提供监控指标
  • Forward Routing Filter: 用于本地forword,请求不转发到下游服务器
  • LoadBalancer Client Filter:针对下游服务,实现负载均衡
  • ...

更多过滤器参考: Global Filters

8.服务部署流程

1.确认配置

2.打包, 上传包到服务器

3.启动服务

4.开启端口号

5.测试

具体部署课看博主javaee初级篇文章 - Linux基本使用与部署

ateway中的全局过滤器,它和GatewayFilter的作用是相同的.

GlobalFilter 会应用到所有的路由请求上,全局过滤器通常用于实现与安全性,性能监控和日志记录等相关的全局功能.

SpringCloud Gateway 内置的全局过滤器也有很多,比如:

  • Gateway Metrics Filter: 网关指标,提供监控指标
  • Forward Routing Filter: 用于本地forword,请求不转发到下游服务器
  • LoadBalancer Client Filter:针对下游服务,实现负载均衡
  • ...

更多过滤器参考: Global Filters

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

相关推荐
晚枫歌F3 小时前
Dpdk介绍
linux·服务器
李慕婉学姐3 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆4 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin5 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20055 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉5 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国5 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
工程师老罗5 小时前
龙芯2k0300 PMON取消Linux自启动
linux·运维·服务器
2501_941882485 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
千百元6 小时前
centos如何删除恶心定时任务
linux·运维·centos