【Spring Cloud Netflix】GateWay服务网关
1.基本概述
GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。
2.核心概念
2.1路由(Route)
路由是Spring Cloud gateWay中最基本的构建块,它由一个ID,一个目标URI(不是URL,URL是URI的一种),一组断言和一组过滤器组成。当一个请求满足路由中的所有断言是,该请求会被路由到指定的URI中。
它定义了请求从网关到目标服务的映射规则,决定了请求将被转发到哪个具体的微服务。
2.2断言(Predicate)
断言是Java8中java.util.function.Predicate的示例。在Spring Cloud Gateway里,它用于匹配HTTP请求的条件。只有当请求满足断言所定义的条件时,才会被路由到相应的目标服务。
它是用来帮助网关判断是否将请求路由到特定的服务。可以根据请求的多种属性进行匹配,如请求路径、请求方法、请求头、请求参数等。
2.3过滤(Filter)
过滤器是 Spring Cloud Gateway 中用于修改请求和响应的组件。可以在请求被路由到目标服务之前(前置过滤器)或之后(后置过滤器)对请求和响应进行处理。
它实现诸如请求参数修改、请求头添加、限流、熔断、日志记录等功能,增强网关的功能和安全性。
3.工作流程
客户端将请求发送给SpringCloud GateWay,如果GateWay Handler Mapping确定这个请求和一个路由匹配,它将此请求发送给GatWay Web Handler进行处理。此时GatWay Web Handler就会处理请求,通过Filter Chain来进行处理,这个过滤器链会在请求路由前后都执行。简而言之就是通过一连串的Filter处理匹配到特定规则Predicates的请求。
基于上面的原理图,下面进一步查看其流程图
执行流程大致如下:
1. Gateway Client向Gateway Server发送请求。
2. 请求被HttpWebHandlerAdapter提取组装成网关上下文。
3. 网关上下文传递到DispatcherHandler,由其将请求分发给RoutePredicateHandlerMapping。
4. RoutePredicateHandlerMapping进行路由查找,依据路由断言判断路由可用性。
5. 断言成功时,FilteringWebHandler创建过滤器链并调用。
6. 请求依次经过PreFilter、微服务、PostFilter的方法后返回响应。
4.搭建网关微服务
先导入相关依赖
<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client gateWay作为网关,也要注册进服务中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- gateway和web不能同时存在,即web相关jar包不能导入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
然后编写启动类
@SpringBootApplication
@EnableDiscoverClient
public class GateWayApplication{public static void main(String[] args){SpringApplication.run(GateWayApplication.class,args);}
}
编写yml配置文件
server:port: 9527 # 配置网关服务监听的端口号为9527
spring:application:name: service - gateway # 配置Spring应用的名称为service - gatewaycloud:gateway:routes:- id: consumer_route # 路由id,一般保证唯一即可uri: http://localhost:80 # 路由目标地址,这里是本地80端口,硬编码形式(不推荐)predicates:- Path=/api/consumer/** # 断言规则,匹配以/api/consumer/开头的请求路径filters:- StripPrefix=1 # 过滤器,在请求转发到目标服务前,去掉一层路径,这里去掉的是/api- id: provider_routeuri: lb://service-provider # 使用负载均衡(lb)访问名为service-provider的微服务,动态路由(推荐)predicates:- Path=/provider/** # 断言规则,匹配以/provider/开头的请求路径
eureka:client:register-with-eureka: true # 配置向Eureka注册中心注册自身服务实例fetch-registry: true # 配置从Eureka注册中心拉取服务注册信息service-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka # Eureka注册中心的地址
动态路由中的lb属于GateWay的关键字,代表是动态uri,即代表使用 的是服务注册中心的微服务名,它默认开启使用负载均衡机制。
5.断言详讲
我们重点讨论的是内置断言,即已经实现好的断言,而非自己定义的断言。
5.1.After
After 在指定时间之后,顾名思义就是只有在指定时间之后的请求才会生效。After后面跟的是一个时间
配置文件如下
predicates:- Path=/api/consumer/**- After=2023-05-16T20:29:54.475+08:00[GMT+08:00]
5.2.Before
before 指定时间之前只有在指定时间之前的请求才会生效。
在配置文件里面,我们配置如下
predicates:- Path=/api/consumer/**- Before=2023-05-16T20:29:54.475+08:00[GMT+08:00]
5.3.Between
between 需要在设定的时间范围之内才能进行请求转发。
在配置文件里面,我们配置如下
predicates:- Path=/api/consumer/**- Between=2023-05-16T20:19:54.475+08:00[GMT+08:00],2023-05
16T20:32:54.475+08:00[GMT+08:00]
5.4.Cookie
要求请求中包含指定Cookie名和满足特定正则要求的值,Cookie必须有两个值,第一个Cookie包含的参 数名,第二个表示参数对应的值,可以是具体的值,也可以是正则表达式。 在配置文件里面,我们配置如下:
predicates:- Path=/api/consumer/**- Cookie=username,eric
5.5.Header
表示请求头中必须包含的内容。注意:参数名和参数值之间依然使用逗号,参数值可以写具体的值,也可 以使用正则表达式。如果Header只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请 求头必须包含的参数名,第二个表示请求头参数对应值。
配置如下
predicates:- Path=/api/consumer/**- Header=name,james
5.6.Host
匹配请求参数中Host参数的值,可以有多个,使用逗号隔开**表示支持模糊匹配。
在配置文件里面我们进行如下配置:
predicates:- Path=/api/consumer/**- Host=127.0.0.1:8080,**.test.com
5.7.Method
Method表示请求方式。支持多个值,使用逗号分隔,多个值之间为or条件。
在配置文件里面我们进行如下配置:
predicates - Path=/api/consumer/**- Method=GET # 只允许使用GET请求方式
5.8.Query
要求请求必须携带对应的参数。
我们在配置文件里面我们进行如下配置:
predicates:- Path=/api/consumer/**- Query=age,18
请求的URL要在后面用?拼接该参数才能访问到
5.9.RemoteAddr
允许访问的客户端地址,不能使用类似ocahost这种。
在配置文件里面我们配置如下:
predicates - Path=/api/consumer/* - RemoteAddr=127.0.0.1
相关文章:
【Spring Cloud Netflix】GateWay服务网关
1.基本概述 GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…...
国产芯片解析:龙讯USB Type-C/DP Transmitter多场景覆盖,定义高速互联新标杆
在智能设备功能日益复杂化的今天,高速数据传输、高清视频输出与多功能接口融合已成为行业刚需。龙讯半导体(Lontium)凭借其领先的芯片设计能力,推出多款USB Type-C/DP Transmitter芯片,覆盖从消费电子到工业应用的…...
蓝桥杯 web 展开你的扇子(css3)
普通答案: #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…...
【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
StorageClass 使得用户能够根据不同的存储需求动态地申请和管理存储资源。 StorageClass 定义了如何创建存储资源,并指定了存储供应的配置,例如存储类型、质量、访问模式等。为动态存储供应提供了基础,使得 Kubernetes 可以在用户创建 PVC 时…...
4月7号.
双列集合的特点: Map中的常见API: //1.创建Map集合的对象 Map<String, String> m new HashMap<>();//2.添加元素 Stringvalue1 m.put("郭靖","黄蓉"); System.out.println(value1); m.put("韦小宝","沐剑屏"); m.put(&q…...
C++抽卡模拟器
近日在学校无聊,写了个抽卡模拟器供大家娱乐。 代码实现以下功能:抽卡界面,抽卡判定、动画播放、存档。 1.抽卡界面及判定 技术有限,不可能做的和原神一样精致。代码如下(注:这不是完整代码,…...
蓝桥杯 2. 开赛主题曲【算法赛】
2.开赛主题曲【算法赛】 - 蓝桥云课 这道题和3. 无重复字符的最长子串 - 力扣(LeetCode)类似,因为题目中规定只有小写字母,所以定义统计数组时只需要定义26个字母即可,然后每次遍历的字符减去‘a’即为他的下标 impo…...
Spring Boot 中的 Bean
2025/4/6 向全栈工程师迈进! 一、Bean的扫描 在之前,对于Bean的扫描,我们可以在XML文件中书写标签,来指定要扫描的包路径,如下所示,可以实通过如下标签的方式: <context:component-scan base-package&…...
基于springboot科研论文检索系统的设计(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在此…...
Mysql入门
一、数据库三层结构 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)一个数据库中可以创建多个表,以保存数据(信息)。数据库管理系统(DBMS)、数据库和表的关系如…...
如何解决uniapp打包安卓只出现功能栏而无数据的问题
如何解决uniapp打包安卓只出现功能栏而无数据的问题 经验来自:关于Vue3中调试APP触发异常:exception:white screen cause create instanceContext failed,check js stack -> at useStore (app-service.js:2309:15)解决方案 - 甲辰哥来帮你算命 - 博客…...
Python高级爬虫之JS逆向+安卓逆向1.1节-搭建Python开发环境
目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…...
剖析Mybatis中用到的设计模式
框架对很多设计模式的实现,都并非标准的代码实现,都做了比较多的自我改进。实际上,这就是所谓的灵活应用, 只借鉴不照搬, 根据具体问题针对性地去解决。 涉及到Mybatis源码知识和设计模式,这点我之前的博客均有涉及。 可以查看我的…...
MySQL 函数(入门版)
目录 一、字符串函数 1、常用的字符串函数 2、函数演示 3、具体案例 二、数值函数 1、常用的数值函数 2、函数演示 3、具体案例 三、日期函数 1、常用的日期函数 2、函数演示 3、具体案例 四、流程函数 1、常用的流程函数 2、函数演示 3、具体案例 在MySQL中&a…...
d202546
目录 一、罗马字符转数字 二、二叉树的右视图 三、sql-查询结果的质量和占比 一、罗马字符转数字 首先把两个字符组成一个数字做一下单独判断 然后就是单个字符转数字 public int romanToInt(String s) {int sum 0;char[] ch s.toCharArray();int i 0;while(i < ch.len…...
洛谷每日1题-------Day37__P1634 禽兽的传染病
题目背景 mxj 的启发。 题目描述 禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染? 输入格式 两个非负整数 x 和 n。 输出格式 一个整数,即被传染的禽兽数。 输入输出样例 输入 #1复制 10 2 输出 #1复制 121…...
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理 【心法】 【第零章】c语言概述 【第一章】分支与循环语句 【第二章】函数 【第三章】数组 【第四章】操作符 【第五章】指针 【第六章】结构体 【第七章】const与c语言中一些错误代码 【禁忌秘术】 【第一式…...
理解进程和线程的概念
在操作系统中,进程和线程都是执行的基本单位,但它们在性质和管理方面有所不同 进程 定义: 进程是一个正在运行的程序的实例,是操作系统资源分配的基本单位。特点: 独立性:每个进程有其独立的内存空间、数据栈和其他辅助数据。重…...
【项目管理】第2章 信息技术发展 --知识点整理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…...
docker部署rabbitmq
拉取镜像 docker pull rabbitmq:managementmanagement 标签表示包含管理插件,可以通过 Web 界面管理 RabbitMQ 启动容器 docker run --restartalways -d --name rabbitmq \-p 9004:5672 -p 9005:15672 \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_P…...
手搓多模态-03 顶层和嵌入层的搭建
声明:本代码非原创,是博主跟着国外大佬的视频教程编写的,本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分,这一部分的主要功能是接收一个batch的图像,并将其转化为上下文相关的嵌入向量,…...
计算机系统---UEFI(统一可扩展固件接口)
一、UEFI定义与历史背景 UEFI(Unified Extensible Firmware Interface) 是替代传统BIOS的新一代固件接口标准,由UEFI论坛(前身是Intel的EFI论坛)制定,旨在解决BIOS在现代硬件和操作系统下的局限性。 设计…...
2025年渗透测试面试题总结-某四字大厂面试复盘扩展 二面 (题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某四字大厂面试复盘 二面 一、文件上传绕过WAF的15种深度技巧 二、SSRF利用与WAF绕过的8种高阶手法 …...
基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术, 能够识别8种不同的杂草类别。用户可以通过上传图片,系统会自动识别图片中的杂草类别,并显示识别结果和…...
Java的Selenium的特殊元素操作与定位之时间日期控件
分为两种情况: 控件没有限制手动输入,则直接调用sendKeys方法写入时间数据 //时间日期控件处理 chromeDriver.get ("https://www,fliggy,com/?ttidsem.000000736&hlreferidbaidu.082076&route sourceseo"); chromeDriver.findElement (By.xpat…...
深入理解矩阵乘积的导数:以线性回归损失函数为例
深入理解矩阵乘积的导数:以线性回归损失函数为例 在机器学习和数据分析领域,矩阵微积分扮演着至关重要的角色。特别是当我们涉及到优化问题,如最小化损失函数时,对矩阵表达式求导变得必不可少。本文将通过一个具体的例子——线性…...
基于大数据的美团外卖数据可视化分析系统
【大数据】基于大数据的美团外卖数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过对海量外卖数据的深度挖掘与分析,能够为美团外卖平台提供运营决策支…...
TypeScript 类型系统详解
基础类型 TypeScript 支持丰富的基础数据类型,涵盖number、string、boolean、null、undefined、symbol以及bigint。这些类型为构建可靠的代码提供了基石。 数值类型(number):在 TypeScript 里,所有数字均为浮点数…...
【学Rust写CAD】33 近似 Alpha 混合函数(argb.rs补充方法)
源码 #[inline]pub fn over(self, dst: Argb) -> Argb {let a 256 - self.alpha32();let rb (dst.rb() * a) >> 8;let ag dst.ag() * a;Argb(self.0 (rb & Argb::MASK) | (ag & !Argb::MASK))}源码分析 这段代码实现了一个近似 Alpha 混合(“…...
4.3-4.6学习总结 Java:Set系列集合+双列集合+Map
Set系列集合: 元素是唯一的。 HashSet: 哈希值: 如果没有重写hashcode方法和equals方法,那么哈希值是根据地址值计算的。 LinkedHashSet: TreeSet底层为红黑树。 红黑树:两个红色节点不能相连。 双列集合&…...
深信服护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
2011-2019年各省地方财政商业服务业等事务支出数据
2011-2019年各省地方财政商业服务业等事务支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政商业服务业等事务支出 4、范围:31省 5、指标说明:地方财政在商…...
InfoSec Prep: OSCP靶场渗透
InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做…...
【Kubernetes】Kubernetes 如何管理存储?PV 和 PVC 是如何工作的?
在 Kubernetes 中,存储管理是通过 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 来实现的。 它们为容器化应用提供持久化存储,使得应用在重启或重新调度时仍然能够访问数据。 1. 存储管理概述 Kubernetes 的存储管理是基于 持久化卷 (Pe…...
CasaOS小主机本地安装1Panel运维面板结合内网穿透移动端远程运维
文章目录 前言1. 添加镜像源2. 部署1Panel3. 本地访问测试4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 前言 小伙伴们,是不是一想到要远程管理服务器就头大如斗?特别是没有公网IP或路由器设置复杂时,简直让人抓狂!但…...
BGP路由协议之属性2
Orgin 起源 公认必遵属性 起源名称标记描述IGPi如果路由是由始发的 BGP 路由器使用 network 命令注入到 BGP 的,那么该 BGP 路由的 origin 属性为 IGPEGPe如果路由是通过 EGP 学习到的,那么该 BGP 路由的 Origin 属性为 EGPIncomplete?如果路由是通过…...
HttpClient(笔记)
介绍: 发送请求的步骤: 发送get类型的请求: 发送post类型的请求:...
【简历全景认知】简历的历史演变与当代定位:从羊皮卷到算法博弈的艺术
引言:时间维度下的求职凭证。 当古埃及工匠在莎草纸上记录自己的技能时,他们不会想到这份"技能清单"会在四千年后演变成LinkedIn上的数字档案。简历作为个人职业身份的载体,其演变史就是一部微观的人力资源配置史。从手写推荐信到ATS系统解析的PDF,每一次形式变…...
ERP系统五大生产模式概述
制造业中,选择合适的生产模式是企业高效运营的关键。 以下是ERP系统支持的五大核心生产模式及其特点总结: 1. MTS(按库存生产) - 定义:先生产后销售,基于需求预测提前备货。 - 适用场景:需求稳定、标准化程度高的产品(如日用品、家电)。 - 优点:交货快、生产…...
003 vue生命周期和钩子函数
文章目录 1.Vue实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂载DOM、渲染-更新-渲染、卸载等一系列过程,称之为Vue实例的生命周期 2.钩子函数(监听函数):Vue实例在完整的生命周期过程中&…...
学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
本文是我的《学透Spring Boot》专栏的第16篇文章,了解更多请移步我的专栏: Postnull的专栏《学透Spring Boot》 目录 遇到问题 日期格式的转换 实现需求 创建转换器 注册转换器 编写Controller 访问测试 存在的问题 解决问题 源码分析 总结 …...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
一、安装步骤 1.基础环境安装 安装显卡驱动、cuda,根据自己硬件情况查找相应编号,本篇不介绍这部分内容,只给出参考指令,详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…...
C语言查漏补缺:占位符篇
占位符篇 1. 整数类型2. 字符类型3. 浮点数类型4. 指针类型5. 字符串6. 修饰符 1. 整数类型 %d / %i:用于 int(有符号十进制整数)。int num -42; printf("%d", num); // 输出: -42%u:用于 unsigned int(无…...
springcloud现常用的组件都有哪些,如何使用
Spring Cloud是一个用于构建分布式系统的开源框架,它提供了多个常用的组件来简化分布式系统的开发和部署。以下是Spring Cloud中常用的一些组件: Spring Cloud Config:用于集中式管理配置,并提供配置的动态刷新功能。Spring Clou…...
Vue3响应式引擎解密:从依赖追踪到性能调优的深度之旅
一、响应式内核架构演进 1.1 响应式范式升级 1.2 新旧架构性能对比 操作类型Vue2(ms)Vue3(ms)提升幅度深对象初始化8502203.86x数组操作响应120186.67x嵌套属性访问340655.23x批量更新响应210326.56x 二、依赖追踪机制剖析 2.1 依赖收集实战案例 // 数据模型const state r…...
主流程发起,去除子流程的时长计算问题
问题: 有三个流程,流程1.2.3,流程2.3是流程1的子流程,若在流程1的过程中发起流程2.3,计算流程1的时长要排除流程2.3的时间,流程2.3之间可能是包含、交集、无交集三种。 实现 代码: import jav…...
Java 8 到 Java 21 系列之 新日期时间API:精确的时间管理(Java 8)
Java 8 到 Java 21 系列之 新日期时间API:精确的时间管理(Java 8) 系列目录 Java8 到 Java21 系列之 Lambda 表达式:函数式编程的开端(Java 8)Java 8 到 Java 21 系列之 Stream API:数据处理的…...
【LeetCode】在每个树行中找最大值(DFS 深度优先搜索)
📌题目链接:LeetCode 515. 在每个树行中找最大值 题目描述 给定一棵二叉树的根节点 root,请找出该二叉树中每一层的最大值。 示例 示例 1 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例 2 输入: root [1,2,3] 输出: [1,3]思路分析 …...
深度学习中模型量化那些事
在深度学习中模型量化可以分为3块知识点,数据类型、常规模型量化与大模型量化。本文主要是对这3块知识点进行浅要的介绍。其中数据类型是模型量化的基本点。常规模型量化是指对普通小模型的量化实现,通常止步于int8的量化,绝大部分推理引擎都…...
手写JSX实现虚拟DOM
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...