服务网关Gateway快速入门

news2025/1/13 9:20:14

1.引入

网关可以把它理解成坐高铁时的安检,他可以对用户做身份验证,哪些人能通过,哪些人不能通过,都由他决定,如果没有安检,那么高铁的安全性将受到打击,一个微服务没有网关,那么接口都将暴露出来,安全性大打折扣

2.作用

  • 对用户的请求做身份验证,权限验证,类似于过滤器,只有符合规则的请求才能被响应
  • 将用户的请求路由到微服务,并且实现负载均衡
  • 对用户请求进行限流,限制访问人数 

3.简单实现

网关也是微服务架构中的一环,因此就决定了它本身也是服务,所以我们要单另新建一个服务来专门作网关

项目结构:

 

3.1.引入依赖

        <!--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>

刚刚上面说了,网关Gateway也是一个服务,所以我们也得把它放在Nacos上管理,所以要引入Nacos的发现依赖,gateway作为springcloud的一个依赖,在springcloud版本2020以上的时候,已经摒弃了ribbon这个负载均衡器,而用的是loadbalancer这个负载均衡器,所以我们得单另再引入这个的依赖,如下: 

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

3.2.编写配置文件

编写了网关的相关配置才能起作用,配置如下:

  • id:是路由的标识,必须要是唯一
  • uri:路由的目标地址,这里的lb是负载均衡的意思,后面跟的服务名称
  • predicates:是断言的意思,请求只有符合断言,才能被路由

上图就是网关在整个请求访问中的作用,用户发送请求访问网关,网关通过断言来判断请求合不合法,如果合法,则通过uri从Nacos注册中心拉取服务,然后再通过负载均衡随机访问一个服务

4.过滤器工厂

在网关里存在过滤器,其作用是对路由的请求或者响应做加工处理,比如添加或者删除请求头之类的操作 

 spring提供了多种不同的路由过滤器工厂GatewayFilterFactory,这里我就挑一个来做个示范

4.1.编写配置 

  • 注意格式,What是请求头的键,后面Today Is Sunday是请求头的值,这两者缺一不可
  • 我把filters的配置写在了user-service配置下边,order-service配置上边,所以只对user-service服务的请求有效,如果要对所有服务请求的添加一个请求头,可以在配置的最下面写这个filter的配置,但是有细微的变化,如下:

5.全局过滤器

之前上面讲的过滤器都是通过配置的方式来实现过滤的,这样的过滤器没办法手动更改业务逻辑,所以接下来讲一个可以在类中手动更改业务逻辑的全局过滤器GlobalFilter

5.1.添加一个过滤器类

让这个类实现GlobalFilter这个全局过滤器的接口,然后来手动编写业务逻辑

  • 要实现的方法只有一个,这方法有两个参数,第一个参数是请求上下文,从请求经过网关开始到结束,这个时间段里,这个exchange一直可以被共享,用来获取请求或者响应的相关信息,第二个是用来放行过滤器的
  • 下面的例子增添的业务逻辑是,看看在请求参数中authorization的值是否是author,如果是,那就放行,如果不是那就拦截
@Order(1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        //2.获取authorization参数
        String authorization = params.getFirst("authorization");
        //3.校验
        if ("author".equals(authorization)){
            //放行
            return chain.filter(exchange);
        }
        //4.拦截
        //4.1.设置状态码401
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //4.2.拦截请求
        return exchange.getResponse().setComplete();
    }
}

其中的注解也说明下,第一个@Order,是用来管理过滤器的顺序的,后面的参数越小,表示这个过滤器越早被访问到,第二个@Component,用来把这个类注册到spring中

 5.2.过滤器执行顺序

到此为止,过滤器讲了有路由过滤器defaultFilter全局过滤器,那么这三个过滤器的执行顺序是怎样的呢?

  • 这里只做简单的了解,如果配置了@Order注解,那么值越小,优先级越高,如果@Order值相等,那么顺序是defaultFiltet > 路由过滤器 > 全局过滤器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据新视界 --大数据大厂之HBase深度探寻:大规模数据存储与查询的卓越方案

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

webpack原理简述

1.1 核心概念 JavaScript 的 模块打包工具 (module bundler)。通过分析模块之间的依赖&#xff0c;最终将所有模块打包成一份或者多份代码包 (bundler)&#xff0c;供 HTML 直接引用。实质上&#xff0c;Webpack 仅仅提供了 打包功能 和一套 文件处理机制&#xff0c;然后通过生…

Mini-Omni 语言模型在流式传输中边思考边听说应用

引入简介 Mini-Omni 是一个开源的多模态大语言模型,能够在思考的同时进行听觉和语言交流。它具有实时端到端语音输入和流媒体音频输出的对话能力。 语言模型的最新进展取得了显著突破。GPT-4o 作为一个新的里程碑,实现了与人类的实时对话,展示了接近人类的自然流畅度。为了…

69、Python番外篇:从编程范式看如何学习一门编程语言的精髓

引言 在之前的文章中&#xff0c;我们曾聊过如何学习一门编程语言&#xff0c;当时是从程序的构成的角度来分析、展开的&#xff0c;主要提及了数据的表达 数据的处理&#xff0c;也就是数据结构 算法的内容。这个角度对应到所有编程语言&#xff0c;基本都是适用的。但是&a…

认识泛型和包装类

认识泛型和包装类 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 什么是泛型引出泛型语法 泛型类的使用语法示例类型推导 裸类型(Raw Type)说明 泛型如何编译的擦除机制 泛型的上界语法示例复杂示例 泛型方法定义方法示例使用类型推导和不用类型推导静态的泛型…

电脑安装OpenWRT系统

通过网盘分享的文件&#xff1a;OpenWRT 链接: https://pan.baidu.com/s/1nrRBeKgGviD31Omji480qA?pwd9900 提取码: 9900 下面开始教程&#xff1a; 1.先把普通U盘制作成一个PE启动盘&#xff0c;我用的是微PE工具箱&#xff0c;直接安装PE到U盘。 2.把写盘工具和openWRT系统…

项目中使用简单的立体3D柱状图,不用引入外部组件纯css也能实现

在一些项目需求中&#xff0c;可能会遇到下面这种场景&#xff0c;3d柱状图来展示百分比&#xff0c;但是又不想引入外部组件&#xff0c;下面就用纯css给大家封装了一个组件 先赞后看&#xff0c;养成习惯 <template><view class"lui-column-bg" :sty…

DApp开发入门指南:从概念到实践

随着区块链技术的不断发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为科技领域的热门话题。DApp不仅打破了传统应用的中心化控制&#xff0c;还为开发者和用户提供了更高的安全性、透明度和自治性。本文将带你深入了解DApp的开发流程以及如何设计合理的DApp…

SIMCOM-A4767C-4G模块ARM开发板上网配置流程

进入linux系统命令行后。 配置4G网卡 1、打开串口&#xff0c;会进入编辑模式。 busybox microcom /dev/ttyUSB22、设置网络模式&#xff0c;回复OK表示设置成功。 ATDIALMODE03、设置ECM模式&#xff0c;回复OK表示设置成功。设置成功后4g会重启。 AT$MYCONFIG"USB…

Vue3:el-table实现日期的格式化

后端如果返回的是时间戳&#xff0c;需要我们进行日期格式化 例如&#xff1a;2024-09-11T14:19:14 定义一个日期解析的工具组件 export function formatDateAsYYYYMMDDHHMMSS(dateStr: any) {const date new Date(dateStr);const year date.getFullYear();const month S…

【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决

1. xxl-job 报错日志 2024-09-11 17:19:04 [com.xxl.job.core.thread.JobThread#run]-[133]-[xxl-job, JobThread-3-1726046344528] <br>----------- xxl-job job execute start -----------<br>----------- Param: 2024-09-11 17:19:04 [com.xxl.job.core.thread…

使用mingw64 编译 QT开发流程

1. 安装QT5 QT5.12.12 安装时选择mingw的开发包 2. 使用qtdesigner 进行ui设计 生成ui文件 3. 将ui文件转换为.h 文件 uic mywindow.ui -o ui_mywindow.h代码中指向生成的 UI 对象的地方 要改成这个Form 4. 编译 创建mainwindow.cpp #include "mainwindow.h"…

PROTOTYPICAL II - The Practice of FPGA Prototyping for SoC Design

The Art of the “Start” The semiconductor industry revolves around the “start.” Chip design starts lead to more EDA tool purchases, more wafer starts, and eventually to more product shipments. Product roadmaps develop to extend shipments by integrating…

Ton的编译过程(上)

系列文章目录 FunC编写初始准备 文章目录 系列文章目录预先准备第一个FunC合约深入compileFunc的内部compileFunc初探艾丽卡的疑惑package.json 初览index.js 预先准备 首先请大家跟着艾丽卡一步一步的完成FunC编写初始准备 这里面环境的搭建。 接下来&#xff0c;请做好下面…

博弈论中纳什均衡和囚徒困境的探索性分析

一. 纳什均衡求解 纳什均衡&#xff0c;又称为非合作博弈均衡&#xff0c;是博弈论中的一个核心概念。纳什均衡描述的是在非合作博弈中&#xff0c;每个参与者都选择了自己的最优策略&#xff0c;并且考虑到了其他参与者的策略选择。在这种状态下&#xff0c;没有任何一个参与…

HAL库学习梳理——SPI

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关 SPI 课程知识和应用做一个梳理。 无流可省 1、SPI 总线基本原理 SPI总线&#xff08;Series Peripheral Interface&#xff09;串行外设接口&#xff0c;适用于高速、双向数据传输场景。 MOSI MISO SCK …

提权——Linux

一、系统漏洞提权 #kali的nmap命令 nmap -O 目标ip 通过当前系统的内核版本搜索当前系统的漏洞&#xff0c;进行利用 搜索漏洞 对linux系统的漏洞进行利用&#xff08;脏牛、脏管道等&#xff09; 利用漏洞搜索工具&#xff0c;搜索当前系统是否存在一些漏洞 linux-exp…

单值二叉树--(C语言)

题目如下&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&a…

Linux - 探秘/proc/sys/net/ipv4/ip_local_port_range

文章目录 Pre概述默认值及其意义评估需求如何调整临时修改永久修改测试和验证 修改的潜在影响 Pre Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置 计划&#xff1a; 简要解释 /proc/sys/net/ipv4/ip_local_port_range 文件的功能和作用。介绍该文件的默认值及其影响。说明…