SpringCloud之 Gateway路由网关

news2025/8/6 18:55:27

文章目录

  • Gateway 路由网关
    • 一、部署网关
      • 🍍①添加依赖
      • 🍍②设置配置文件
      • 🍍③创建启动类
      • 🍍④路由功能配置
      • 🍍⑤路由访问服务
    • 二、路由过滤器
      • 2.1 单个过滤器: 配置文件
      • 2.2 全局过滤器: 自定义类


提示:以下是本篇文章正文内容,SpringCloud 系列学习将会持续更新

在这里插入图片描述

Gateway 路由网关

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

说到路由,想必各位一定最先想到的就是家里的路由器了,那么我们家里的路由器充当的是一个什么角色呢?

我们知道,如果我们需要连接互联网,那么就需要将手机或是电脑连接到家里的路由器才可以,而路由器则连接光猫,光猫再通过光纤连接到互联网,也就是说,互联网方向发送过来的数据,需要经过路由器才能到达我们的设备。而路由器充当的就是数据包中转站所有的局域网设备都无法直接与互联网连接,而是需要经过路由器进行中转,我们一般说路由器下的网络是内网,而互联网那一端是外网。
在这里插入图片描述
我们的局域网设备,无法被互联网上的其他设备直接访问,肯定是能够保证到安全性的。并且互联网发送过来的数据,需要经过路由器进行解析,识别到底是哪一个设备的数据包,然后再发送给对应的设备。

而我们的微服务也是这样,一般情况下,可能并不是所有的微服务都需要直接暴露给外部调用,这时我们就可以使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并且转发给多个相同微服务实例也可以实现负载均衡
在这里插入图片描述
在之前,路由的实现一般使用 Zuul,但是已经停更,而现在新出现了由 SpringCloud 官方开发的Gateway 路由,它相比 Zuul 不仅性能上得到了一定的提升,并且是官方推出,契合性也会更好,所以我们这里就主要讲解 Gateway。

回到目录…

一、部署网关

🍍①添加依赖

现在我们来创建一个新的项目 gateway-server,作为我们的网关,这里需要添加两个依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

第一个依赖就是网关的依赖,而第二个则跟其他微服务一样,需要注册到 Eureka 才能生效,注意不要添加 Web 依赖,使用的是 WebFlux 框架。

🍍②设置配置文件

我们来完善一下配置文件:设置端口、注册到 Eureka 中

server:
  port: 8500
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
spring:
  application:
    name: gateway

🍍③创建启动类

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

现在就可以启动了:
在这里插入图片描述

🍍④路由功能配置

现在还没有配置任何的路由功能,我们接着将路由功能进行配置,给刚刚的配置文件添加配置项:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes: # 配置路由,注意这里是个列表,每一项都包含了很多信息
      - id: borrow-service       # 路由名称
        uri: lb://borrowservice  # 路由的地址,lb表示使用负载均衡到微服务,也可以使用 http 正常转发
        predicates:              # 路由规则,断言什么请求会被路由
        - Path=/borrow/**        # 只要是访问的这个路径,一律都被路由到上面指定的服务

路由规则的详细列表(断言工厂列表)在这里:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories,可以指定多种类型,包括指定时间段、Cookie 携带情况、Header 携带情况、访问的域名地址、访问的方法、路径、参数、访问者IP 等。也可以使用配置类进行配置,但是还是推荐直接配置文件,省事。

🍍⑤路由访问服务

此时依然可以通过原有的服务地址进行访问:http://localhost:8082/borrow/2
在这里插入图片描述

我们现在也可以直接通过路由来访问我们的服务了:http://localhost:8500/borrow/2
在这里插入图片描述

这样我们就可以将不需要外网直接访问的微服务全部放到内网环境下,而只依靠网关来对外进行交涉。

回到目录…

二、路由过滤器

2.1 单个过滤器: 配置文件

路由过滤器支持以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应,路由过滤器的范围是某一个路由,跟之前的断言一样,Spring Cloud Gateway 也包含许多内置的路由过滤器工厂。
详细列表:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

比如,我们现在希望在请求到达时,在请求头中添加一些信息再转发给我们的服务,那么这个时候就可以使用路由过滤器来完成,我们只需要对配置文件进行修改:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: borrow-service
        uri: lb://borrowservice
        predicates:
        - Path=/borrow/**
      # 继续添加新的路由配置,这里就以书籍管理服务为例
      - id: book-service
        uri: lb://bookservice
        predicates:
        - Path=/book/**
        filters:   # 添加过滤器
        - AddRequestHeader=Test, HelloBook!
        # AddRequestHeader 就是添加请求头信息,其他工厂请查阅官网

接着我们在 BookController 中打印一下请求头的日志,看看是不是成功添加了:

@Slf4j
@RestController
public class BookController {
    @Resource
    private BookService bookService;
    @GetMapping("/book/{bid}")
    public Book findBookById(@PathVariable("bid") int bid, HttpServletRequest req) {
        log.info("book-service 的请求头: " + req.getHeader("Test"));
        return bookService.getBookById(bid);
    }
}

🔎当我们不通过 Gateway 访问我们的图书管理服务时:就没有请求头。
在这里插入图片描述
在这里插入图片描述

🔎现在我们通过 Gateway 访问我们的图书管理服务时:就成功获取到网关添加的请求头了。
在这里插入图片描述
请添加图片描述

回到目录…

2.2 全局过滤器: 自定义类

除了针对于某一个路由配置过滤器之外,我们也可以自定义全局过滤器,它能够作用于全局

比如我们要实现拦截没有携带指定请求参数的请求

①自定义全局过滤器类,实现 GlobalFilter 接口,重写 filter() 方法,实现具体过滤策略。

@Slf4j
@Component  // 需要注册为Bean
public class TestFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 先获取 ServerHttpRequest 对象,注意不是 HttpServletRequest
        ServerHttpRequest request = exchange.getRequest();
        // 打印一下所有的请求参数
        log.info("请求参数: " + request.getQueryParams());
        // 判断是否包含 val 参数,且参数值为 1
        List<String> value = request.getQueryParams().get("val");
        if(value != null && value.contains("1")) {
            // 将 ServerWebExchange 向过滤链的下一级传递(跟 JavaWeb 中介绍的过滤器其实是差不多的)
            return chain.filter(exchange);
        }else {
            // 直接在这里拦截,然后返回响应
            return exchange.getResponse().setComplete();
        }
    }
}

可以看到结果:成功实现规则判断和拦截操作。
在这里插入图片描述
在这里插入图片描述

②当然,过滤器肯定是可以存在很多个的,所以我们可以手动指定过滤器之间的顺序

  • Order 的值越小,优先级越高。
  • 无论是在配置文件中的单个路由过滤器,还是全局路由过滤器,都会受到 Order 值影响。
    (单个路由的过滤器 Order 值按从上往下的顺序从1开始递增)。
  • 最终是按照 Order 值决定哪个过滤器优先执行,当 Order 值一样时,全局路由过滤器执行 优于 单独的路由过滤器执行。

配置文件中的单个路由过滤器 Order 值:

filters:   # 过滤器
  - AddRequestHeader=Test, HelloBook!                     # Order = 1
  - AddRequestHeadersIfNotPresent=X-Request-Color-1:blue  # Order = 2
  - AddRequestParameter=red, blue                         # Order = 3

全局路由过滤器指定 Order 值: 实现 Ordered 接口,默认为 0

@Component
public class TestFilter implements GlobalFilter, Ordered {   // 实现 Ordered 接口  
    @Override
    public int getOrder() {
        return 0;
    }
}

回到目录…


总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,学习了部署 Gateway路由网关,并且在配置文件中设置单个路由过滤器,以及通过自定义类实现全局过滤器的方法。之后的学习内容将持续更新!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构初阶】详解链表OJ题

目录一.删除链表中等于给定值的节点二.合并有序链表并返回三.链表的回文结构1.反转单链表2.返回非空链表的中间节点四.输出链表倒数第K个节点五.基于给定值x分割单链表六.返回两个链表的第一个中间节点一.删除链表中等于给定值的节点 我们先来看第一题(题目链接): 因为我们需…

王道《操作系统》学习(二)—— 进程管理(一)

2.1 进程的概念、组成、特征、组织 2.1.1 进程的概念 这里像QQ这个程序执行了多次&#xff0c;虽然名字一样&#xff0c;但是它们的PID不同。 2.1.2 进程的组成 &#xff08;1&#xff09;PCB &#xff08;2&#xff09;程序段 和 数据段 小例子&#xff1a;程序是如何执行的&…

Nacos实现配置中心

文章目录配置中心提供的基础功能Nacos实现配置中心1、在配置文件增加配置&#xff08;application.yml&#xff09;2、使用Value来引用配置使用配置中心&#xff0c;怎样的配置方式呢一、安装nacos二、启动服务发现1、引入依赖2、配置文件3、开启服务注册发现功能4、启动服务三…

quarkus 生产环境与k8s集成总结

quarkus 生产环境与k8s集成总结 大纲 基础准备quarkus2.13.7脚手架工程配置GraalVM-java11 安装配置配置maven3.8.7linux环境下云原生二进制文件打包环境搭建编译运行quarkus二进制文件quarkus二进制文件制作为docker镜像并运行使用k8s部署quarkus二进制文件 基础准备 生产…

手把手交叉编译mysql

1.下载mysql&#xff08;注意下载boost版本&#xff0c;这样会少一步编译&#xff09; 下载mysql的时候一定要看好交叉编译工具链的版本。因为mysql 8.0需要的工具链版本较高&#xff0c;所以有可能不支持 查看链接如下&#xff1a; MySQL :: MySQL 8.0 Reference Manual :: …

InstructGPT方法简读

InstructGPT方法简读 引言 仅仅通过增大模型规模和数据规模来训练更大的模型并不能使得大模型更好地理解用户意图。由于数据的噪声极大&#xff0c;并且现在的大多数大型语言模型均为基于深度学习的“黑箱模型”&#xff0c;几乎不具有可解释性和可控性&#xff0c;因此&…

「SAP ABAP」OPEN SQL(四)【FROM语句】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

CIMCAI port ai shipping ai artificial intelligence smart port

上海人工智能独角兽中集集团高科技中集飞瞳&#xff0c;是全球应用落地最广&#xff0c;规模最大&#xff0c;最先进的的港航人工智能高科技企业&#xff0c;工业级成熟港航人工智能产品全球规模化落地应用&#xff0c;全球前三大船公司及港口码头应用落地。上海人工智能独角兽…

3.4 按键控制LED灯光敏传感器控制蜂鸣器

按键控制LED灯1.1 按键连接示意图1.2 代码设计1.21 设计思路我们要实现按键控制led&#xff0c;我们需要完成LED和按键驱动代码&#xff0c;但如果把这两部分代码都混在主函数里面&#xff0c;那么代码显得过于杂乱&#xff0c;不容易管理和移植&#xff0c;所以对于这种驱动代…

记一次反射型XSS

记一次反射型XSS1.反射型XSS1.1.前言1.2.测试过程1.3.实战演示1.3.1.输入框1.3.2.插入代码1.3.3.跳转链接2.总结1.反射型XSS 1.1.前言 关于这个反射型XSS&#xff0c;利用的方式除了钓鱼&#xff0c;可能更多的就是自娱自乐&#xff0c;那都说是自娱自乐了&#xff0c;并且对系…

Maxscale读写分离实施文档

Maxscale介绍 MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换。 使用Maxscale无需对业务代码进行修改&#xff0c;其自带的读写分离模块&#xff0c;能够解析SQL语句&…

DD-1/40 10-40mA型【接地继电器】

系列型号&#xff1a; DD-1/40接地继电器 DD-1/50接地继电器 DD-1/60接地继电器 一、 用途及工作原理 DD-1型接地继电器为瞬时动作的过电流继电器&#xff0c;用作小电流接地电力系统高电压三相交流发电机和电动机的接地零序过电流保护。继电器线圈接零序电流互感器(电缆式、母…

Vue动态粒子特效插件(背景线条吸附动画)

目录 效果图&#xff1a; 一、安装&#xff1a; 二、引入 main.js 文件&#xff1a; 三、使用&#xff1a; 四、属性说明&#xff1a; 效果图&#xff1a; 一、安装&#xff1a; npm install vue-particles --save 二、引入 main.js 文件&#xff1a; import VueParticles…

【C++】30h速成C++从入门到精通(多态)

多态的概念多态&#xff1a;通俗来说就是多种心态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象&#xff0c;去调用同意函数&#xff0c;产生了不同的行为&#xff0…

C/C++每日一练(20230307)

目录 1. 国名排序 ★★ 2. 重复的DNA序列 ★★★ 3. 买卖股票的最佳时机 III ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 ​专栏 1. 国名排序 小李在准备明天的广交会&#xff0c;明天有来自世界各国的客房跟他们谈生意&#xff0c…

结合基于规则和机器学习的方法构建强大的混合系统

经过这些年的发展&#xff0c;我们都确信ML即使不能表现得更好&#xff0c;至少也可以在几乎所有地方与前ML时代的解决方案相匹配。比如说一些规则约束&#xff0c;我们都会想到能否把它们替换为基于树的ml模型。但是世界并不总是黑白分明的&#xff0c;虽然机器学习在解决问题…

spring boot actuator 动态修改日志级别

1 日志级别 Spring Boot Actuator包括在运行时查看和配置应用程序日志级别的功能。您可以查看整个列表&#xff0c;也可以查看单个记录器的配置&#xff0c;该配置由显式配置的日志级别和日志框架给出的有效日志级别组成。这些级别可以是: TRACEDEBUGINFOWARNERRORFATALOFFnu…

ruoyi-pro 代码生成api,swagger扫描不到

背景 重新创建一个新的maven工程&#xff0c;按照芋道源码ruoyi-pro官方文档生成代码后&#xff0c;新的maven工程目录下的接口不能被swagger扫描到&#xff0c;swagger-ui不显示新增的maven工程模块下的api。 解决方法 新增maven工程类中&#xff0c;新增swagger扫描配置类…

JavaWeb--用户登录注册案例

用户登录注册案例4.1 需求分析4.2 用户登录功能4.3 记住我-设置Cookie4.4 记住我-获取Cookie4.5 用户注册功能4.6 验证码-展示4.7验证码-校验4.8 测试目标 理解什么是会话跟踪技术掌握Cookie的使用掌握Session的使用完善用户登录注册案例的功能 4.1 需求分析 需求说明&#xf…

循环队列的实现

我们知道队列的实现可以用单链表和数组&#xff0c;但是循环链表也可以使用这两种方式。首先我们来看看单链表&#xff1a;首先使用单链表&#xff0c;我们需要考虑循环队列的一些特点。单链表实现循环队列我们要考虑几个核心问题&#xff1a;首先我们要区别 解决 空 和 满 的问…