文章目录
- 一、网关简介
-
- [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 Factories
和7. 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