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

SpringCloud - Gateway 网关

前言

该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用
学习视频:7小快速通关SpringCloud
辅助文档:SpringCloud快速通关
源码地址:cloud-demo

一、简介

官网:https://spring.io/projects/spring-cloud-gateway

Spring Cloud Gateway 是基于 Spring 生态系统(包括 Spring 6、Spring Boot 3 和 Project Reactor)构建的 API 网关。它旨在为 API 提供简单而有效的路由,并处理诸如安全性、监控/指标和弹性等跨领域关注点。
在这里插入图片描述

1.1 主要特性

  • 构建于 Spring Framework 和 Spring Boot 之上: 利用 Spring 强大的生态系统,确保与其他 Spring 项目的无缝集成。
  • 灵活的路由匹配: 能够基于任何请求属性(如路径、主机、方法等)定义路由规则。
  • 丰富的谓词和过滤器: 为每个路由提供特定的谓词和过滤器,方便实现复杂的路由逻辑和请求/响应的修改。
  • 断路器集成: 与 Hystrix 等断路器库集成,增强系统的弹性和容错能力。
  • 服务发现集成: 与 Spring Cloud DiscoveryClient 集成,实现动态路由和负载均衡。
  • 请求速率限制: 提供请求速率限制功能,保护后端服务免受流量突增的影响。
  • 路径重写: 支持对请求路径进行重写,满足不同的路由需求。

1.2 主要功能

在这里插入图片描述

1.3 版本选择

Spring Cloud Gateway 的两个版本主要区别在于它们的编程模型和适用场景:

  • Reactive Server(响应式版本)
    • 基于 WebFlux 框架,使用响应式编程模型。
    • 支持完全非阻塞的 I/O 操作,可以提高吞吐量和降低延迟。
    • 适用于构建高性能、高并发的微服务架构。
    • 与现代的响应式编程库(如 Reactor)兼容。
  • Server MVC(传统阻塞式版本)
    • 基于 Spring MVC 框架,使用传统的同步阻塞 I/O 模型。
    • 更适合与现有的 Spring MVC 应用程序集成。
    • 可能在高并发场景下的性能不如响应式版本。

推荐使用响应式Gateway
在这里插入图片描述

二、快速入门

2.1 需求

  1. 客户端发送 /api/order/** 转到 service-order
  2. 客户端发送 /api/product/** 转到 service-product
  3. 以上转发有负载均衡效果
    在这里插入图片描述

2.2 创建模块

创建gateway模块,引入 spring-cloud-starter-gatewayspring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-loadbalancer

 <!-- gateway网关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--loadbalancer负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

添加主程序GatewayMainApplication

@SpringBootApplication
public class GatewayMainApplication {public static void main(String[] args) {SpringApplication.run(GatewayMainApplication.class, args);}
}

添加配置文件application.yml

# 服务端口
server:port: 80spring:application:name: gateway # 服务名称cloud:nacos:server-addr: 127.0.0.1:8848 # nacos地址(默认)

这里可以启动微服务gatewayservice-orderservice-product,确保在Nacos控制台可以看到
在这里插入图片描述

2.3 改造微服务

创建 application-route.yml,为 service-orderservice-prduct 添加 /api基础路径

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates: # 路径断言规则- Path=/api/order/** # 路径匹配- id: product-routeuri: lb://service-productpredicates:- Path=/api/product/**

并且需要在application.yml中启用 application-route.yml才能生效

spring:profiles:include: route # 启用route

2.4 测试

在浏览器中输入http://localhost/api/order/readDb,通过网关访问 service-order微服务的接口
在这里插入图片描述

2.5 基础原理

  1. 请求处理
    • 用户请求首先到达 Gateway
  2. 路由规则(Route)
    • 网关根据预定义的路由规则(Route)来决定请求的转发路径。
    • 每个路由规则包含三个主要部分:
      • Predicate 断言:用于匹配请求的条件,如路径、头信息、查询参数等。
      • URI 目的地:匹配请求后,请求将被转发到的目标地址。
      • Filter 过滤器:在请求转发前后执行的一系列过滤器链,用于修改请求/响应、进行认证等。
  3. 过滤器链(Filter Chain)
    • 请求在转发到目的地之前,会先经过一系列过滤器(Filter)的处理。
    • 过滤器可以执行各种任务,如日志记录、请求修改、认证授权等。
    • 过滤器按照定义的顺序执行,形成一个过滤器链。
  4. 转发请求
    • 经过过滤器链处理后,请求被转发到最终的目的地(服务提供者)。
  5. 响应处理
    • 目的地处理完请求后,将响应返回给网关。
    • 响应同样会经过过滤器链的处理,然后返回给用户。

在这里插入图片描述

三、Predicate - 断言

3.1 断言写法

3.1.1 短写法

快捷方式配置由过滤器名称识别,后跟等号 (=),后跟用逗号 () 分隔的参数值。

# 断言短写法
spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates: # 路径断言规则- Path=/api/order/** # 路径匹配

3.1.2 全写法

完全展开的参数看起来更像是带有名称/值对的标准 yaml 配置。通常,将有一个 name 键和一个 args 键。args 键是用于配置谓词或筛选条件的键值对的映射。

# 断言全写法
spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates:- name: Path # 路径断言args: # 参数pattern: /api/order/**  # 匹配路径matchTrailingSlash: true # 匹配尾部斜杠

3.2 断言工厂

在这里插入图片描述
在这里插入图片描述

3.3 自定义断言工厂

创建XxxRoutePredicateFactory继承AbstractRoutePredicateFactory

/*** Vip断言工厂*/
@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory<VipRoutePredicateFactory.Config> {public VipRoutePredicateFactory() {super(Config.class);}// 配置参数的顺序,为短写法准备@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("param", "value");}// 断言逻辑@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {// localhost/search?q=haha&user=jyhString first = serverWebExchange.getRequest().getQueryParams().getFirst(config.param);return StringUtils.hasText(first) && first.equals(config.value);}};}/*** 可以配置的参数*/@Validatedpublic static class Config {@NotEmptyprivate String param;@NotEmptyprivate String value;public @NotEmpty String getParam() {return param;}public void setParam(@NotEmpty String param) {this.param = param;}public @NotEmpty String getValue() {return value;}public void setValue(@NotEmpty String value) {this.value = value;}}
}

编写配置文件

spring:cloud:gateway:routes:- id: bing-routeuri: https://cn.bing.com/ # 跳转地址predicates:- name: Path # 路径断言args:patterns: /search- name: Query # 查询参数断言args:param: q #  参数名regexp: haha  # 正则表达式
#            - Vip=user,jyh- name: Vip # 自定义Vip断言args:param: uservalue: jyh

四、Filter - 过滤器

在这里插入图片描述
在这里插入图片描述

4.1 路由重写 - RewritePath

在这里插入图片描述

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates:- name: Path # 路径断言args: # 参数pattern: /api/order/**  # 匹配路径matchTrailingSlash: true # 匹配尾部斜杠filters:- RewritePath=/api/order/?(?<segment>.*), /$\{segment} # 重写路径

RewritePath=/api/order/?(?<segment>.*), /$\{segment}这个规则的意思是:
如果请求路径以 /api/order/ 开头,且后面有任意内容(如 /api/order/123),则会将路径重写为 /123 ,即删除 /api/order/ 部分,只保留后面的内容。

4.2 添加响应请求头 - AddResponseHeader

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates:- name: Path # 路径断言args: # 参数pattern: /api/order/**  # 匹配路径matchTrailingSlash: true # 匹配尾部斜杠filters:- AddResponseHeader=X-Response-Abc, 123 # 添加响应请求头

在这里插入图片描述

4.3 默认filter - Default Filters

所有路由规则都生效默认filter里面配置的规则

spring:cloud:gateway:routes:- id: order-routeuri: lb://service-order  # lb(LoadBalance)代表负载均衡predicates:- name: Path # 路径断言args: # 参数pattern: /api/order/**  # 匹配路径matchTrailingSlash: true # 匹配尾部斜杠filters:- RewritePath=/api/order/?(?<segment>.*), /$\{segment} # 重写路径- id: product-routeuri: lb://service-productpredicates:- Path=/api/product/**filters:- RewritePath=/api/product/?(?<segment>.*), /$\{segment} # 重写路径default-filters: # 默认过滤器- AddResponseHeader=X-Response-Abc, 123 # 添加响应头

4.4 全局filter - Global Filters

/*** 全局过滤器 - 耗时统计* @author jiangyiheng*/
@Slf4j
@Component
public class RtGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String uri = exchange.getRequest().getURI().toString();long start = System.currentTimeMillis();log.info("请求开始【{}】开始时间:{}", uri, start);// ======================以上是前置逻辑======================Mono<Void> filter = chain.filter(exchange).doFinally((result)->{// ======================以下是后置逻辑======================long end = System.currentTimeMillis();log.info("请求结束【{}】结束时间:{} ,耗时:{}ms", uri, end, end - start);}); // 放行return filter;}// 优先级@Overridepublic int getOrder() {return 0;}
}

在这里插入图片描述

4.5 自定义过滤器

创建一个XxxGatewayFilterFactory类继承AbstractNameValueGatewayFilterFactory工厂

/*** 自定义过滤器-令牌网关过滤器*/
@Component
public class OneTokenGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {@Overridepublic GatewayFilter apply(NameValueConfig config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 每次响应前,添加一个一次性令牌,支持 uuid,jwt等各种格式return chain.filter(exchange).then(Mono.fromRunnable(()->{ServerHttpResponse response = exchange.getResponse();String value = config.getValue();if ("uuid".equalsIgnoreCase(value)) {value = UUID.randomUUID().toString();}if ("jwt".equalsIgnoreCase(value)) {value = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";}response.getHeaders().add(config.getName(), value);}));}};}
}

在这里插入图片描述

五、CORS - 跨域处理

5.1 全局跨域

spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowed-origin-patterns: '*' # 允许所有跨域allowed-methods: '*' # 允许所有请求方式allowed-headers: '*' # 允许所有头

5.2 局部跨域

spring:cloud:gateway:routes:- id: cors_routeuri: https://example.orgpredicates:- Path=/service/**metadata:cors:allowedOrigins: '*'allowedMethods:- GET- POSTallowedHeaders: '*'maxAge: 30

面试题:微服务之间的调用经过网关吗?
在这里插入图片描述
微服务之间的调用一般不会经过网关。网关主要用于处理外部请求,负责路由、认证、限流等功能。而微服务之间的通信通常通过服务发现负载均衡直接进行,不需要经过网关。然而,在某些特殊情况下,如果需要统一管理或控制,微服务之间的调用也可能通过网关。

相关文章:

SpringCloud - Gateway 网关

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://spring.io/projects/spring-clou…...

【如何掌握CSP-J 信奥赛中的排序算法】

要掌握CSP-J信奥赛中的排序算法&#xff0c;需要系统学习基础排序算法的原理、实现和应用场景。以下是分阶段的学习路径和建议&#xff1a; 一、必掌握的排序算法清单 CSP-J阶段需重点掌握以下算法&#xff08;按考察频率排序&#xff09;&#xff1a; 冒泡排序&#xff08;B…...

3. CSS中@scope

说说你对 CSS 中scope 的了解 <style>/* scope规则 */scope (#app) {.box {width: 100px;height: 100px;background-color: red;}} </style> <div id"app"><div class"box"></div> </div>CSS 中的scope 是一个相对较新…...

基于雷达和摄像头的无人机轨迹识别与激光照射控制研究

标题:基于雷达和摄像头的无人机轨迹识别与激光照射控制研究 内容:1.摘要 摘要&#xff1a;本文研究了基于雷达和摄像头的无人机轨迹识别与激光照射控制。通过对雷达和摄像头数据的融合处理&#xff0c;实现了对无人机轨迹的精确识别。同时&#xff0c;利用激光照射技术对无人机…...

Response 和 Request 介绍

怀旧网个人博客网站地址&#xff1a;怀旧网&#xff0c;博客详情&#xff1a;Response 和 Request 介绍 1、HttpServletResponse 1、简单分类 2、文件下载 通过Response下载文件数据 放一个文件到resources目录 编写下载文件Servlet文件 public class FileDownServlet exten…...

读 DeepSeek-R1 论文笔记

DeepSeek-R1&#xff1a;通过强化学习激发大语言模型的推理能力 DeepSeek-AI 摘要 我们推出第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero作为无需监督微调(SFT)预训练阶段、直接通过大规模强化学习(RL)训练的基础模型&#xff0c;展现出卓越的推理能力。…...

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和 文章目录 一、dp1.1 题意理解1.2 整体思路1.3 具体思路1.4 代码 二、多语言解法 一、dp 1.1 题意理解 nums 数组, 有正负0, 使用最多两次魔法卷轴, 希望使数组整体的累加和尽可能大. 求尽可能大的累加和 其实就…...

蓝桥杯C语言组:分治问题研究

蓝桥杯C语言组分治问题研究 摘要 本文针对蓝桥杯C语言组中的分治问题展开深入研究&#xff0c;详细介绍了分治算法的原理、实现方法及其在解决复杂问题中的应用。通过对经典例题的分析与代码实现&#xff0c;展示了分治算法在提高编程效率和解决实际问题中的重要作用&#xff…...

npm介绍(Node Package Manager)(JavaScript生态中最流行的包管理工具,主要用于Node.js项目的依赖管理)

文章目录 **核心功能****常用命令****关键文件****npm vs 其他工具****最佳实践**官方资源 npm&#xff08;Node Package Manager&#xff09;是 JavaScript 生态中最流行的包管理工具&#xff0c;主要用于 Node.js 项目的依赖管理。以下是核心要点&#xff1a; 核心功能 依赖管…...

小白零基础如何搭建CNN

1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同&#xff0c;如有1维卷积、2维卷积、 3维卷积与转置卷积&#xff08;可以简单理解为卷积操作的逆操作&#xff09;&#xff0c;但它们的使用方法比较相似&#xff0c;都可以从torch.nn模块中调用&#xff0c;需要调用的…...

【分布式架构理论3】分布式调用(1):负载均衡

文章目录 零、三种不同的负载均衡一、常见行业负载均衡方案1. 电商与互联网服务2. 金融与支付系统3. 云计算与分布式存储 二、负载均衡策略概述1. 无状态负载均衡&#xff08;强调公平性&#xff09;2. 有状态的负载均衡&#xff08;强调正确性&#xff09; 三、 总结 零、三种…...

QT 5.15.2 开发地图ArcGIS 100.15.6(ArcGIS Runtime SDK for Qt)

QT 5.15.2ArcGIS下载 Downloads | ArcGIS Runtime API for Qt | Esri Developer ArcGIS安装&#xff08;略&#xff09;参考 Display a map | ArcGIS Maps SDK for Qt | Esri Developer QT新建工程 步骤1 步骤2 步骤3 步骤4&#xff08;选择Topographic不需要KEY) 步骤5&a…...

细读 React | React Router 路由切换原理

2022 北京冬奥会开幕式 此前一直在疑惑&#xff0c;明明 pushState()、replaceState() 不触发 popstate 事件&#xff0c;可为什么 React Router 还能挂载对应路由的组件呢&#xff1f; 翻了一下 history.js 源码&#xff0c;终于知道原因了。 源码 假设项目路由设计如下&#…...

kubernetes学习-Helm 包管理器(十二)

一、Helm解释 Helm&#xff1a;Kubernetes 的软件包管理器 Helm 被誉为查找、分享及使用 Kubernetes 软件组件的最佳途径。作为 Kubernetes 包的管理工具&#xff0c;Helm 专注于管理名为 chart 的软件包。以下是 Helm 所具备的核心功能&#xff1a; 创建新 chart&#xff1…...

PbootCMS最新代码注入漏洞(CNVD-2025-01710、CVE-2024-12789)

PbootCMS是一套高效、简洁、 强悍的可免费商用的CMS源码&#xff0c;使用PHPMySQL开发&#xff0c;能够满足各类企业网站开发建设的需要。 国家信息安全漏洞共享平台于2025-01-14公布该程序存在代码注入漏洞。 漏洞编号&#xff1a;CNVD-2025-01710、CVE-2024-12789 影响产品…...

网络安全与AI:数字经济发展双引擎

在2025年年初&#xff0c;一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火&#xff0c;伴随着大规模的网络攻击事件&#xff0c;将网络安全的重要性推上了风口浪尖。 在此背景下&#xff0c;我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…...

【DeepSeek × Postman】请求回复

新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test&#xff0c;并创建一个关联的测试环境 DeepSeek API Env&#xff0c;同时定义两个变量 base_url 和 api_key 的步骤如下&#xff1a; 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…...

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...

【unity实战】实现摄像机跟随效果

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

使用 AlexNet 实现图片分类 | PyTorch 深度学习实战

前一篇文章&#xff0c;CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 使用 AlexNet 实现图片分类…...

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制&#xff0c;用于定义对象的基本操作&#xff08;如读取、赋值、删除等&#xff09;的自定义行为。相较于 Object.defineProperty&#xff0c;Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...

初次体验Tauri和Sycamore (2)

原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年2月8日&#xff08;首次发布时间&#xff09; 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/145520637 版权所有&#xff0c;转载请注明出处。 关键词&#xff1a;Sy…...

Qt - 地图相关 —— 2、Qt调用百度在线地图功能示例全集,包含线路规划、地铁线路查询等(附源码)

效果:由于录制软件导致exe显示不正常,实际运行没有任何问题。 作者其他相关文章链接:           Qt - 地图相关 —— 1、加载百度在线地图(附源码)...

ffmpeg基本用法

一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明&#xff1a; global options&#xff1a;全局选项&#xff0c;应用于整个 FFmpeg 进程&#xff0c;它们通常不受输入或输出部分的限制。 infile options&#xff1a;输入选…...

redis底层数据结构——链表

文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力&#xff0c;以及顺序性的节点访间方式&#xff0c;并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构&#xff0c;链表内置在很多高级的编程语言里面&#xff0c;因为Redis使用的C语言并没有…...

Repo命令使用

repo 命令与 git 类似&#xff0c;但它主要用于管理多个 Git 仓库的操作。以下是等效的 repo 命令&#xff1a; 1. 获取新仓库代码 克隆仓库 repo init -u <manifest_url> -b <branch_name> repo sync repo init&#xff1a;初始化 repo&#xff0c;指定远程清单…...

React 高级教程

使用 React 高级组件(HOC)实现的完整项目示例,包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构: src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- Header.jsx | |-- LoginForm.jsx | |-- U…...

Linux: ASoC 声卡硬件参数的设置过程简析

文章目录 1. 前言2. ASoC 声卡设备硬件参数2.1 将 DAI、Machine 平台的硬件参数添加到声卡2.2 打开 PCM 流时将声卡硬件参数配置到 PCM 流2.3 应用程序对 PCM 流参数进行修改调整 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&am…...

网络基础知识与配置

目录 网络基础知识 &#xff08;一&#xff09;网络的概念 &#xff08;二&#xff09;网络协议 &#xff08;三&#xff09;网络拓扑结构 &#xff08;四&#xff09;IP地址和子网掩码 显示和配置网络接口 &#xff08;一&#xff09;在Windows系统中 &#xff08;二&a…...

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信…...

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…...

用语言模型探索语音风格空间:无需情感标签的情 感TTS

用语言模型探索语音风格空间&#xff1a;无需情感标签的情感TTS 原文&#xff1a;Exploring speech style spaces with language models: Emotional TTS without emotion labels 今天我们要说的是 一种无需情感标签的情感TTS。提出了一个基于FastSpeech2的E-TTS框架&#xff0…...

将Excel中的图片保存下载并导出

目录 效果演示 注意事项 核心代码 有需要将excel中的图片解析出来保存到本地的小伙子们看过来&#xff01;&#xff01;&#xff01; 效果演示 注意事项 仅支持xlsx格式&#xff1a;此方法适用于Office 2007及以上版本的.xlsx文件&#xff0c;旧版.xls格式无法使用。 图片名…...

2.11日学习总结

题目一 &#xff1a; AC代码 #include <stdio.h> #include <stdlib.h>// 定义长整型 typedef long long ll;// 定义求最大值和最小值的宏函数 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))// 定义数组和变量 ll…...

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…...

【腾讯地图】录入经纬度功能 - 支持地图选点

目录 效果展示代码引入地图服务地址弹框中输入框 - 支持手动输入经纬度/地图选点按钮地图选点弹框组件 当前文章 - 地图功能与 https://blog.csdn.net/m0_53562074/article/details/143677335 功能类似 效果展示 代码 引入地图服务地址 public/index.html <!-- 互联网地图…...

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …...

RK3568平台开发系列讲解(调试篇)网卡队列均衡负载

🚀返回专栏总目录 文章目录 一、RPS 的介绍1. RPS 的工作原理2. RPS 配置3. 启用和调优 RPS4. RPS 优势二、下行测试iperf测试沉淀、分享、成长,让自己和他人都能有所收获!😄 RPS(Receive Packet Steering) 是一种用于提高网络接收性能的技术,通常用于多核处理器系统中…...

Matlab机械手碰撞检测应用

本文包含三个部分&#xff1a; Matlab碰撞检测的实现URDF文件的制作机械手STL文件添加夹爪 一.Matlab碰撞检测的实现 首先上代码 %% 检测在结构环境中机器人是否与物体之间发生碰撞情况&#xff0c;如何避免&#xff1f; % https://www.mathworks.com/help/robotics/ug/che…...

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…...

服务器有多少线程?发起一个请求调用第三方服务,是新增加一个请求吗?如果服务器线程使用完了怎么办?

目录 1. 服务器有多少线程? (1)服务器类型 (2)配置参数 (3)硬件资源 2. 发起一个请求调用第三方服务,是新增加一个线程吗? (1)同步调用 (2)异步调用 (3)HTTP 客户端 3. 如果服务器线程使用完了怎么办? (1)请求被拒绝 (2)性能下降 (3)解决方案…...

【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现一

整理不易&#xff0c;请不要吝啬你的赞和收藏。 1. 前言 这是 SpringAI 系列的第二篇文章&#xff0c;这篇文章将介绍如何基于 RAG 技术&#xff0c;使用 SpringAI Vue3 ElementPlus 实现一个 Q&A 系统。本文使用 deepseek 的 DeepSeek-V3 作为聊天模型&#xff0c;使用…...

前端快速生成接口方法

大家好&#xff0c;我是苏麟&#xff0c;今天聊一下OpenApi。 官网 &#xff1a; umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录&#xff08;项目目录下&#xff09;创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…...

【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)

**View和**Widget的区别&#xff1f; **View的实现更底层&#xff0c;**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式&#xff0c;软件设计模式。 M&#xff08;model&#xff09;模型。管理应用程序的核心数据和…...

java 读取sq3所有表数据到objectNode

1.实现效果&#xff1a;将sq3中所有表的所有字段读到objectNode 对象中&#xff0c;兼容后期表字段增删情况&#xff0c;数据组织形式如下图所示&#xff1a; 代码截图&#xff1a; 代码如下&#xff1a; package com.xxx.check.util;import java.sql.*; import java.util.Arr…...

react redux用法学习

参考资料&#xff1a; https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具&#xff1a;deepseek&#xff0c;通义灵码 第一天 安装相关依赖&#xff1a; 使用redux的中间件&#xff1a; npm i react-redu…...

C++20中的std::atomic_ref

一、std::atomic_ref 我们在学习C11后的原子操作时&#xff0c;都需要提前定义好std::atomic变量&#xff0c;然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显&#xff0c;所以这也使得很多开发者越来习惯使用原子变量。 但是&#xff0c;在实…...

encodeURI(),encodeURIComponent()区别

encodeURI()&#xff0c;encodeURIComponent()区别 encodeURI(): 对整个url(链接/网络链接)进行编码。 对中文&#xff0c;完全编码。 对英文不带空格则不会编码&#xff0c;带空格则会对空格编码。 解码&#xff1a;decodeURI() 例如&#xff1a; let ChineseUrl "htt…...

Selenium:网页frame与多窗口处理

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、多窗口处理 1.1、多窗口简介 点击某些链接&#xff0c;会重新打开⼀个窗⼜&#xff0c;对于这种情况&#xff0c;想在新页⾯上操作&#xff0c;就 得先切换窗…...