Spring Cloud GateWay简介
什么是网关
网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间进行数据传输.
网关具备转发, 路由和数据过滤的功能, 它能够识别不同网络中的数据包, 并根据器目的地址和源地址决定如何转发数据. 同时, 网关还可以实施网络安全策略, 对进出的数据包进行检查和过滤, 保护网络安全.
网关在互联网中起到重要作用, 它连接了内部局域网好外部互联网, 使得数据能够在不同网络之间传递和交换.
网关有什么作用
- 路由功能: 根据目标地址的不同选择最佳的路径
- 安全控制(统一认证授权): 对进出的数据包进行检查和过滤, 它可以授权来自源网络的数据包, 并且阻止未授权的访问.
- 协议转换: 网关可以进行协议转换, 使得不同的网络设备可以进行通信, 例如: 将 HTTPS 转换成 HTTP.
- 网络地址转换(NAT): 将内部网络使用的私有 IP 地址转换成外部网络使用的公共 IP 地址.
Spring Cloud GateWay 组成
- 路由(Route): 定义了请求应该被转发到哪个目标地址. 路由由 ID, 目标URI, 断言好过滤器组成. 通过配置多个路由, 可以实现不同请求的路由规则.
- 断言(Predicate): 用于匹配请求的条件, 如果请求匹配断言条件, 则会被路由转发到对应的目标地址.
- 过滤器(Filter): 用于请求路由前或请求后进行一些处理, 如添加头部信息, 修改请求体等.
Spring Cloud GateWay 基础使用
添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意: Spring Cloud GateWay 底层是基于响应式 Reactor Web 实现的已经包含了 Web 所以这两个依赖同时引入就会报错
设置路由规则
server:port: 10086spring:cloud:gateway:routes:- id: user-serviceuri: http://localhost:9090predicates:- Path=/user/**, /userlog/**# 匹配多个路径时可以用英文逗号隔开- id: order-serviceuri: http://localhost:9091predicates:- Path=/order/**
断言类型
Spring Cloud GateWay 目前支持 12 种断言类型
- After: 请求在指定时间之后才能匹配
- Before: 请求在指定时间之前才能匹配
- Between: 请求在指定时间中才能匹配
- Cookie: 匹配请求中的 Cookie 值
- Header: 匹配请求中的 Header 值
- Host: 匹配请求头中的 Host 值
- Method: 匹配请求头中的 Method 值
- Path: 匹配请求路径
- Query: 匹配请求参数
- RemoteAddr: 匹配请求的 IP 地址
- Weight: 根据权重分发请求
- XDorwardedRemoteAddr: 根据 X-Forwarded-For匹配
过滤器
过滤器主要有以下几个功能:
- 功能扩展和定制: 通过拦截和处理数据流或事件流, 可以修改数据, 增加额外的功能逻辑, 实现特点的业务需求
- 数据校验和过滤: 在接收到数据之后, 可以使用过滤器对数据进行检查, 严重数据的合法性, 过滤掉无效或不符合要求的数据
- 安全保护: 可以控制访问, 验证权限, 对输入的请求进行检查和清洗
- 性能优化: 可以对数据进行转换, 过滤或者缓存, 以提高处理速度和效率,. 还可以用于数据压缩, 缓存预热等场景, 减少数据传输和处理的成本
- 统一处理和逻辑复用: 可以在不同组件或模块上应用相同的逻辑或处理方式
内置过滤器
内置过滤器分为局部过滤器和全局过滤器
局部过滤器和全局过滤器用法相同只是一个只适用于当前匹配的服务一个适用于全局
gateway:routes:- id: user-serviceuri: lb://user-service-demopredicates:- Path=/user/**filters: # 局部过滤器- AddResponseHeader=My-Resp-Header,javacn- id : order-serviceuri: lb://order-service-demopredicates:- Path=/order/**default-filters: # 全局过滤器- AddResponseHeader=My-Resp-Header2,javacn2- AddRequestHeader=My-Req, javacn
Retry
GateWay中也可以和OpenFeign一样配置重试机制
spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-enabled: falsegateway:routes:- id: user-serviceuri: lb://user-service-demopredicates:- Path=/user/**filters:- AddResponseHeader=My-Resp-Header,javacn- name: Retryargs:retries: 3 # 重试次数statuses: GATEWAY_TIMEOUT # 重试的 HTTP 状态代码=504methods: GET # 重试的 HTTP 方法series: SERVER_ERROR # 重试状态码段 5xx 状态backoff: # 重试指数配置策略firstBackoff: 10ms # 第一次重试间隔maxBackoff: 50ms # 最大重试间隔factor: 2 # firstBackoff * (factor ^ n)basedOnPreviousValue: false # 基于上次值
注意: name必须是Retry, 否则识别不了
自定义全局过滤器
Spring Cloud GateWay 中也提供了自定义全局过滤器, 我们可以通过它来实现统一认证授权等功能
package com.example.gatewayservice.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取request对象ServerHttpRequest request = exchange.getRequest();// 获取response对象ServerHttpResponse response = exchange.getResponse();// 获取参数String username = request.getQueryParams().getFirst("username");String password = request.getQueryParams().getFirst("password");if (username != null && username.equals("admin") && password != null && password.equals("admin")) {return chain.filter(exchange);}else {// 设置无权限 401response.setStatusCode(HttpStatus.UNAUTHORIZED);// 执行完成不在往下执行return response.setComplete();}}@Overridepublic int getOrder() {// 值越小越早执行return 1;}
}
相关文章:
Spring Cloud GateWay简介
什么是网关 网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间进行数…...

耿明雨出席柬方70周年招待会晚宴
11月9日,庆祝柬埔寨独立和建军70周年欢迎晚宴上,全国政协副主席沈跃跃盛邀出席,此次招待会是由柬埔寨王国驻华大使馆主办,在北京励骏酒店圆满召开,晚宴现场;凯西索达大使致辞、中国外交部部长助理徐飞洪等领…...
退役记 + 秋招总结,占坑
感觉需要写点什么东西来记录一下自己的秋招,以及还有一篇退役记没有写。 思考了一下,感觉发在空间并没有很合适,还是写个博客好了。 最近有点颓,就先买个坑在这里,省的彻底咕掉。 如果今年年底还没写出来的话ÿ…...

网络类型及数据链路层的协议
网络类型 --- 根据数据链路层使用的协议来进行划分的。 MA网络 --- 多点接入网络 BMA --- 广播型多点接入网络---以太网协议 NBMA --- 非广播型多点接入网络 以太网协议 --- 需要使用mac地址对不同的主机设备进行区分和标识 --- 以太网之所以需要使用mac地址进行数据寻址&…...

ROC 曲线:健康背景下的应用和解释
一、介绍 在医疗保健领域,做出明智的决策对于改善患者治疗结果、有效分配资源和设计有效的诊断测试至关重要。受试者工作特征 (ROC) 曲线是一个强大的工具,在评估诊断测试的性能、区分健康个体和患病个体以及优化医疗保健干预方面发挥着至关重要的作用。…...

SpringBoot + Disruptor 实现特快高并发处理,使用Disruptor高速实现队列
1 前言 工作中遇到项目使用Disruptor做消息队列,对!你没看错,不是Kafka也不是rabbitmq。Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录。 2 Disruptor介绍 Disruptor 是英国外汇交易公司…...
git push origin HEAD:refs/for/master
git push <远程主机名> <本地分支名> : <远程分支名> 例如 git push origin master:refs/for/master 是将本地的master分支推送到远程主机origin上的对应master分支 origin 是远程主机名, 第一个master是本地分支名, 第二…...

S25FL256S介绍及FPGA实现思路
本文介绍 S25FL256S 这款 FLASH 芯片,并进行 FPGA 读写控制的实现(编程思路及注意事项)。 文章目录 S25FL-S 介绍管脚功能说明SPI 时钟模式SDRDDR 工作模式FLASH存储阵列(地址空间映射)常用寄存器及相关指令Status Reg…...

淘宝客APP源码/社交电商自营商城源码/前端基于Uniapp开发
淘宝客APP源码,前端基于Uniapp开发的社交电商自营商城源码。Thinkphp的后台,不是很标准,感兴趣的可以自行研究。 商城功能 1、首页基础装修;2、丰富选品库;3、淘口令解析;4、支持京东;5、支持…...
Oracle 服务器日常巡检
文章目录 1、数据库基本状况检查2、数据库相关资源使用情况检查3、检查Oracle数据库性能4、数据库服务器CPU、MEM、I/O性能5、数据库服务器安全检查 Oracle数据库的日常巡检内容包括: (1)Oracle数据库基本状况检查; (…...

【轨道机器人】实现Windows与下位机串口通信(未完成)
方案一:QT,编写类似串口调试助手的APP,连接上硬件,qt有个好像是串口缓存函数,可以防止占用CPU。(缺点qt估计要时间学) 方案二:利用vscode、C,编写一个可执行exe文件&…...

无人机内存卡数据恢复
1.插入内存卡 2.选择对应的品牌 3.点击恢复 建议:发现数据打不开或者丢失情况,建议及时断电,以免影响数据的正常恢复! #无人机##数据恢复##储存卡#...

基于SSM的校园二手物品交易市场设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

Android14 Beta 5
Beta 5,这是 Android 14 Beta 计划中的最后一次计划更新。这是确保您的应用程序已准备就绪并在非 Beta 用户开始获取 Android 14 之前提供反馈的最后机会。为了使您能够在跨多种外形尺寸的设备上测试您的应用程序,Beta 5 适用于 Pixel Tablet 和 Pixel F…...
力扣labuladong——一刷day32
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣654. 最大二叉树二、力扣105. 从前序与中序遍历序列构造二叉树三、力扣106. 从中序与后序遍历序列构造二叉树四、力扣889. 根据前序和后序遍历构造二叉…...
Day01_《MySQL索引与性能优化》摘要
一、资料 视频:《尚硅谷MySQL数据库高级,mysql优化,数据库优化》—周阳 其他博主的完整笔记:MySQL 我的笔记:我的笔记只总结了视频p14-p46部分,因为只有这部分是讲解了MySQL的索引与explain语句分析优化…...

BMS系统项目
1、通过电压监测是否冲满,通过电压可以监测是否放完电 电池得参数 单体过压(充满电) 过压恢复(百分之90多) 欠压保护(百分之几得电,快关机了) 欠压恢复(就是欠压之上…...
sql server 多行数据合并一行显示
在 SQL Server 中,可以使用 STUFF 和 FOR XML PATH 进行多行合并成一行。例如,假设有一个表名为 orders ,其中包含订单号和产品名称: order_idproduct_name1Product A1Product B2Product C2Product D 以下查询将在 order_id 列上…...

「我的AIGC咒语库:分享和AI对话交流的秘诀——如何利用Prompt和AI进行高效交流?」
文章目录 每日一句正能量前言基础介绍什么是Prompt?什么是 Prompt Engineering?为什么需要 Prompt Engineering?如何进行 Prompt Engineering?Prompt的基本原则Prompt的编写模式AI 可以帮助程序员做什么?技术知识总结拆解任务阅读…...

强国有我助力苔花绽放 | 爱心捐赠仪式在西安顺利举办
2023年11月2日,由中国儿童中心、全国少年儿童“双有”主题教育活动组委会、中华少年儿童慈善救助基金会强国有我项目主办,陕西省青少年宫协会、陕西省妇女儿童活动中心、陕西回归儿童救助中心承办的“苔花绽放”事实无人抚养儿童关爱计划捐赠仪式在陕西回…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...