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

SpringCloud_GateWay服务网关

网关作用

Gateway网关是我们服务的守门神,所有微服务的统一入口。

网关的核心功能特性

  • 请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  • 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  • 限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

在这里插入图片描述
在SpringCloud中网关的实现包括两种:

  • gateway
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

Gateway快速入门

  1. 引入依赖
<!--网关-->
<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>
  1. 编写基础配置
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
  1. 启动网关
    启动网关,访问http://localhost:10010/user/1时,符合/user/**规则,请求转发到uri:http://userservice/user/1,得到了结果

在这里插入图片描述

总结:
网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖
  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标示
  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
  3. 路由断言(predicates):判断路由的规则,
  4. 路由过滤器(filters):对请求或响应做处理

断言工厂

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如Path=/user/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来

处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

名称说明示例
After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-Id, \d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/red/{segment},/blue/**
Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

过滤器

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
GlobalFilter全局过滤器,也能处理一切进入网关的请求和微服务响应
在这里插入图片描述

过滤器工厂种类

Spring提供了31种不同的路由过滤器工厂。例如:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

添加方法:在gateway的application.yaml中的gateway: routes: 后添加filters:过滤器即可
注意:想对哪个服务添加过滤器,就在对应的服务下添加filters即可
示例:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 过滤器- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

若想添加默认过滤器(对所有的路由都生效),就将过滤器工厂写到default下,示例:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤项- AddRequestHeader=Truth, Itcast is freaking awesome! 

全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
定义方法:实现GlobalFilter接口

public interface GlobalFilter {/***  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理** @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

在filter中编写自定义逻辑,可以实现下列功能:

  • 登录状态判断
  • 权限校验
  • 请求限流等

自定义全局过滤器
示例:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有authorization,
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

  1. 在gateway服务中创建类实现GlobalFilter接口并重写filer方法
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2.获取authorization参数String auth = params.getFirst("authorization");// 3.校验if ("admin".equals(auth)) {// 放行return chain.filter(exchange);}// 4.拦截// 4.1.禁止访问,设置状态码exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.结束处理return exchange.getResponse().setComplete();}
}
  1. 需要注意将此类标记为Component,并且指定顺序Order
  2. 需要注意的是,使用@Order制定了顺序后,默认将该Filter加入了过滤器链中,不需要再在配置文件中配置了

过滤器执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:

在这里插入图片描述
排序规则:

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

跨域问题

跨域:域名不一致就是跨域,主要包括:

  • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com

  • 域名相同,端口不同:localhost:8080和localhost8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

在服务端进行配置:在gateway的application.yaml中添加配置

spring:cloud:gateway:# 。。。globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

相关文章:

SpringCloud_GateWay服务网关

网关作用 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由和负载均衡&#xff1a;一切请求都必须先经过gateway&#xff0c;但网关不处理业务&#xff0c;而是根据某种规则&#xff0c;把请求转发到某个微服务&a…...

使用Dropout大幅优化PyTorch模型,实现图像识别

大家好&#xff0c;在机器学习模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络时&#xff0c;过拟合具体表现在模型训练数据损失函数较小&#xff0c;预测准确率较高&#xff0c;但是在测…...

Vue3中的常见组件通信(超详细版)

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…...

Stm32的DMA的学习

一&#xff0c;介绍 二&#xff0c;DMA框图 三&#xff0c;DMA通道 四&#xff0c;相关HAL库函数 五&#xff0c;配置DMA 六&#xff0c;Stm32CubeMX配置 【13.1】减少CPU传输负载 DMA直接存储器访问—Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili...

应用安全(补充)

Nessus是目前全世界最多人使用的系统漏洞扫描与分析软件。NMAP是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。X-SCAN安全漏洞扫描工具AppScan是IBM的一款web安全扫描工具&#xff0c;可以利用爬虫技术进行网站安全渗透测试&#xff0c;根据网站入口自…...

鸿蒙开发Ability Kit(程序框架服务):【FA模型切换Stage模型指导】 app和deviceConfig的切换

app和deviceConfig的切换 为了便于开发者维护应用级别的属性配置&#xff0c;Stage模型将config.json中的app和deviceConfig标签提取到了app.json5中进行配置&#xff0c;并对部分标签名称进行了修改&#xff0c;具体差异见下表。 表1 配置文件app标签差异对比 配置项FA模型…...

通过命令行配置调整KVM的虚拟网络

正文共&#xff1a;1234 字 20 图&#xff0c;预估阅读时间&#xff1a;2 分钟 在上篇文章中&#xff08;最小化安装的CentOS7部署KVM虚拟机&#xff09;&#xff0c;我们介绍了如何在最小化安装的CentOS 7系统中部署KVM组件和相关软件包。因为没有GUI图形界面&#xff0c;我们…...

Apache POI操作excel

第1部分&#xff1a;引言 1.1 Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于处理Microsoft Office文档。自2001年首次发布以来&#xff0c;它已经成为Java社区中处理Office文档事实上的标准。Apache POI支持HSSF&#xff08;用于旧版本的Excel格式&#xff0…...

Python错误集锦:faker模块生成xml文件时提示:`xml` requires the `xmltodict` Python library

原文链接&#xff1a;http://www.juzicode.com/python-error-faker-exceptions-unsupportedfeature-xml-requires-the-xmltodict-python-library 错误提示&#xff1a; faker模块生成xml文件时提示&#xff1a; xml requires the xmltodict Python library Traceback (most r…...

Vue3-尚硅谷笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…...

RockChip Android12 System之MultipleUsers

一:概述 System中的MultipleUsers不同于其他Preference采用system_dashboard_fragment.xml文件进行加载,而是采用自身独立的xml文件user_settings.xml加载。 二:Multiple Users 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="S…...

第12天:前端集成与Django后端 - 用户认证与状态管理

第12天&#xff1a;前端集成与Django后端 - 用户认证与状态管理 目标 整合Django后端与Vue.js前端&#xff0c;实现用户认证和应用状态管理。 任务概览 设置Django后端用户认证。创建Vue.js前端应用。使用Vuex进行状态管理。实现前端与后端的用户认证流程。 详细步骤 1. …...

在ROS2中蓝牙崩溃的原因分析

在ROS2中&#xff0c;如果蓝牙模块没有成功启动&#xff0c;可能的原因有几个方面&#xff1a; 1. **硬件问题**&#xff1a;首先需要确认蓝牙硬件本身是否正常工作&#xff0c;包括检查蓝牙模块是否正确连接到系统&#xff0c;以及模块是否存在物理损坏。 2. **驱动问题**&a…...

【PythonWeb开发】Flask中间件钩子函数实现封IP

在 Flask 框架中&#xff0c; 提供了几种类型的钩子&#xff08;类似于Django的中间件&#xff09;&#xff0c;它们是在请求的不同阶段自动调用的函数。这些钩子让你能够对请求和响应的处理流程进行扩展&#xff0c;而无需修改核心代码。 Flask钩子的四种类型 before_first_r…...

可以一键生成热点营销视频的工具,建议收藏

在当今的商业环境中&#xff0c;热点营销已经成为了一种非常重要的营销策略。那么&#xff0c;什么是热点营销呢&#xff1f;又怎么做热点营销视频呢&#xff1f; 最近高考成绩慢慢公布了&#xff0c;领导让结合“高考成绩公布”这个热点&#xff0c;做一个关于企业或产品的营销…...

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解&#xff1a; https://www.bilibili.com/video/BV1Gm42157Zi &#x1…...

4.sql注入攻击(OWASP实战训练)

4.sql注入攻击&#xff08;OWASP实战训练&#xff09; 引言1&#xff0c;实验环境owasp&#xff0c;kali Linux。2&#xff0c;sql注入危害3&#xff0c;sql基础回顾4&#xff0c;登录owasp5&#xff0c;查询实例&#xff08;1&#xff09;简单查询实例&#xff08;2&#xff0…...

前端Web开发HTML5+CSS3+移动web视频教程 Day1

链接 HTML 介绍 写代码的位置&#xff1a;VSCode 看效果的位置&#xff1a;谷歌浏览器 安装插件 open in browser&#xff1a; 接下来要保证每次用 open in browser 打开的是谷歌浏览器。只需要将谷歌浏览器变为默认的浏览器就可以了。 首先进入控制面板&#xff0c;找到默…...

中医实训室:在传统针灸教学中的应用与创新

中医实训室是中医教育体系中的重要组成部分&#xff0c;尤其在传统针灸教学中&#xff0c;它扮演着无可替代的角色。这里是理论与实践的交汇点&#xff0c;是传统技艺与现代教育理念的碰撞之地。本文将探讨中医实训室在传统针灸教学中的应用与创新实践。 首先&#xff0c;实训室…...

React Hooks 小记(七)_useReducer

useReducer usereducer 相当于 复杂的 useState 当状态更新逻辑较复杂时可以考虑使用 useReducer。useReducer 可以同时更新多个状态&#xff0c;而且能把对状态的修改从组件中独立出来。 相比于 useState&#xff0c;useReducer 可以更好的描述“如何更新状态”。例如&#…...

ChatGPT Web:5分钟快速搭建你的专属AI聊天室

ChatGPT Web&#xff1a;5分钟快速搭建你的专属AI聊天室 【免费下载链接】chatgpt-web A third-party ChatGPT Web UI page built with Express and Vue3, through the official OpenAI completion API. / 用 Express 和 Vue3 搭建的第三方 ChatGPT 前端页面, 基于 OpenAI 官方…...

【初阶数据结构】 左右逢源的分支诗律 二叉树1

&#x1f4d6; 点击展开/收起 文章目录 文章目录树的概念***树的基础概念***森林树和森林的存储二叉树二叉树的性质二叉树的遍历二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01;树的概念 在讲解…...

coding 为什么成为模型前沿主战场

coding 会被推到模型前沿&#xff0c;不奇怪。它可能是少数同时满足三件事的场景&#xff1a;答案能被机器验收&#xff0c;任务能自然拉长&#xff0c;做出来的东西马上能进入真实工作流。 写作文、写报告、做营销文案也有价值&#xff0c;可这些任务的好坏很难稳定判分。代码…...

利用CTranslate2与INT8量化,实现Whisper语音识别7倍加速

1. 项目概述&#xff1a;当Whisper遇上CTranslate2&#xff0c;语音转文字的“涡轮增压”如果你尝试过OpenAI的Whisper模型来做语音识别&#xff0c;大概率会被它的准确性所折服&#xff0c;但同时也可能被其缓慢的推理速度所困扰。尤其是在处理长音频文件或需要批量处理时&…...

TI毫米波雷达IWR1642原始数据采集避坑指南:DCA1000配置、IQ顺序与帧大小限制

TI毫米波雷达IWR1642原始数据采集实战&#xff1a;DCA1000高级配置与数据解析精要 毫米波雷达在自动驾驶、工业检测等领域的应用日益广泛&#xff0c;而原始数据采集作为研发和算法验证的基础环节&#xff0c;其稳定性和准确性至关重要。本文将深入探讨IWR1642与DCA1000搭配使用…...

3D模型格式转换终极方案:用stltostp轻松实现STL到STEP的专业转换

3D模型格式转换终极方案&#xff1a;用stltostp轻松实现STL到STEP的专业转换 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾遇到这样的困境&#xff1a;3D打印的STL模型无法在专业CAD…...

为啥大模型都要用 Token 调用,不能直接扒网页端接口?

1. 网页端接口是「给人用的」,随时会改 网页版(比如官网聊天页)的接口: 参数、请求头、加密算法、签名天天变 前端一改版,接口地址、加密方式直接作废 你好不容易扒完,过两天就挂,还要重新抓包、逆向 而官方开放的 API + Token 是稳定商用接口,几年都不换格式,专门给…...

RK3588平台IMX415摄像头驱动调试全流程与实战指南

1. 项目概述与核心挑战最近在基于瑞芯微RK3588平台调试索尼IMX415摄像头&#xff0c;整个过程可以说是既典型又充满细节。对于嵌入式Linux开发&#xff0c;尤其是多媒体应用&#xff0c;摄像头驱动调试往往是硬件适配中最关键也最磨人的一环。RK3588作为一款高性能的AIoT SoC&a…...

量子振荡与拓扑输运调控:从实验测量到主动驾驭

1. 项目概述&#xff1a;从“驾驭”一词说起“如何在量子振荡中驾驭拓扑量子输运&#xff1f;”——当我第一次看到这个问题时&#xff0c;脑海里浮现的不是复杂的公式&#xff0c;而是一个更形象的画面&#xff1a;你驾驶着一艘小船&#xff0c;航行在一片由无数微小漩涡&…...

告别NuWriter!手把手教你用命令行打包新唐NUC980 SPI NAND完整系统镜像

新唐NUC980 SPI NAND量产化镜像构建实战指南 在嵌入式设备量产过程中&#xff0c;传统烧录方式往往成为效率瓶颈。当面对新唐NUC980这类基于SPI NAND的工控设备时&#xff0c;产线工程师常需要反复切换工具链、分步烧录不同组件&#xff0c;不仅耗时费力&#xff0c;还容易因人…...