初识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

相关推荐
研究司马懿3 天前
【云原生】Gateway API介绍
云原生·gateway
研究司马懿3 天前
【云原生】Gateway API路由、重定向、修饰符等关键操作
云原生·gateway
研究司马懿3 天前
【云原生】初识Gateway API
云原生·gateway
七夜zippoe4 天前
API网关设计模式实战 Spring Cloud Gateway路由过滤限流深度解析
java·设计模式·gateway·路由·api网关
汪碧康4 天前
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
云原生·容器·架构·kubernetes·gateway·kubelet·xkube
大佐不会说日语~4 天前
Docker Compose 部署 Spring Boot 应用 502 Bad Gateway 问题排查与解决
spring boot·docker·gateway·maven·故障排查
Dontla6 天前
Kubernetes流量管理双雄:Ingress与Gateway API解析(Nginx与Ingress与Gateway API的关系)
nginx·kubernetes·gateway
JavaLearnerZGQ6 天前
Gateway网关将登录用户信息传递给下游微服务(完整实现方案)
微服务·架构·gateway
Ares-Wang7 天前
网络》》BGP Border Gateway Protocol,边界网关协议
网络·gateway
一方_self8 天前
cloudflare AI gateway实战代理任意第三方大模型服务提供商
人工智能·gateway