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

【Spring Cloud】Gateway组件的三种使用方式

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

🌟前言

✨创建模块

✨使用Gateway的三种方式

🍃方法一

🍃方法二

🍃方法三

 

🌟前言

        Spring Cloud Gateway是 Spring 官方基于 Spring5.0 SpringBoot2.0 Project Reactor 等技术开发的网关旨在为微服务框架提供一种简单而有效的统一的API 路由管理方式,统一访问接口。
        Spring Cloud Gateway作为 Spring Cloud 生态体系中的网关,目标是替代 Netflix Zuul ,其不仅提供统 一的路由方式,并且基于Filter 链的方式提供了网关基本的功能,例如:安全、监控 / 埋点和限流等等,而且它是基于Netty 的响应式开发模式。

✨创建模块

我们的Gatewa既然是负责网络路由的,那么它首先肯定是个模块,所以我们的第一步就是需要创建一个模块。
修改该模块的pom.xml文件,让其继承父模块及导入相应的依赖
  <parent><groupId>org.example</groupId><artifactId>Cloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.35</version></dependency>
</dependencies>

因为所有的服务都要接入网关,而服务都在注册中心有记录,所以我们网关要与Nacos关联,首先需要在配置文件中与Nacos做配置并且在启动类开启Nacos

@EnableDiscoveryClient(启动类打上该注解)

server:port: 8083
spring:cloud:nacos:server-addr: localhost:8848application:name: geteway

将全部服务启动就可以看到我们的gateway也被注册到Nacos中啦

✨使用Gateway的三种方式

🍃方法一

gateway:discovery:locator:
#是否与服务发现组件进行结合,通过service-id(必须设置成大写)转发到具体的服务实例。默认 false
#为true代表开启基于服务发现的路由规则。enabled: true
#配置之后访问时service-id无需大写lower-case-service-id: true

 

注意:我们的gateway是与spring下的nacos的标签同级别可不要将它写在nacos下面

 

 前面是通过服务直接访问的,后面则是通过网关向服务发起的请求,此时我们的请求已经被官网处理了。

🍃方法二

第二种方式是为了防止使用第一种方式的时候服务名字太长而导致的麻烦,这种方式类似于为服务名又起了一个别名。

    gateway:routes:# 路由标识(id:标识,具有唯一性)- id: user-consumer-api#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死uri: lb://consume#优先级,越小越优先predicates:# 路径匹配,- Path=/aa/**filters:#前缀过滤,请求地址:http://localhost:8084/usr/hello#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/**,就将**转发到指定的微服务- StripPrefix=1

 这里如果使用的是http://localhost:8083/aa/test01就会映射到consume这个服务,并且通过前缀过滤会过滤掉aa拿到test01就会映射到consume/test01上,得到如下结果👇👇

 

🍃方法三

第三种方式是结合配置读取类进行的,我们将对服务的网关配置写在Nacos,然后再用这个读取类去进行读取,获取我们想要的路由信息。

    gateway:nacos:server-addr: ${spring.cloud.nacos.server-addr}data-id: dynamic-routing.jsongroup: DEFAULT_GROUP

首先需要新建一个POJO包将以下类进行创建

package org.example.geteway.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.LinkedHashMap;
import java.util.Map;/*** @author hgh*/
@SuppressWarnings("all")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class FilterEntity {//过滤器对应的Nameprivate String name;//路由规则private Map<String, String> args = new LinkedHashMap<>();}
package org.example.geteway.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@SuppressWarnings("all")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ConfigurationProperties(prefix = "gateway.nacos")
@Component
public class GatewayNacosProperties {private String serverAddr;private String dataId;private String namespace;private String group;}
package org.example.geteway.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.LinkedHashMap;
import java.util.Map;/*** @author hgh*/
@SuppressWarnings("all")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PredicateEntity {//断言对应的Nameprivate String name;//断言规则private Map<String, String> args = new LinkedHashMap<>();}
package org.example.geteway.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.ArrayList;
import java.util.List;/*** @author hgh*/
@SuppressWarnings("all")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class RouteEntity {//路由idprivate String id;//路由断言集合private List<PredicateEntity> predicates = new ArrayList<>();//路由过滤器集合private List<FilterEntity> filters = new ArrayList<>();//路由转发的目标uriprivate String uri;//路由执行的顺序private int order = 0;}

最后创建一个配置信息读取类,这个类是一个基于 Spring Cloud Gateway 和 Nacos 的动态路由配置类,它实现了一个 Spring 提供的事件推送接口 ApplicationEventPublisherAware。它的功能主要包括监听 Nacos 的配置变化、解析从 Nacos 读取的路由配置信息(json格式)、路由更新、以及组装和定义路由信息等。通过这个类,可以实现路由信息的动态管理和更新。

package org.example.geteway;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.example.geteway.pojo.FilterEntity;
import org.example.geteway.pojo.GatewayNacosProperties;
import org.example.geteway.pojo.PredicateEntity;
import org.example.geteway.pojo.RouteEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Mono;import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;/*** 此类实现了Spring Cloud Gateway + nacos 的动态路由,* 它实现一个Spring提供的事件推送接口ApplicationEventPublisherAware*/
@SuppressWarnings("all")
@Slf4j
@Component
public class DynamicRoutingConfig implements ApplicationEventPublisherAware {@Autowiredprivate RouteDefinitionWriter routeDefinitionWriter;@Autowiredprivate GatewayNacosProperties gatewayProperties;@Autowiredprivate ObjectMapper mapper;private ApplicationEventPublisher applicationEventPublisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}/*** 这个方法主要负责监听Nacos的配置变化,这里先使用参数构建一个ConfigService,* 再使用ConfigService开启一个监听,* 并且在监听的方法中刷新路由信息。*/@Beanpublic void refreshRouting() throws NacosException {//创建Properties配置类Properties properties = new Properties();System.out.println(gatewayProperties);//设置nacos的服务器地址,从配置类GatewayProperties中获取properties.put(PropertyKeyConst.SERVER_ADDR, gatewayProperties.getServerAddr());//设置nacos的命名空间,表示从具体的命名空间中获取配置信息,不填代表默认从public获得if (gatewayProperties.getNamespace() != null) {properties.put(PropertyKeyConst.NAMESPACE, gatewayProperties.getNamespace());}//根据Properties配置创建ConfigService类ConfigService configService = NacosFactory.createConfigService(properties);//获得nacos中已有的路由配置String json = configService.getConfig(gatewayProperties.getDataId(), gatewayProperties.getGroup(), 5000);this.parseJson(json);//添加监听器,监听nacos中的数据修改事件configService.addListener(gatewayProperties.getDataId(), gatewayProperties.getGroup(), new Listener() {@Overridepublic Executor getExecutor() {return null;}/*** 用于接收远端nacos中数据修改后的回调方法*/@Overridepublic void receiveConfigInfo(String configInfo) {log.warn(configInfo);//获取nacos中修改的数据并进行转换parseJson(configInfo);}});}/*** 解析从nacos读取的路由配置信息(json格式)*/public void parseJson(String json) {log.warn("从Nacos返回的路由配置(JSON格式):" + json);boolean refreshGatewayRoute = JSONObject.parseObject(json).getBoolean("refreshGatewayRoute");if (refreshGatewayRoute) {List<RouteEntity> list = JSON.parseArray(JSONObject.parseObject(json).getString("routeList")).toJavaList(RouteEntity.class);for (RouteEntity route : list) {update(assembleRouteDefinition(route));}} else {log.warn("路由未发生变更");}}/*** 路由更新*/public void update(RouteDefinition routeDefinition) {try {this.routeDefinitionWriter.delete(Mono.just(routeDefinition.getId()));log.warn("路由删除成功:" + routeDefinition.getId());} catch (Exception e) {log.error(e.getMessage(), e);}try {routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));log.warn("路由更新成功:" + routeDefinition.getId());} catch (Exception e) {log.error(e.getMessage(), e);}}/*** 路由定义*/public RouteDefinition assembleRouteDefinition(RouteEntity routeEntity) {RouteDefinition definition = new RouteDefinition();// IDdefinition.setId(routeEntity.getId());// PredicatesList<PredicateDefinition> pdList = new ArrayList<>();for (PredicateEntity predicateEntity : routeEntity.getPredicates()) {PredicateDefinition predicateDefinition = new PredicateDefinition();predicateDefinition.setArgs(predicateEntity.getArgs());predicateDefinition.setName(predicateEntity.getName());pdList.add(predicateDefinition);}definition.setPredicates(pdList);// FiltersList<FilterDefinition> fdList = new ArrayList<>();for (FilterEntity filterEntity : routeEntity.getFilters()) {FilterDefinition filterDefinition = new FilterDefinition();filterDefinition.setArgs(filterEntity.getArgs());filterDefinition.setName(filterEntity.getName());fdList.add(filterDefinition);}definition.setFilters(fdList);// URIURI uri = UriComponentsBuilder.fromUriString(routeEntity.getUri()).build().toUri();definition.setUri(uri);return definition;}}

现在需要我们去Nacos创建对应的配置 dynamic-routing.json

{"refreshGatewayRoute": true,"routeList": [{"id": "consumer-api","predicates": [{"name": "Path","args": {"_genkey_0": "/cum/**"}}],"filters": [{"name": "StripPrefix","args": {"_genkey_0": "1"}}],"uri": "lb://consumer","order": 0},{"id": "provider-api","predicates": [{"name": "Path","args": {"_genkey_0": "/pvr/**"}}],"filters": [{"name": "StripPrefix","args": {"_genkey_0": "1"}}],"uri": "lb://provider","order": 0}]
}

现在我们就可以通过获取Nacos所配置的路由进行访问了

如果你更改了Nacos的信息也会实时发送改变不用重启服务器

 

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

相关文章:

【Spring Cloud】Gateway组件的三种使用方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…...

对象的复制

方式一&#xff1a;sv 的new函数 trans tr1,tr2; malbox.get(tr2); tr1 new tr2;//仅用于浅拷贝&#xff0c;拷贝后tr1,tr2为两个独立的对象方式二&#xff1a;uvm 域的自动化常用函数&#xff1a;copy / clone / 使用前提&#xff1a; 1. 函数都可用于uvm_object类型&…...

基于 Python+Neo4j+医药数据,构建了一个知识图谱的自动问答系统

知识图谱是目前自然语言处理的一个热门方向。目前知识图谱在各个领域全面开花&#xff0c;如教育、医疗、司法、金融等。 本项目立足医药领域&#xff0c;以垂直型医药网站为数据来源&#xff0c;以疾病为核心&#xff0c;构建起一个包含7类规模为4.4万的知识实体&#xff0c;…...

Maven之属性管理

1.属性管理 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version> </properties>②&#xff1a;引用属性 <dependency><groupId>org.springframewor…...

快乐学Python,数据分析之获取数据方法「公开数据或爬虫」

学习Python数据分析&#xff0c;第一步是先获取数据&#xff0c;为什么说数据获取是数据分析的第一步呢&#xff0c;显而易见&#xff1a;数据分析&#xff0c;得先有数据&#xff0c;才能分析。 作为个人来说&#xff0c;如何获取用于分析的数据集呢&#xff1f; 1、获取现成…...

前端常用的设计模式

设计模式&#xff1a;是一种抽象的编程思想&#xff0c;并不局限于某一特定的编程语言&#xff0c;而是在许多语言之间是相通的&#xff1b;它是软件设计中常见的问题的通用、可反复使用、多少人知晓的一种解决方案或者模板。一般对与从事过面向对象编程的人来说会更熟悉一些。…...

游戏引擎支持脚本编程有啥好处

很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言&#xff0c;并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程&#xff0c;游戏…...

react中概念性总结(二)

目录 说说你对react的理解&#xff1f;有哪些特性&#xff1f; 说说Real diff算法是怎么运作的&#xff0c;从tree层到component层到element层分别讲解&#xff1f; 调和阶段setState干了什么&#xff1f; 说说redux的工作流程&#xff1f; 为什么react元素有一个$$type属…...

WPF自定义漂亮顶部工具栏 WPF自定义精致最大化关闭工具栏 wpf导航栏自定义 WPF快速开发工具栏

在WPF应用程序开发中&#xff0c;自定义一个漂亮的顶部工具栏具有多重关键作用&#xff0c;它不仅增强了用户体验&#xff0c;还提升了整体应用的专业性和易用性。以下是对这一功能的详细介绍&#xff1a; 首先&#xff0c;自定义顶部工具栏是用户界面设计的重要组成部分&…...

Transformer 的双向编码器表示 (BERT)

一、说明 本文介绍语言句法中&#xff0c;最可能的单词填空在self-attention的表现形式&#xff0c;以及内部原理的介绍。 二、关于本文概述 在我之前的博客中&#xff0c;我们研究了关于生成式预训练 Transformer 的完整概述&#xff0c;关于生成式预训练 Transformer (GPT) 的…...

关于LwRB环形缓冲区开源库的纯C++版本支持原子操作

1、LwRB环形缓冲区开源库&#xff1a; GitHub - MaJerle/lwrb: Lightweight generic ring buffer manager libraryLightweight generic ring buffer manager library. Contribute to MaJerle/lwrb development by creating an account on GitHub.https://github.com/MaJerle/l…...

微信小程序Canvas画布绘制图片、文字、矩形、(椭)圆、直线

获取CanvasRenderingContext2D 对象 .js onReady() {const query = wx.createSelectorQuery()query.select(#myCanvas).fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext(2d)canvas.width = res[0].width * d…...

Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应

目录 需求描述上代码打个赏吧 需求描述 现在有这样一个需求&#xff1a; 在Hierarchy面板的对象上绘制按钮点击按钮&#xff0c;弹出菜单再点击菜单项目响应自定义操作在这里的响应主要是复制对象层级路路径 看具体效果请看动图&#xff1a; 注&#xff1a; 核心是对Edito…...

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的&#xff0c;这是由于视频编码方式的问题。解决办法&#xff1a; 首先安装 ffmeg 编码工具&#xff1a; sudo apt-get install ffmpeg 然后改变视频的…...

一键与图片对话!LLM实现图片关键信息提取与交互

本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁&#xff0c;主要介绍了如何通过小模型与大模型的结合&#xff0c;解决数据分析中的问题。 项目背景 在智能涌现的大模型时代&#xff0c;越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率&#xff0c;助力业务智…...

洛谷 P8833 [传智杯 #3 决赛] 课程 讲解

前言&#xff1a; 大家好&#xff01; 我们又见面啦~~~ 对于我20多天没上号&#xff0c;深表歉意&#xff01;&#xff01; 希望大家给我的account点一个赞&#xff0c;加一个粉丝&#xff0c;谢谢&#xff01; 也对CSDN的所有博主们送上衷心的祝福&#xff01; 如有错误…...

中国IT产经新闻:新能源汽车发展前景与燃油车的利弊之争

随着科技的进步和环保意识的提高&#xff0c;新能源汽车在全球范围内逐渐受到重视。然而&#xff0c;在新能源汽车迅速发展的同时&#xff0c;燃油车仍然占据着主导地位。本文将从新能源与燃油车的利弊、新能源汽车的发展前景两个方面进行分析&#xff0c;以期为读者提供全面的…...

一、数据结构

一、 数组 1.1 数组 定义 遍历 // 遍历数组 传递指针 func traverse() {var b [...]int{1, 2, 3} //长度为3 元素为 1 2 3var ptr &b //ptr是指向数组的指针fmt.Println(b[0], b[1]) // 打印数组的前 2 个元素fmt.Println(ptr[0], ptr[1]) // 通…...

案例分享:各行业销售岗位的KPI指标制定分享

在当今竞争激烈的市场环境中&#xff0c;销售岗位的绩效考核至关重要。有效的绩效考核能帮助企业了解销售人员的业绩&#xff0c;激励他们提高效率&#xff0c;并确保销售战略的实现。关键绩效指标&#xff08;KPI&#xff09;作为绩效考核的核心&#xff0c;能精炼地反映销售人…...

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求&#xff1a; 制作一个EXCEL模板&#xff0c;每个班级的班主任统计 班级图书量&#xff08;一个孩子10本&#xff0c;最多35个孩子350本&#xff09; EXCEL模板 1.0版本&#xff1a; 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...