初识Spring Cloud Gateway

文章目录

  • 一、网关简介
    • [1.1 网关提出的背景](#1.1 网关提出的背景)
    • [1.2 网关在微服务中的位置](#1.2 网关在微服务中的位置)
    • [1.3 网关的技术选型](#1.3 网关的技术选型)
    • [1.4 补充](#1.4 补充)
  • [二、Spring Cloud Gateway的简介](#二、Spring Cloud Gateway的简介)
    • [2.1 核心概念:路由(Route)](#2.1 核心概念:路由(Route))
    • [2.2 核心概念:断言(Predicate)](#2.2 核心概念:断言(Predicate))
    • [2.3 核心概念:过滤器(Filter)](#2.3 核心概念:过滤器(Filter))
    • [2.4 功能特性](#2.4 功能特性)
  • 三、自定义断言和过滤器
    • [3.1 自定义路由断言工厂](#3.1 自定义路由断言工厂)
    • [3.2 自定义过滤器工厂](#3.2 自定义过滤器工厂)
    • [3.3 自定义全局过滤器](#3.3 自定义全局过滤器)
  • 参考链接

一、网关简介

1.1 网关提出的背景

在微服务架构中,一个系统会被拆分为多个微服务,这样就带来了一些问题:

  • 前端需要维护大量微服务的地址。随着项目的迭代,后端可能需要重新划分微服务,此时前端需要进行相应的调整。
  • 每个微服务都需要进行一些重复的工作,如认证、鉴权、处理跨域问题。

为了解决上述问题,微服务引入了网关的概念。网关作为客户端的统一入口,负责将请求路由到具体的微服务。网关还可以实现一些业务无关的公用逻辑,如认证、鉴权、处理跨域、路由转发、安全策略(SQL注入,Web攻击,黑白名单)、流量控制、日志监控,证书/加密解密等处理等。

1.2 网关在微服务中的位置

请求链:客户端->负载均衡->网关->微服务。

1.3 网关的技术选型

1.4 补充

对于一般的系统,只涉及一个微服务应用,此时网关和微服务应用在一起。

对于复杂的系统,会涉及多个微服务应用,此时在每个微服务应用中都使用一个单独的网关是不合理的,正确的做法是单独使用一个应用作为这些微服务应用的共同网关。

二、Spring Cloud Gateway的简介

2.1 核心概念:路由(Route)

使用了网关后,所有客户端的请求都会先达到网关,再由网关将请求转发到特定的微服务。Spring Cloud Gateway中定义了路由的概念,使用路由来配置请求的转发逻辑,每个路由包含如下几个关键元素:

  • ID:路由的唯一标识符。
  • URI:目标服务的地址。
  • Order:路由优先级,数字越小,优先级越高。
  • Predicates:一系列判断条件,用于决定请求是否应该由当前路由处理。
  • Filters:请求在被转发前后可执行的一系列操作,用以修改请求或响应。

路由本质是一种配置,每种路由对应一条配置,可以通过配置文件或代码来配置。其中使用的Predicate和Filter可以是内置的,也可以是自定义的。

2.2 核心概念:断言(Predicate)

断言用于判断收到的请求是否应该由当前路由处理。断言基于请求的各种属性(如请求头、路径、方法等)进行匹配。Spring Cloud Gateway 提供了多种内置的断言工厂,如基于路径(Path)、请求方法(Method)、主机名(Host)、查询参数(Query)等的断言,同时也支持自定义断言。断言之间可以进行逻辑组合(AND、OR等),以实现复杂的匹配逻辑。

内置断言见官方文档中的5. Route Predicate Factories

2.3 核心概念:过滤器(Filter)

过滤器用于对请求和响应进行处理。过滤器可以修改请求、响应或执行路由逻辑。过滤器可以用来实现诸如身份验证、日志记录、请求改写、响应处理等多种功能。Spring Cloud Gateway同样提供了丰富的内置过滤器工厂,并且支持自定义过滤器。

从作用范围看,过滤器分为两种类型,网关路由器(Gateway Filters)应用于特定路由,全局路由器(Global Filters)应用于所有路由。

内置过滤器见官方文档中的6. GatewayFilter Factories7. Global Filters

2.4 功能特性

  • 基于Spring 5,Project Reactor,SprngBoot 2 构建。
  • 动态路由:能匹配任何请求属性。
  • 支持路径重写。
  • 集成 Spring Cloud 服务发现功能(Nacos,Eruka)。
  • 可集成流控降级功能(Sentinel,Hystrix)。
  • 可以对路由指定易于编写的 Predicates 和 Filters。

三、自定义断言和过滤器

3.1 自定义路由断言工厂

自定义路由断言工厂的要点(可以模仿内置路由断言工厂来写):

  • 必须是Spring的组件(使用@Component标记)。
  • 类名必须以"RoutePredicateFactory"为后缀(底层用到反射,约定了类名规范)。
  • 必须继承AbstractRoutePredicateFactory
  • 必须在内部定义一个静态内部类Config,用于接收配置信息,写法固定,定义需要的属性和对应的get方法即可。
  • 需要结合shortcutFieldOrder()进行绑定(配置信息绑定到静态内部类属性)。
  • apply()中定义断言逻辑。

3.2 自定义过滤器工厂

自定义过滤器工厂的要点(类似于自定义路由断言工厂的要点):

  • 必须是Spring的组件(使用@Component标记)。
  • 类名必须以"GatewayFilterFactory"为后缀。
  • 必须继承AbstractGatewayFilterFactory
  • 必须在内部定义一个静态内部类Config,用于接收配置信息,写法固定,定义需要的属性和对应的get/set方法即可。
  • 需要结合shortcutFieldOrder()进行绑定。
  • apply()中定义过滤逻辑。

3.3 自定义全局过滤器

写一个类实现GlobalFilter,然后将该类交给Spring管理即可,不需要单独配置。

参考链接

Spring Cloud Gateway 服务网关的部署与使用详细介绍
SpringCloud GateWay 万字详解
SpringCloud gateway (史上最全)

b站视频:图灵Java面试教程->SpringCloud Gateway微服务网关全套
官方文档:Spring Cloud Gateway

相关推荐
牛角上的男孩7 小时前
Istio Gateway发布服务
云原生·gateway·istio
柳叶寒2 天前
医院信息化与智能化系统(17)
java·nacos·gateway·全栈·项目
cyt涛3 天前
SpringCloudGateway — 网关路由
java·开发语言·网关·gateway·路由·断言·转发
代码魔法师Sunny5 天前
502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决
gateway
RedCong5 天前
通过route访问Openshift上的HTTP request报错504 Gateway Time-out【已解决】
http·gateway·openshift
飞升不如收破烂~6 天前
包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述:
nginx·gateway·dubbo
还是转转6 天前
Kong Gateway 指南
gateway·kong
攒了一袋星辰12 天前
微服务网关gateway过滤器工厂与自定义过滤器
微服务·架构·gateway
猫猫不是喵喵.12 天前
Gateway 统一网关
java·网络·微服务·gateway
12 天前
504 Gateway Time-outopenresty
gateway