当前位置: 首页 > news >正文

【从入门到精通Spring Cloud】统一服务入口Spring Cloud Gateway

文章目录

    • 📕1. 什么是API⽹关
    • 📕2. Spring Cloud Gateway 快速上手
        • ✏️2.1 创建网关项目
        • ✏️2.2 引入网关依赖
        • ✏️2.3 编写启动类
        • ✏️2.4 添加Gateway路由配置
    • 📕3. Predicate接口
        • ✏️3.1 Predicate代码演示
        • ✏️3.2 Predicate其他方法
    • 📕4. Route Predicate Factories
    • 📕5. Gateway Filter Factories
        • ✏️5.1 GatewayFilter
        • ✏️5.2 GlobalFilter
    • 📕6. 过滤器执⾏顺序

特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.21
Location:辽宁 · 大连

📕1. 什么是API⽹关

API⽹关(简称⽹关)也是⼀个服务,通常是后端服务的唯⼀⼊⼝,它的定义类似设计模式中的Facade模式(⻔⾯模式,也称外观模式)。它就类似整个微服务架构的⻔⾯,所有的外部客⼾端访问,都需要经过它来进⾏调度和过滤。

在这里插入图片描述

例如企业管理:外部⼈员去公司办理业务,公司需要先核实对⽅的⾝份再去进⾏办理。最开始只有⼀个员⼯,这个员⼯核实之后直接办理即可(单体架构)。随着公司的发展,划分了多个部⻔,每个部⻔负责的事情不同,每个部⻔都需要先核实对⽅的⾝份再进⾏办理(微服务架构)。这个流程不仅办事效率低,还增加了员工的工作流程。所以我们对此改进,设⽴前台,统⼀由前台来进⾏⾝份的校验,前台⾝份校验通过后,其他部⻔就设置信任,直接办理。前台就类似API⽹关。

网关核心功能

  1. 权限控制:作为微服务的⼊⼝,对用户进⾏权限校验,如果校验失败则进⾏拦截。
  2. 动态路由:⼀切请求先经过⽹关,但⽹关不处理业务,⽽是根据某种规则,把请求转发到某个微服务。
  3. 负载均衡:当路由的⽬标服务有多个时,还需要做负载均衡。
  4. 限流 : 请求流量过⾼时,按照⽹关中配置微服务能够接受的流量进⾏放⾏,避免服务压⼒过⼤。

📕2. Spring Cloud Gateway 快速上手

✏️2.1 创建网关项目

在这里插入图片描述

✏️2.2 引入网关依赖
<!--⽹关-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><!--基于nacos实现服务发现依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><!--负载均衡-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
✏️2.3 编写启动类
package com.SpringDemo.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}
✏️2.4 添加Gateway路由配置
server: port: 10010 #网关端口
spring: application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes: #网关路由配置- id: product-service #路由ID, ⾃定义, 唯⼀即可uri: lb://product-service #⽬标服务地址predicates: #路由条件- Path=/product/**- id: order-service uri: lb://order-service #⽬标服务地址predicates: #路由条件- Path=/order/**

配置字段说明

  1. id : ⾃定义路由ID,保持唯⼀。
  2. uri : ⽬标服务地址,⽀持普通URI 及 lb://应⽤注册服务名称。lb表⽰负载均衡,使⽤ lb:// ⽅式表⽰从注册中⼼获取服务地址。
  3. predicates : 路由条件,根据匹配结果决定是否执⾏该请求路由,上述代码中,我们把符合Path规则的⼀切请求,都代理到uri参数指定的地址。

📕3. Predicate接口

Predicate是Java 8提供的⼀个函数式编程接⼝,它接收⼀个参数并返回⼀个布尔值,⽤于条件过滤,请求参数的校验。

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);//...
}
✏️3.1 Predicate代码演示
@SpringBootTest
public class GatewayApplicationTests {@Test//判断某个字符串是否以a开头,lambda表达式public  void test1() {Predicate<String> predicate = (s) -> s.startsWith("a");System.out.println(predicate.test("abc"));System.out.println(predicate.test("bcd"));}@Test//判断某个字符串是否以a开头,匿名内部类public  void test2() {Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("a");}};System.out.println(predicate.test("abc"));System.out.println(predicate.test("bcd"));}
}
✏️3.2 Predicate其他方法
方法名称方法说明
isEqual(Object targetRef)⽐较两个对象是否相等,参数可以为Null
and(Predicate other)短路与操作,返回⼀个组成Predicate
or(Predicate other)短路或操作,返回⼀个组成Predicate
negate()返回表⽰此Predicate逻辑否定的Predicate

📕4. Route Predicate Factories

Route Predicate Factories (路由断⾔⼯⼚,也称为路由谓词⼯⼚,此处谓词表⽰⼀个函数),在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制。我们在配置⽂件中写的断⾔规则只是字符串,这些字符串会被Route Predicate Factory读取并处理,转变为路由判断的条件。⽐如前⾯配置的 Path=/product/, 就是通过Path属性来匹配URL前缀是 /product 的请求。Spring Cloud Gateway 默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate可以通过and逻辑进⾏组合。更多断言请查询官方文档

名称说明
After匹配指定⽇期之后的请求
Before匹配指定⽇期之前的请求
Between匹配两个指定时间之间的请求datetime2 的参数必须在datetime1 之后
Cookie请求中包含指定Cookie, 且该Cookie值符合指定的正则表达式
Header请求中包含指定Header, 且该Header值符合指定的正则表达式
Host请求必须是访问某个host(根据请求中的Host字段进⾏匹配)
Method匹配指定的请求⽅式
Path匹配指定规则的路径
RemoteAddr请求者的IP必须为指定范围

📕5. Gateway Filter Factories

  1. 路由(Routing):核心是 “判断数据往哪走”,在数据被允许通过后,根据目标地址等信息,计算并选择最优的转发路径。
  2. 过滤(Filtering):核心是 “判断是否允许数据通过”,基于预设规则(如 IP 地址、端口、协议、内容特征等)对数据包或请求进行检查,决定 “放行” 或 “阻断”。

Filter分为两种类型: Pre类型和Post类型

  1. Pre类型过滤器: 路由处理之前执⾏(请求转发到后端服务之前执⾏),在Pre 类型过滤器中可以做鉴权,限流等。
  2. Post类型过滤器: 请求执⾏完成后,将结果返回给客⼾端之前执⾏。
✏️5.1 GatewayFilter

GatewayFilter: 应⽤到单个路由或者⼀个分组的路由上。GatewayFilter 同 Predicate 类似,都是在配置⽂件 application.yml 中配置,每个过滤器的逻辑都是固定的。⽐如 AddRequestParameterGatewayFilterFactory 只需要在配置⽂件中写 AddRequestParameter ,就可以为所有的请求添加⼀个参数,我们先通过⼀个例⼦来演⽰GatewayFilter如何使⽤。

在application.yml中添加filter

server: port: 10010 #网关端口
spring: application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes: #网关路由配置- id: product-service #路由ID, ⾃定义, 唯⼀即可uri: lb://product-service #⽬标服务地址predicates: #路由条件- Path=/product/**fliters:- AddRequestParameter=userName, test- id: order-service uri: lb://order-service #⽬标服务地址predicates: #路由条件- Path=/order/**

GatewayFilter说明
Spring Cloud Gateway提供了的Filter⾮常多, 下⾯列出⼀些常⻅过滤器的说明.更多过滤请查询官方文档

在这里插入图片描述

✏️5.2 GlobalFilter

GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作⽤是相同的GlobalFilter 会应⽤到所有的路由请求上。详细内容查看官方文档

📕6. 过滤器执⾏顺序

⼀个项⽬中,既有GatewayFilter,⼜有 GlobalFilter时,执⾏的先后顺序是什么呢?

请求路由后,⽹关会把当前项⽬中的GatewayFilter和GlobalFilter合并到⼀个过滤器链(集合)中,并进⾏排序,依次执⾏过滤器。

在这里插入图片描述
每⼀个过滤器都必须指定⼀个int类型的order值,默认值为0,表⽰该过滤的优先级,order值越⼩,优先级越⾼,执⾏顺序越靠前。

  1. Filter通过实现Order接⼝或者添加@Order注解来指定order值。
  2. Spring Cloud Gateway提供的Filter由Spring指定,用户也可以⾃定义Filter,由用户指定。
  3. 当过滤器的order值⼀样时,会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执⾏。
http://www.dtcms.com/a/394058.html

相关文章:

  • setfacl 命令
  • Photoshop - Photoshop 分享作品和设计
  • 【Agent 设计模式与工程化】如何做出好一个可持续发展的agent需要考虑的架构
  • 【Camera开发】疑难杂症记录
  • 如何提高自己的Java并发编程能力?
  • Polkadot - ELVES Protocol详解
  • springBoot图片本地存储
  • 蝉镜-AI数字人视频创作平台
  • Linux入门(五)
  • MySqL-day4_03(索引)
  • Vue 深度选择器(:deep)完全指北:从“能用”到“用好”
  • [Nodejs+LangChain+Ollama] 1.第一个案例
  • 设计模式2.【备忘录模式】
  • Spring Boot 入门:快速构建现代 Java 应用的利器
  • Redis 实例 CPU 飙高到 90%,如何排查和解决?
  • 中国女篮备战全运会,宫鲁鸣重点培养年轻核心
  • 【Qt】常用控件1——QWidget
  • 9.21关于大模型推理未来的思考
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘uvicorn’ 问题
  • 变分自编码器(VAE):生成模型的另一条技术路线
  • 【LVS入门宝典】LVS NAT模式实战指南:ip_forward、iptables与SNAT、DNAT规则配置详解
  • 【Android】BottomSheet的三种使用
  • Spring MVC 九大组件源码深度剖析(八):RequestToViewNameTranslator - 视图名转换的奥秘
  • 在Linux环境下安装和卸载DMETL5数据迁移工具
  • 《计算》第五六章读书笔记
  • daily notes[47]
  • 模电基础:放大电路的分析方法---图解法
  • Windows10系统Web UI自动化测试学习系列1--介绍(序章-万事开头难)
  • 安装vllm的艰苦过程
  • 探索 Event 框架实战指南:微服务系统中的事件驱动通信: