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

微服务-GateWay(网关)

所谓网关是什么意思?

       相当于就是你们小区家的保安,进出小区都得获得保安的同意,守护你们小区的生命财产健康,网关也是如此,对每个请求都严格把关,将合法的或者是获得权限的请求进入服务器

网关的功能:

  • 身份验证和权限校验
  • 服务路由、负载均衡
  • 请求限流

 一般的常见的网关分别是:

Gateway:基于Spring5中提供的WebFlux,属于响应式编程的实现,具有更好的性能

zuul:基于servlet的实现,属于阻塞式编程

搭建网关服务

1.创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

   <!--nacos服务注册发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2.编写路由配置即nacos地址:

server:port: 10010
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示,必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言,判断请求是否符合规则- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合

总结:

网关搭建的步骤:

1.创建项目,引入nacos服务发现和gateway依赖

2.配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

1.理由id:路由的唯一标识

2.路由目标:路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

3路由断言:判断路由的规则

4.路由过滤器:对去请求或响应做处理

路由断言工厂(Route Predicate Factory)

网关路由可以配置的内容为:

  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地

       配置文件中的规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件,例如“Path=/user/**”是按照路径进行匹配,只让以/user开头的就认为是符合的

  • filter:路由过滤器,处理请求或响应

11种工厂:

 路由过滤器GatewayFilter

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

 下面列举几个Spring提供的不同的路由过滤器工厂:

现在要求给进入A服务的所有请求添加一个请求头,你会怎么实现?

给某个服务单独添加请求头:

spring:cloud:gateway:routes:#网关路由配置- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**filters: #过滤器- AddRequestHeader=Truth,Itcast is freaking awesome!#添加请求头

如果要对所有的路由都生效,即可将过滤工厂写到default下,如:

spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示,必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言,判断请求是否符合规则- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**default-filters:#对所有的路由都生效的过滤器- AddRequestHeader=Truth,Itcast is freaking awesome!

全局过滤器

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

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2.获取参数中的 authorization 参数String auth = params.getFirst("authorization");// 3.判断参数值是否等于 adminif ("admin".equals(auth)) {// 4.是,放行return chain.filter(exchange);}// 5.否,拦截// 5.1.设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;}

步骤:

1.实现GlobalFilter接口

2.添加@Order注解或者实现Ordered接口

3.编写处理逻辑

过滤器执行顺序

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

跨域问题

       跨域问题:域名不一致就是跨域。浏览器禁止请求的发起者与服务器发生跨域ajax请求,请求被浏览器拦截的问题

CORS:

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

相关文章:

微服务-GateWay(网关)

所谓网关是什么意思&#xff1f; 相当于就是你们小区家的保安&#xff0c;进出小区都得获得保安的同意&#xff0c;守护你们小区的生命财产健康&#xff0c;网关也是如此&#xff0c;对每个请求都严格把关&#xff0c;将合法的或者是获得权限的请求进入服务器 网关的功能&…...

基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构

本文研究的六轮差速移动机器人 (Six-Wheeled Differential Mobile Robot &#xff0c; SWDMR) 为了满足资源站到资源站点对点的物资运输&#xff0c;对机器人的跨越障碍能力 有较高的要求。对比传统的四轮移动机器人&#xff0c;六轮移动机器人能够提供更强的驱动 力&#…...

单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量

基本数据类型可以作为变量与常量使用,顾名思义&#xff0c;变量运行时可以改变其值&#xff0c;常量运行时不会改变其值。 常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。 通常用#define来定义一个标识符来表示一个常量 用type name 常量来定义一个变量,…...

如何在 3dmax 中渲染? 3dmax渲染教程

3D Max是一款专业的3D计算机设计软件&#xff0c;用于创建3D动画、游戏、模型、图像等&#xff0c;在视频游戏开发商、电影和电视工作室的工作中发挥着重要作用。渲染是 3D max 建模的一个非常重要的部分。在渲染中&#xff0c;通过设置渲染选项的一些参数&#xff0c;我们可以…...

linux部署项目, 报数据库连接不上错误

问题描述: sprinboot项目, 本地连线上数据库可以使用, springboot项目中java包的版本是8.0, 线上数据库是5.7, 但在将项目部署到服务器上的时候发现项目启动报错, 于是寻找问题&#xff0c; 发现是useSSLtrue导致的 出问题前的链接地址: url: jdbc:mysql://localhost:3306/ja…...

现有的vue3+ts+vite项目集成electron

效果图 什么时Electron Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 现有的vue3项目集成Electron 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是…...

线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)

1.4.1 方阵 矩阵里&#xff0c;行数列数的矩阵叫做方阵方阵有很多很好的特殊属性 1.4.2 行列式 行列式是方阵的一种特殊运算如果矩阵行数列数相等&#xff0c;那么这个矩阵是方阵。行列数的计算方式和矩阵的不同只有方阵才有行列式行列式其实是&#xff0c;矩阵变化的一个面…...

Ubuntu vi 左下角没有提示

1 打开终端&#xff0c;输入以下命令 sudo gedit /etc/vim/vimrc.tiny 2 进入文件后&#xff0c;修改 set compatible 为set nocompatible&#xff0c;如下所示&#xff1a; " Vim configuration file, in effect when invoked as "vi". The aim of this "…...

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告&#xff1a;不赞成…...

Dubbo 融合 Nacos 成为注册中心

快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”以及“配置注册中心“。 增加 Maven 依赖 只需要依赖Dubbo客户端即可&#xff0c;关于推荐的使用版本&#xff0c;请参考Dubbo官方文档或者咨询Dubbo开发人员&#…...

kafka--kafka基础概念-ISR详解

kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据&#xff0c;要同步到紫色的P1S1和P1S2 如何保证一致性呢&#xff1f; 使用In Sync Replicas 也就是ISR概念 为什么不一致的&#xff1f; 因为P1S1同步数据 可能花费 50ms P1S2可能花费60ms…...

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划 主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...

音频解码及如何在Java实现

本人并不干这个&#xff0c;但是被迫下水了解了一下这个&#xff0c;稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了&#xff0c;在此开辟一篇。无意放出代码&#xff0c;这里只介绍一些可能重要的点。 本来以为有了ChatGPT写这些就没有必要了&…...

Webshell 及检测绕过

webshell 概念 web指的是在web服务器上&#xff0c;而shell是用脚本语言编写的脚本程序&#xff0c;WebShell是一种用来进行网站和服务器管理的脚本程序,webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途&#xff0c;但是由于webshell的功能比较强大&#xff0…...

Ubuntu22.4系统mongodb数据库安装

Ubuntu22.4系统mongodb数据库安装 1、打开终端并运行以下命令&#xff0c;以导入 MongoDB GPG 密钥&#xff1a; wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -2、添加 MongoDB 仓库到你的系统。根据你的 Ubuntu 版本&#xff0c;选择…...

Vue初识别--环境搭建--前置配置过程

问题一&#xff1a; 在浏览器上的扩展程序上添加了vue-devtools后不生效&#xff1a; 解决方式&#xff1a;打开刚加入的扩展工具Vue.js devtools的允许访问文件地址设置 问题二&#xff1a;Vue新建一个项目 创建一个空文件夹hrsone&#xff0c;然后在VSCode中打开这个空文件夹…...

数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)

前言&#xff1a;Hello&#xff0c;大家好&#xff0c;我是心跳sy&#x1f618;&#xff0c;本节我们介绍c语言的两种基本的内置数据类型&#xff1a;数值类型和字符类型在内存中的储存方法&#xff0c;并对大小端进行详细介绍&#xff08;附两种大小端判断方法&#xff09;&am…...

Word怎么转换成PDF文档?多个Word转换成PDF步骤分享

word文档是一种非常好用的文件格式&#xff0c;可以帮助用户们很好的保存图片和文字内容&#xff0c;不过并不是只有word这一种文档类文件格式&#xff0c;还有一种pdf文档也深受用户们的欢迎&#xff0c;在工作或者学习过程中这两种文档是可以互相转换格式的&#xff0c;那么W…...

【C++习题集】-- 堆

&#xff08;用于复习&#xff09; 目录 树概念及结构 名词概念 二叉树概念及结构 特殊的二叉树 满二叉树 完全二叉树 运算性质 二叉树存储结构 顺序存储 链式存储 堆 - 顺序存储 堆的性质 堆的实现 堆的应用 堆排序 直接建堆法 树概念及结构 概念&#xff1a…...

vue + vue-office 实现多种文件(docx、excel、pdf)的预览

支持多种文件( docx、excel、pdf)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。 github: 《仓库地址》 演 示&#xff1a; 《演示效果》 功能特色 一站式&#xff1a;提供docx、pdf、excel多种文档的在线预览方案&#xff0c;有它就够了简单&#xff1a…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...