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

gateway核心概念

1. 路由(route)
        路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL 和 配置的路由匹配。
2. 断言(predicates)
     断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等
3.过滤器(Filter)
     Filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。


gateway快速开始

1. 引入依赖
注意:会和spring-webmvc的依赖冲突,需要排除spring-webmvc
2.编写yml配置文件
server.port = 8088是 网关的访问端口
spring.application.name 是 当前网关服务的服务名称
gateway.routes下面定义路由规则:
id是这个路由规则的名称,gateway.routes下面可以有很多的路由规则
url:把访问当前网关的这个服务, 转发到哪个url去,首先,我不能什么请求到网关都去转发,需要满足一定的条件,predicates断言,就是起到这个作用
predicates:当 请求到了当前这个网关(那么 这个请求就必须带了当前网关的 ip+端口号 的信息,后面紧跟着 斜杠 / ,所以网关可以默认这些信息是有的, predicates中不用考虑这些信息), 如果 端口号后面的url,以 /order-serv/** 开头,那么 就转发到 上面url的 ip + 端口。 并且斜杠 / 后面的所有路径都不会去掉,那么就转发到了http://localhost:8020/order-serv/order/add 这个地址
(order-serv是服务名称,防止订单服务里有/order/add开头的地址,库存服务里也有/order/add开头的地址,所以 发到gateway的请求,都带上需要转发到的服务的名称),但是 订单服务 里 接收的请求里 是 没有 /order-serv/的,只有发来的请求是 http://localhost:8020/order/add ,才能进行接收, 所以 让网关把 第一层路径给去掉,通过 filters 过滤前缀
如果不满足断言,就会报 404 的 错误 


这里我们在配置里把转发的url地址都写死,当服务器发生迁移,ip地址会变动 或者 服务器是以集群的形式部署的,还需要通过nginx来进行反向代理和负载均衡,很麻烦。

我们通过把gateway和nacos集成起来,就可以轻松解决这些问题

集成Nacos

1. 继续引入nacos的依赖
2. 继续编写yml配置文件
(1)集成nacos,只需将当前的gateway服务,注册到nacos上即可,写上nacos服务地址和账号密码
(2)将路由规则中的,转发到哪个服务的地址,改成服务名称 "order-service" 即可(url: order-service),又因为需要使用nacos自带的ribbon的负载均衡策略,所以前面加上  lb://   , lb的意思是loadbalance负载均衡。
gateway网关会将 “order-service” 整体 替换成 其中一个 订单服务的 ip 地址(因为网关会定时拉取各种nacos上注册上去的服务的ip地址列表)
这样就解决了当服务器发生迁移,ip地址变动 或者 服务器是以集群的形式部署的,还需要通过nginx来进行反向代理和负载均衡的问题
简写路由规则:约定大于配置
(1)开启自动识别nacos服务的功能后,就不需要写断言规则了
(2)将发送到网关的请求  ,以注册到nacos上的服务名称开头时,会自动转发到那个服务的某个服务器上,并自动过滤掉第一层路径(缺点:路由规则不够灵活)
这时候,只要按照网关地址/微服务/接口的格式去访问,就可以得到成功响应。


断言工厂

根据url来进行断言,是gateway内置的断言工厂



自定义路由断言工厂

这里假设自定义一个基于Query请求参数的断言工厂,复制源码里面的内容,然后根据需要进行修改

自定义 一个基于Query请求参数的断言工厂, 需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
1. 必须是spring组件 ,即是一个bean
2. 类必须加上 RoutePredicateFactory 作为结尾
3. 必须继承  AbstractRoutePredicateFactory
4. 必须声明静态内部类,声明属性来接收 配置文件中对应的断言的信息
5. 需要结合 shortcutFieldOrder 进行绑定
6. 通过apply进行逻辑判断 true就是匹配成功 false匹配失败


过滤器(先过滤再路由)

(1)先经过 过滤器 把请求的url地址处理后,或者添加删除修改一些请求头、cookie等的信息,

(2)再通过nacos的服务列表进行路由到 对应的服务器上

过滤器的作用:当一个请求来到gateway网关时,我们可以对这个请求进行一个业务逻辑的处理。

比如:

(1)前面通过 过滤器 去把第一层路径给去掉

(2)可以给来到网关的所有请求添加一个请求头,再设置里面的内容。

(3)可以给来到网关的所有请求设置一个cookie等等处理

具体全部内置的过滤器有哪些可以访问官网

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

下面是一些代码示例:

测试地址是发送给gateway网关的

通过routes路由到下面的@GetMapping的地址,下面的代码来接收请求和进行响应

例1:

例2
例3
前一个url地址是发送到网关的,经过过滤器,加上了前缀/mall-order。这时,服务端要能接收响应,必须设置,发送来的请求,都带上/mall-order。这样服务器才能进行正常的接收网关路由来的请求
例4
发送到当前网关的请求,都会被路由到百度网站
302是重定向之后的响应状态码


自定义过滤器



全局过滤器

局部过滤器和全局过滤器区别:
局部:局部针对某个路由, 需要在路由中进行配置
全局:针对所有路由请求, 不需要在配置文件中配置, 一旦定义就会投入使用
内置的全局过滤器:
路由地址中带了lb的话,就会自动采用负载均衡策略,和上面第一个的全局过滤器对应
这些全局过滤器 会自动判断,自动处理,不用我们管理


自定义全局过滤器(重点)

记录所有访问过来的请求,保存成日志的形式,可以用自定义全局过滤器

或者判断用户登录、权限方面也可以自定义全局过滤器

自定义全局过滤器非常简单
1. 定义一个类,交给springIOC容器管理,即加上spring的注解 @Compenent
2. 继承GlobalFilter接口,重写里面的filter方法,只需要写里面的方法体就行
3. 参数exchange 里面 包含了 进入网关的 这个 请求的所有信息,取出url地址,header头、cookies,路径参数等等所有信息都可以,然后进行相应的 业务处理
4. return chain.filter(exchange) 将请求进行放行


请求日志记录

在网关微服务里,在这个地方加上这个命令,可以开启日志记录,将所有通过网关的请求,都记录下来,不过只是输出到控制台



gateway跨域配置

跨域:当http请求 不在 同一个ip+同一个端口时,就叫做跨域

(只有同一个ip+同一个端口才叫 同域,两个都满足才同域)

1. 通过yml配置的方式 ,配置在gateway的下一级

配置的内容可以自己修改跨域
2. 通过配置类的方式设置


sentinel结合gateway网关

结合sentinel对发送到gateway网关的请求,进行流控降级

sentinel分为两个部分
前提:远程服务器下载sentinel客户端,安装、运行后
gateway服务只需:
gateway服务的配置文件加上sentinel客户端的ip+端口、账号密码
这样就整合好了sentinel的流控降级
sentinel针对gateway网关服务有特殊的规则,它的界面和  对于controller中方法(服务入口)的流控降级界面不太一样
可以针对断言工厂里面的这些规则进行限流
可以针对某个ip、远程域名、请求头、url中的参数、cookie值进行限流


自定义sentinel结合网关 后的响应内容

网关层被sentinel流控降级或者熔断后,会响应下面的内容给发送请求者

这样的内容如果不是我们想要的,就需要自定义响应异常的方式。有两种方式

方式1:(简单)

 

在yml配置中,分层写上面的内容,

spring . cloud . sentinel . scg . fallback . response body = '{"code":403,"mes":" 限流了 "}'
response‐body后面的内容就是我们自定义的响应内容(json格式的) ,写的内容就是响应的内容
方式2:

设置响应状态码、响应类型(json格式的)、响应内容(“降级了!”)



网关高可用

相关文章:

gateway

gateway核心概念 1. 路由(route) 路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL 和 配置的路由匹配。 2. 断言(predicates) 断言函数允许开发者去定义匹配Htt…...

第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时,首先要记得进行注册设备(avdevice_register_all ),程序运行时,只需要注册一次就可以 avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数,其作用是注册所有可用的音…...

论文翻译:Large Language Models for Education: A Survey and Outlook

https://arxiv.org/abs/2403.18105 目录 教育领域的大型语言模型:一项调查和展望摘要1. 引言2. 教育应用中的LLM2.1 概述2.2 学习辅助2.2.1 问题解决(QS) 2.2.2 错误纠正(EC)2.2.3 困惑助手(CH)…...

python为什么慢?(自用)

《Cython系列》1. Cython 是什么?为什么要有 Cython?为什么我们要用 Cython? - 古明地盆 - 博客园 (cnblogs.com) 古明地盆的主页 - 博客园 (cnblogs.com) 我原本认为,python慢的原因是“逐行解释程序并执行”,那么我…...

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …...

“好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境

目录 主题&#xff1a;好易智算平台推荐RTX 4090DGPU实例租用演示安装配置torch1.9.1cuda11.1.1环境引言&#xff1a;算力的新时代平台介绍&#xff1a;技术与信任的结晶使用案例&#xff1a;实际使用展示创建实例开始使用连接实例&#xff08;下文演示使用Xshell连接&#xff…...

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…...

java八股文面试题

Java八股文面试题通常涵盖了Java语言的基础知识、高级特性、框架应用、数据库操作等多个方面。以下是一些常见的Java面试题及其详细回答&#xff0c;按照不同的主题进行分类&#xff1a; 一、Java基础 面向对象的特征有哪些&#xff1f; 抽象&#xff1a;忽略与当前目标无关的…...

【服务器】在Linux查看运行的Python程序,并找到特定的Python程序

在Linux查看运行的Python程序并找到特定的Python程序 写在最前面1. 使用ps命令查看所有Python进程查看详细信息 2. 使用pgrep命令查找Python进程ID 3. 使用top或htop命令使用top命令使用htop命令 4. 使用lsof命令查找Python进程打开的文件 5. 使用nvidia-smi命令查看GPU使用情况…...

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …...

SpringBoot配置Swagger开启页面访问限制

在Spring Boot项目中配置Swagger时&#xff0c;开启页面访问限制通常意味着你希望控制哪些用户或角色可以访问Swagger UI文档页面。由于Swagger UI是一个静态资源&#xff0c;它本身并不直接支持基于角色的访问控制&#xff08;RBAC&#xff09;。但是&#xff0c;你可以通过Sp…...

前端代码基本逻辑-vue3

前端vue建立过程 安装nodejs 官网下载安装&#xff0c;并且记住安装路径&#xff0c;记得配置系统变量Path 安装VUE/CLI npm install -g vue/cli --全局安装vue 使用VUE/CLI生成代码框架 vue create your-project-name --我的your-project-name为web 运行项目 cd your-…...

怎么用PPT录制微课?详细步骤解析!

随着信息技术的不断发展&#xff0c;微课作为一种新型的教学形式&#xff0c;因其短小精悍、针对性强等特点&#xff0c;在教育领域得到了广泛的应用。而PPT作为一款常用的演示工具&#xff0c;不仅可以用来制作课件&#xff0c;还可以利用其内置的录屏功能或结合专业的录屏软件…...

Git使用方法

Git是一种分布式版本控制系统&#xff0c;它可以记录和管理软件开发过程中的变更。 Git的基本概念包括以下几个部分&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git用仓库来存储项目的代码和历史记录。一个仓库可以包含多个分支。 分支&#xff08;Bran…...

HTTP的请求报文和响应报文是怎样的,有哪些常见字段?

http报文分为请求报文和响应报文 请求报文包含&#xff1a;请求行、请求头、空行、、请求体 请求行包含&#xff1a; 方法&#xff1a;即要执行的操作&#xff0c;如get&#xff0c;post、put、delet 资源路径&#xff1a;请求的资源的URL HTTP版本&#xff1a;使用的http协议…...

自注意力简介

在注意力机制中&#xff0c;每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q&#xff0c;键k和值v都来自于同一组输入&#xff0c;那么这个注意力就被称为是自注意力&#xff08;self-attention&#xff09;。自注意力这部分理论&#xff0c;我觉得台大李宏毅老师…...

【GameFramework框架】7-2、GameFramework框架是否“过度设计”?

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…...

RISC-V异常处理流程概述(2):异常处理机制

RISC-V异常处理流程概述(2):异常处理机制 一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册一、异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先需要执…...

Unity3D中如何降低游戏的Drawcall详解

在Unity3D游戏开发中&#xff0c;Drawcall是一个至关重要的性能指标&#xff0c;它指的是CPU通知GPU绘制一个物体的命令次数。过多的Drawcall会导致游戏性能下降&#xff0c;因此优化Drawcall的数量是提高游戏性能的关键。本文将详细介绍Unity3D中降低Drawcall的几种主要方法&a…...

小程序-设置环境变量

在实际开发中&#xff0c;不同的开发环境&#xff0c;调用的接口地址是不一样的 例如&#xff1a;开发环境需要调用开发版的接口地址&#xff0c;生产环境需要正式版的接口地址 这时候&#xff0c;我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口&#xff0c;用来获取…...

【RabbitMQ】一文详解消息可靠性

目录&#xff1a; 1.前言 2.生产者 3.数据持久化 4.消费者 5.死信队列 1.前言 RabbitMQ 是一款高性能、高可靠性的消息中间件&#xff0c;广泛应用于分布式系统中。它允许系统中的各个模块进行异步通信&#xff0c;提供了高度的灵活性和可伸缩性。然而&#xff0c;这种通…...

RuntimeError: Unexpected error from cudaGetDeviceCount

RuntimeError: Unexpected error from cudaGetDeviceCount 0. 引言1. 临时解决方法 0. 引言 使用 vllm-0.4.2 部署时&#xff0c;多卡正常运行。升级到 vllm-0.5.1 时&#xff0c;报错如下&#xff1a; (VllmWorkerProcess pid30692) WARNING 07-12 08:16:22 utils.py:562] U…...

uboot学习:(一)基础认知

目录 uboot是一个裸机程序&#xff08;bootloader&#xff09; 作用 要运行linux系统时&#xff0c;如何从外置的flash拷贝到DDR中&#xff0c;才能启动 uboot使用步骤 步骤1中的命令例子 注意 uboot源码获取方法 uboot是一个裸机程序&#xff08;bootloader&#xff09…...

每天一个数据分析题(四百二十六)- 总体方差

为了比较两个总体方差&#xff0c;我们通常检验两个总体的() A. 方差差 B. 方差比 C. 方差乘积 D. 方差和 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&#xff0c;统计学&a…...

【C++】设计一套基于C++与C#的视频播放软件

在开发一款集视频播放与丰富交互功能于一体的软件时&#xff0c;结合C的高性能与C#在界面开发上的便捷性&#xff0c;是一个高效且实用的选择。以下&#xff0c;我们将概述这样一个系统的架构设计、关键技术点以及各功能模块的详细实现思路。 一、系统架构设计 1. 架构概览 …...

数学建模中的辅助变量、中间变量、指示变量

在数学建模中&#xff0c;除了决策变量外&#xff0c;还有一些其他类型的变量&#xff0c;如中间变量、辅助变量和指示变量。每种变量在模型中都有特定的用途和意义。以下是对这些变量的详细解释&#xff1a; 1. 决策变量&#xff08;Decision Variables&#xff09; 定义&am…...

python的seek()和tell()

seek() seek() 是用来在文件中移动指针位置的方法。它的作用是将文件内部的当前位置设置为指定的位置。 seek(offset, whence) 参数说明 offset: 这是一个整数值&#xff0c;表示相对于起始位置的偏移量。如果是正数&#xff0c;表示向文件末尾方向移动&#xff1b;如果是负…...

Go泛型详解

引子 如果我们要写一个函数分别比较2个整数和浮点数的大小&#xff0c;我们就要写2个函数。如下&#xff1a; func Min(x, y float64) float64 {if x < y {return x}return y }func MinInt(x, y int) int {if x < y {return x}return y }2个函数&#xff0c;除了数据类…...

【每日一练】python之sum()求和函数实例讲解

在Python中&#xff0c; sum()是一个内置函数&#xff0c;用于计算可迭代对象&#xff08;如列表、元组等&#xff09;中所有元素的总和。如下实例&#xff1a; """ 收入支出统计小程序 知识点:用户输入获取列表元素添加sum()函数&#xff0c;统计作用 "&…...

打造智慧校园德育管理,提升学生操行基础分

智慧校园的德育管理系统内嵌的操行基础分功能&#xff0c;是对学生日常行为规范和道德素养进行量化评估的一个创新实践。该功能通过将抽象的道德品质转化为具体可量化的指标&#xff0c;如遵守纪律、尊师重道、团结协作、爱护环境及参与集体活动的积极性等&#xff0c;为每个学…...

网站消耗流量/产品线上营销推广方案

作为工程师&#xff0c;我们知道我们应该避免重新发明轮子。 如果可以的话&#xff0c;我们想使用其他人编写的库为我们做一些繁重的工作。 在本文中&#xff0c;我将与您分享一些有关如何利用DLL(或任何其他具有COM类型信息的文件&#xff0c;例如TLB或OCX文件)中的现有库的知…...

程序开发需要学什么/seo培训机构

https://blog.csdn.net/lizhihua0925/article/details/52595813​blog.csdn.net最近在研究Docker&#xff0c;正好也想学习一下Laravel&#xff0c;但每次laravel的部署很麻烦&#xff0c;所以正在研究了一下&#xff0c;做一下Docker镜像&#xff0c;感觉棒棒的~~~Dockerfilel…...

xampp 开发网站/公司网站推广费用

Substring with Concatenation of All Words 比较复杂的一题&#xff0c;首先是要明确用滑块的概念来解决&#xff0c;始终保持L集合中的字符串在滑块中都只出现了一次&#xff0c;当然设置一个总计数count&#xff0c;当cout等于L集合长度时&#xff0c;即使找了一段符合要求的…...

重庆建设机电网站/网络推广运营途径

最近在使用GridView做一个小项目&#xff0c;以下是本人使用过程中的个人总结&#xff0c;本文主要总结控件的属性设置&#xff0c;附上图片&#xff0c;给大家一个参考。后续会给大家分享功能实现和使用的小技巧。 GirdControl是数据的容器&#xff0c;它包含多种显示方式&…...

徐州公司做网站/seo可以从哪些方面优化

应付离散实验足够了&#xff0c;但是还不会调用EasyX绘图啊~~~ 1 #include <bits/stdc.h>2 #include <windows.h>3 4 int start 0;5 6 // 城市名称7 char city_name[6] { A, B, C, D, E, F };8 9 // 记录到过的城市10 int city[6] {0};11 12 13 int pass_count …...

青岛网站设计怎么选/外链在线发布工具

题目 给你一棵每条边从父亲指向儿子的树&#xff0c;每条边上面有一个字母。 从树上的任意一点出发&#xff0c;走出的路径就是对应一个子串。 &#xff08;这不是TrieTrieTrie&#xff0c;因为每个父亲可能会连出字母相同的边&#xff09; 再给你一个字符串SSS&#xff0c;让…...