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

微服务---gateway网关

目录

gateway作用

gateway使用

添加依赖

配置yml文件

自定义过滤器

nacos上的gateway的配置文件


我们现在知道了通过nacos注册服务,通过feign实现服务间接口的调用,那对于不同权限的用户访问同一个接口,我们怎么知道他是否具有访问的权限呢?或者我们怎么判断是否用户已经登录了呢?这些都可以通过gateway进行实现~

gateway作用

        Spring Cloud Gateway是Spring Cloud生态系统中的一员,它被设计用于处理所有微服务的入口流量。作为一个反向代理,它不仅提供了负载均衡和路由功能,还支持灵活的过滤器机制,过滤器可以在请求进入网关和离开网关时执行,用于处理各种逻辑,如身份验证、日志记录和性能监测,使得开发者能够定制和扩展其功能。

下图提供了一个关于 Spring Cloud Gateway 如何工作的高层次概述。

        客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配,它将被发送到Gateway Web处理程序。这个处理程序通过一个特定于该请求的过滤器链来运行该请求。过滤器被虚线分割的原因是,过滤器可以在代理请求发送之前和之后运行逻辑。所有的 "pre" (前)过滤器逻辑都被执行。然后发出代理请求。在代理请求发出后,"post" (后)过滤器逻辑被运行。 

gateway使用

添加依赖

 <!--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><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--开启Spring Cloud 应用程序启动时加载bootstrap配置文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.4</version></dependency>

配置yml文件

gateway的配置文件其实就是将所有接口配置到web服务中,然后通过具体的过滤原则来访问每个接口

    其中- Authoriza=false表示是否需要通过token验证,这个为我们自定义的一个过滤原则名称的前缀,- StripPrefix=1为在发送请求时是否需要去掉第一层路径,比如/api/user/**如果StripPrefix=1表示api需要去掉,实际访问的是/user/**接口。

自定义过滤器

 AuthorizaGatewayFilterFactory使我们自定义的一个过滤器,gateway的自定义过滤器名字是有一定要求的,即 “你想取的过滤器名字前缀+GatewayFilterFactory”,这里以我的为例,然后把前缀作为刚刚配置文件的配置进行配置

然后我们实现这个自定义的过滤器

package com.yinan.authorize;import com.alibaba.fastjson.JSONArray;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpHeaders;
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 java.util.Arrays;
import java.util.List;@Component
@Slf4j
@Data
@ConfigurationProperties(prefix ="exclude")
public class AuthorizaGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthorizaGatewayFilterFactory.Config> {/*** 需要放行的授权接口(nacos中的配置文件)*/private String[] path;@Autowiredprivate RedisTemplate<String, String> redisTemplate;/*** 授权token*/private static final String AUTHORIZE_TOKEN = "Authorization";/****/private static final String AUTHORIZE_IP = "x-access-ip";/*** 用来标记是否需要授权校验*/private static final String AUTHORIZE_RESOURCE = "x-access-resource";public AuthorizaGatewayFilterFactory() {super(Config.class);log.info("Loaded GatewayFilterFactory [Authorize]");}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("enabled");}@Overridepublic GatewayFilter apply(Config config) {log.info("你已经进入gateway的过滤器中了----------");return (exchange, chain) -> {if (!config.enabled) {return chain.filter(exchange);}ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = request.getHeaders();ServerWebExchange build = null;//            从header中获取token信息String token = headers.getFirst(AUTHORIZE_TOKEN);//            获取用户IPString ip = headers.getFirst(AUTHORIZE_IP);log.info("当前访问url: " + request.getURI());if (token == null) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}log.info("请求的token为:" + token);log.info("请求的ip为:"+ ip);if (!"".equals(token)) {try {ValueOperations<String, String> value = redisTemplate.opsForValue();String userid = value.get(ip + "_user_" + "_userid_" + token);System.out.println("userid:"+ userid);String username = value.get(ip + "_user_" + "_username_" + token);String auth=value.get(ip+"_token_"+userid);if(auth==null){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}
//            设置请求头ServerHttpRequest host = exchange.getRequest().mutate().headers(httpHeaders -> {httpHeaders.add("USER-ID", userid);httpHeaders.add("USER-NAME", username);}).build();build = exchange.mutate().request(host).build();
//            判断是否需要接口授权校验if (StringUtils.isNotBlank(headers.getFirst(AUTHORIZE_RESOURCE))) {Boolean authority = getAuthority(request.getURI().toString(), userid);if (authority) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}}
//            黑名单校验
//                    if (checkBlackList(ip, username)) {
//                        response.setStatusCode(HttpStatus.FORBIDDEN);
//                        return response.setComplete();
//                    }} catch (Exception e) {e.printStackTrace();
//                    token无效log.error("出现异常【{}】", e.getMessage());//设置状态码response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}}
//认证通过,将用户ID进行传递到下游服务器return chain.filter(build);};}/*** 校验黑名单* @param ip* @param username* @return*/
//    private boolean checkBlackList(String ip, String username) {
//
//    }/***  获取用户权限(接口权限校验)* @param url* @param userid* @return*/private Boolean getAuthority(String url, String userid) {//放行接口不需要做授权校验,直接放行for (String path:path) {if(url.indexOf(path)!=-1){return false;}}//获取用户权限String resource=redisTemplate.opsForValue().get("userPermission:"+userid);List<String> list= JSONArray.parseArray(resource,String.class);for (String res:list) {if(url.indexOf(res)!=-1){return false;}}return true;}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Config {/*** 控制是否开启认证*/private boolean enabled;}}

如果你看了我之前讲的nacos配置的内容,那你应该就能理解以下截图中的意思,没有了解过nacos的话建议先去看看以下文章:微服务----nacos配置及简单使用

nacos上的gateway的配置文件

management:# 端点检查(健康检查)endpoints:web:exposure:include: "*"
spring:profiles:active: devcloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:# 处理跨域globalcors:corsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowedMethods: "*"discovery:locator:# false为服务器名不自动匹配,true则相反enabled: false# 服务名以小写进行匹配lowerCaseServiceId: trueroutes:# web服务- id: service-1uri: lb://data-serverpredicates:- Path=/scriptsContent/**filters:#开启token验证- Authoriza=true- StripPrefix=0- id: service-2uri: lb://user-servicepredicates:- Path=/api/user/**filters:- Authoriza=false- StripPrefix=0#需要放行的授权接口
exclude:path:- /system/dictionary/by- /system/resource/by- /system/role/by- /system/api/user/by- /system/black/by- /oss- /web/article/by- /web/code/bypattern:dateformat: yyyy/MM/dd hh:mm:ss

以上就是我的具体的过滤器实现逻辑,但是需要根据你实际的项目代码逻辑对这个过滤器进行修改 。

        实现后,当前端调用你的接口时,会经过gateway网关中的过滤器看看你是否有这个权限进行访问,或者是否需需要经过登录后才能访问,如果以上都没问题,就会放行到下游过滤器继续进行检查,如果都没有问题最后就会调用到你的接口~

        以上几篇博文我们大致讲了一下微服务的搭建和使用,本人也是最近刚学会微服务,对于简单的微服务搭建你可以根据我的这几篇博文进行学习,如果版本这些没什么问题是肯定能实现的,至于这些技术较深的理解和学习如果你有兴趣可以继续进行专研学习,我们共同进步~

相关文章:

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…...

HTML4(二)

文章目录 1 开发者文档2 基本标签2.1 排版标签2.2 语义化标签2.3 行内元素与块级元素2.4 文本标签2.5 常用标签补充 3 图片标签4 超链接标签4.1 跳转页面4.2 跳转文件4.3 跳转锚点4.4 唤起指定应用 5 列表5.1 有序列表5.2 无序列表5.3 自定义列表 6 表格6.1 基本结构6.2 表格标…...

SpringBoot 扩展篇:ConfigFileApplicationListener源码解析

SpringBoot 扩展篇&#xff1a;ConfigFileApplicationListener源码解析 1.概述2. ConfigFileApplicationListener定义3. ConfigFileApplicationListener回调链路3.1 SpringApplication#run3.2 SpringApplication#prepareEnvironment3.3 配置environment 4. 环境准备事件 Config…...

蓝桥杯省三爆改省二,省一到底做错了什么?

到底怎么个事 这届蓝桥杯选的软件测试赛道&#xff0c;都说选择大于努力,软件测试一不卷二不难。省赛结束&#xff0c;自己就感觉稳啦&#xff0c;全部都稳啦。没想到一出结果&#xff0c;省三&#xff0c;g了。说落差&#xff0c;是真的有一点&#xff0c;就感觉和自己预期的…...

Unity EventSystem入门

概述 相信在学习Unity中&#xff0c;一定有被UI事件困扰的时候把&#xff0c;当添加UICanvas的时候&#xff0c;Unity会为我们自动添加EventSystem&#xff0c;这个是为什么呢&#xff0c;Unity的UI事件是如何处理的呢&#xff0c;在使用各个UI组件的时候&#xff0c;一定有不…...

第4章 Vim编辑器与Shell命令脚本

第4章 Vim编辑器与Shell命令脚本 1. Vim文本编辑器2. 编写Shell脚本2.2 接收用户的参数2.3 判断用户的参数 3. 流程控制语句3.1 if条件测试语句3.2 for条件循环语句3.3 while条件循环语句3.4 case条件测试语句 4. 计划任务服务程序复习题 1. Vim文本编辑器 Vim编辑器中设置了三…...

javaWeb快速部署到tomcat阿里云服务器

目录 准备 关闭防火墙 配置阿里云安全组 点击控制台 点击导航栏按钮 点击云服务器ECS 点击安全组 点击管理规则 点击手动添加 设置完成 配置web服务 使用yum安装heepd服务 启动httpd服务 查看信息 部署java通过Maven打包好的war包项目 Maven打包项目 上传项目 …...

[MQTT]Mosquitto的內網連接(intranet)和使用者/密碼權限設置

[MQTT | Raspberry Pi]Publish and Subscribe with RSSI Data of Esp32 on Intranet 延續[MQTT]Mosquitto的簡介、安裝與連接測試文章&#xff0c;接著將繼續測試在內網的兩台機器是否也可以完成發佈和訂閱作業。 同一網段的兩台電腦測試: 假設兩台電腦的配置如下: A電腦為發…...

某盾BLACKBOX逆向关键点

需要准备的东西&#xff1a; 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取&#xff0c;每次页面刷新&#xff0c;混淆的代码都会变&#xff0c;这是正常&#xff0c;以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…...

【2024全国青少年信息素养大赛初赛时间以及模拟题】

2024全国青少年信息素养大赛时间已经出来了 目录 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 1、比赛时间和考试内容&#xff1a; 算法创意实践挑战赛初中组于5月19日举行&#xff0c;检录时间为10:30-11:00&#xf…...

2024年软件测试最全jmeter做接口压力测试_jmeter接口性能测试_jmeter压测接口(3),【大牛疯狂教学

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…...

LLM——用于微调预训练大型语言模型(LLM)的GPU内存优化与微调

前言 GPT-4、Bloom 和 LLaMA 等大型语言模型&#xff08;LLM&#xff09;通过扩展至数十亿参数&#xff0c;实现了卓越的性能。然而&#xff0c;这些模型因其庞大的内存需求&#xff0c;在部署进行推理或微调时面临挑战。这里将探讨关于内存的优化技术&#xff0c;旨在估计并优…...

Telnet协议:远程控制的基石

目录 1. 概述 2. 工作机制 3. 网络虚拟终端 4. 选项协商 5. 操作方式 6. 用户接口命令 7. 验证的过程 1. 概述 Telnet&#xff08;Telecommunication Network&#xff09;是一种用于在互联网上远程登录到计算机系统的标准协议。它早期被广泛用于远程终端连接&#xff0…...

网络工程师必备:静态路由实验指南

大家好&#xff0c;这里是G-LAB IT实验室。今天带大家学习一下华为静态路由实验配置 01、实验拓扑 02、实验需求 1.R1环回口11,1,1.1模拟PC1 2.R2建立2个环回口模拟Server server-1: 22,1,1.1 server-2: 44.1.1.1 3.要求使用静态路由实现全网互通 PC1去往server-1从R3走…...

springboot利用切面保存操作日志(支持Spring表达式语言(简称SpEL))

springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09; 文章目录 springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09;前言一、Spring EL是什么&#xff1f…...

遂宁专业知识付费系统报价,免费网课平台怎么开通?需要哪些条件?

其实&#xff0c;不少的大咖老师都不愿意在大平台上开课&#xff0c;因为学员的留存并不是自己的&#xff0c;所以&#xff0c;很多人也考虑自己开通网课平台&#xff0c;那免费的平台怎么开通?这就是我们今天要跟老师们分享的内容了。 需要哪些条件? 大家如果想要开通免费的…...

【linuxC语言】fcntl和ioctl函数

文章目录 前言一、功能介绍二、具体使用2.1 fcntl函数2.2 ioctl函数三、拓展:填写arg总结前言 在Linux系统编程中,经常会涉及到对文件描述符、套接字以及设备的控制操作。fcntl和ioctl函数就是用来进行这些控制操作的两个重要的系统调用。它们提供了对文件、设备和套接字进行…...

java——继承(一)

一&#xff1a;匿名对象 只能使用一次&#xff0c;每一次使用都会创建一个新的对象&#xff0c;默认值和数组的默认值的规则相同。所以适用于调用一次对象的情况&#xff1a; public class ClassAnonymous {String name;public void show(){System.out.println(name"真厉…...

【Linux】进程间通信方式之管道

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误的话&#xff0c;还望指出&…...

【Linux】yum与vim

文章目录 软件包管理器&#xff1a;yumLinux安装和卸载软件包Linux中的编辑器&#xff1a;vimvim下的底行模式vim下的正常模式vim下的替换模式vim下的视图模式vim下的多线程 软件包管理器&#xff1a;yum yum其实就是一个软件,也可以叫商店 和你手机上的应用商店或app store一…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...