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

spring cloud gateway 断言(Predicates)与过滤器(filters)

断言

在 Spring Cloud Gateway 中,内置的断言(Predicates)用于对请求进行条件匹配。Spring Cloud Gateway 提供了多种内置断言,可以根据请求的路径、头部、方法等条件来决定是否将请求路由到特定的处理器。

内置断言
  1. 基于路径 (Path)

匹配请求路径是否符合指定的 Ant 风格的模式。支持简单路径匹配和正则表达式匹配。

spring:cloud:gateway:routes:- id: user-serviceuri: http://localhost:8081predicates:- Path=/users/** # 匹配所有以 /users/ 开头的路径- Path=/items/{id} # 匹配 /items/ 后面跟一个路径段- Path=/products/{category}/{id} # 匹配更复杂的路径结构
  1. 基于 HTTP 方法 (Method)

匹配请求的 HTTP 方法(GET、POST、PUT、DELETE 等)。

spring:cloud:gateway:routes:- id: product-read-serviceuri: http://localhost:8082predicates:- Path=/products/**- Method=GET      # 只匹配 GET 请求- id: product-write-serviceuri: http://localhost:8083predicates:- Path=/products/**- Method=POST,PUT,DELETE # 匹配 POST、PUT 或 DELETE 请求
  1. 基于请求头 (Header)

匹配请求头是否包含指定的名称和值(支持正则表达式)。

spring:cloud:gateway:routes:- id: mobile-app-serviceuri: http://localhost:8084predicates:- Path=/mobile/**- Header=X-Client-Type, mobile # 匹配包含 X-Client-Type: mobile 的请求- id: web-app-serviceuri: http://localhost:8085predicates:- Path=/web/**- Header=X-Client-Type, web|desktop # 匹配 X-Client-Type: web 或 X-Client-Type: desktop 的请求- Header=X-Version, \d+\.\d+.\d+ # 使用正则表达式匹配版本号
  1. 基于查询参数 (Query)

匹配请求是否包含指定的查询参数名称和值(支持正则表达式)。

spring:cloud:gateway:routes:- id: item-detail-serviceuri: http://localhost:8086predicates:- Path=/items/{id}- Query=showDetails # 匹配包含 showDetails 查询参数的请求 (值可以是任意的)- id: item-filter-serviceuri: http://localhost:8087predicates:- Path=/items- Query=category, electronics # 匹配包含 category=electronics 的查询参数- Query=price, \d+(\.\d+)? # 使用正则表达式匹配价格参数
  1. 基于 Host (Host)

匹配请求的 Host 请求头。

spring:cloud:gateway:routes:- id: admin-serviceuri: http://localhost:8088predicates:- Host=admin.example.com # 匹配 Host: admin.example.com- id: api-serviceuri: http://localhost:8089predicates:- Host=*.example.com # 匹配所有以 .example.com 结尾的 Host
  1. 基于 Cookie (Cookie)
  • 配请求是否包含指定的 Cookie 名称和值(支持正则表达式)。

    spring:
    cloud:
    gateway:
    routes:
    - id: premium-service
    uri: http://localhost:8090
    predicates:
    - Path=/premium/**
    - Cookie=userType, premium # 匹配包含 userType=premium 的 Cookie
    - Cookie=sessionId, [a-zA-Z0-9]+ # 使用正则表达式匹配 sessionId

  1. 基于日期时间 (Before, After, Between)

根据请求的时间进行匹配。

spring:cloud:gateway:routes:- id: promotion-serviceuri: http://localhost:8091predicates:- Path=/promotions/**- After=2025-05-07T00:00:00+09:00[Asia/Tokyo] # 在指定时间之后生效- id: maintenance-serviceuri: http://localhost:8092predicates:- Path=/maintenance/**- Before=2025-05-08T00:00:00+09:00[Asia/Tokyo] # 在指定时间之前生效- id: limited-offer-serviceuri: http://localhost:8093predicates:- Path=/offers/**- Between=2025-05-09T09:00:00+09:00[Asia/Tokyo], 2025-05-09T17:00:00+09:00[Asia/Tokyo] # 在指定时间段内生效
  1. 基于 Remote Address (RemoteAddr)

匹配请求的来源 IP 地址或 IP 地址范围。

spring:cloud:gateway:routes:- id: internal-serviceuri: http://localhost:8094predicates:- Path=/internal/**- RemoteAddr=192.168.1.10 # 匹配来自特定 IP 地址的请求- RemoteAddr=192.168.1.0/24 # 匹配来自指定 IP 地址段的请求
  1. 基于权重 (Weight)

用于实现流量分配,它使你能够在多个后端服务之间根据权重来路由请求。主要用于 A/B 测试、灰度发布、流量切分等场景,可以控制不同服务的流量分配比例。

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

权重配置由两个参数group和weight,weight按组进行计算。上面配置80% 流量转发到 weighthigh.org and ~20% 转发到 weighlow.org

组合断言

可以将多个断言组合在一起,创建更复杂的路由匹配规则。Spring Cloud Gateway 提供了逻辑运算符来进行组合:

  • and(与操作):所有条件都满足时才匹配。
  • or(或操作):只要有一个条件满足即可匹配。
    predicates:
    - Path=/get
    - (Method=GET || Method=POST)
源码阅读

在spring-cloud-gateway-server-3.1.8.jar包META-INF/spring.factories配置文件会加载GatewayAutoConfiguration自动装配类。所有的断言工厂处理类(RoutePredicateFactory)都在该配置bean中初始化,作为一个bean加载到spring容器中。
在这里插入图片描述

每个断言工厂都实现了RoutePredicateFactory接口,

配置文件中的routes会被解析到GatewayProperties配置文件中。最后封装到RouteDefinition中。

GatewayAutoConfiguration还会自动装配RouteLocator

	@Beanpublic RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,List<GatewayFilterFactory> gatewayFilters, List<RoutePredicateFactory> predicates,RouteDefinitionLocator routeDefinitionLocator, ConfigurationService configurationService) {return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates, gatewayFilters, properties,configurationService);}

将配置文件和对应的断言工厂进行关联。

RouteDefinitionRouteLocator#initFactories()

	private void initFactories(List<RoutePredicateFactory> predicates) {predicates.forEach(factory -> {String key = factory.name();if (this.predicates.containsKey(key)) {this.logger.warn("A RoutePredicateFactory named " + key + " already exists, class: "+ this.predicates.get(key) + ". It will be overwritten.");}//放入hashmap中this.predicates.put(key, factory);if (logger.isInfoEnabled()) {logger.info("Loaded RoutePredicateFactory [" + key + "]");}});}

factory.name()是RoutePredicateFactory接口中默认实现

default String name() {return NameUtils.normalizeRoutePredicateName(getClass());
}

NameUtils#normalizeRoutePredicateName()

public static String normalizeRoutePredicateName(Class<? extends RoutePredicateFactory> clazz) {return removeGarbage(clazz.getSimpleName().replace(RoutePredicateFactory.class.getSimpleName(), ""));}

clazz.getSimpleName() 拿到当前断言工厂的类名,如PathRoutePredicateFactory就是当前类名,然后替换掉RoutePredicateFactory就变成了Path。这就和配置文件中的断言配置对应上了。最后所有的内置断言类如下:
在这里插入图片描述

处理后放到map中:

在这里插入图片描述

GatewayAutoConfiguration还会自动装配一个RouteRefreshListener

@Bean@ConditionalOnClass(name = "org.springframework.cloud.client.discovery.event.HeartbeatMonitor")public RouteRefreshListener routeRefreshListener(ApplicationEventPublisher publisher) {return new RouteRefreshListener(publisher);}

RouteRefreshListener spring容器发布refresh事件时会调用该listener的onApplicationEvent()方法,判断是否进行reset()来发布RefreshRoutesEvent事件。CachingRouteLocator是用来处理RefreshRoutesEvent事件。

当有请求到达时,会通过RoutePredicateHandlerMapping.getHandlerInternal()方法进行路由匹配,实际在lookupRoute()方法进行逐个路由匹配

RoutePredicateHandlerMapping#lookupRoute()

protected Mono<Route> lookupRoute(ServerWebExchange exchange) {//拿出所有的路由return this.routeLocator.getRoutes()// individually filter routes so that filterWhen error delaying is not a// problem.concatMap(route -> Mono.just(route).filterWhen(r -> {// add the current route we are testingexchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId());//调用每个PredicateFactory的apply方法进行路由匹配return r.getPredicate().apply(exchange);})// instead of immediately stopping main flux due to error, log and// swallow it.doOnError(e -> logger.error("Error applying predicate for route: " + route.getId(), e)).onErrorResume(e -> Mono.empty())).next().map(route -> {validateRoute(route, exchange);return route;});}

过滤器

网关过滤器允许请求被路由到后端服务之前或之后对请求和响应进行修改和处理。过滤器可以执行各种任务,例如添加/修改请求头和响应头、记录日志、进行身份验证和授权、限流、熔断、URL 重写等等。路由过滤器是针对单个路由进行配置的,只对匹配该路由的请求生效。在配置文件中配置在具体某个路由节点的下面。还有一种是全局过滤器(GlobalFilter )对所有的路由生效。spring cloud gateway内置了很多过滤器。

1、请求响应头修改类

添加请求和响应头

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestHeader=X-Request-ID, ${random.uuid()}- AddResponseHeader=X-Response-By, Gateway

删除header

filters:- RemoveRequestHeader=Cookie- RemoveResponseHeader=X-Response-Foo

2、路径处理类

PrefixPath: 在请求路径前添加指定的前缀。

filters:- PrefixPath=/backend

对当前路由所有匹配的请求添加/backend前缀,如/hello 会向后转发/backend/hello

StripPrefix: 从请求路径中剥离指定数量的前缀。

      routes:- id: nameRooturi: https://nameservicepredicates:- Path=/name/**filters:- StripPrefix=2

StripPrefix 过滤器采用一個数量参数。指示在向下游发送請求之前要從路徑中剥离的部分數量。

如上面的配置,原始请求 /name/one/two 会转到 https://nameservice/two 。会舍弃请求路径前两个部分。

RewritePath: 使用正则表达式重写请求路径。

filters:- RewritePath=/api/(?<segment>.*), /$\\{segment}

RedirectTo: 将请求重定向到另一个 URL。

filters:- RedirectTo=302, https://new.example.com/${segment}

还有一些RequestRateLimiter请求限流、Retry请求重试、MapRequestHeader请求头映射等等。这些过滤器和一些web 中间件像nginx功能类似。

全局过滤器

全局过滤器不针对特定的路由配置,而是会拦截并处理所有通过 Gateway 的 HTTP 请求和响应。这意味着无论请求匹配到哪个路由,全局过滤器都会被执行(除非有特殊的逻辑在过滤器内部进行排除)。全局过滤器可以进行鉴权、日志记录、跨域处理等公共处理。

Spring Cloud Gateway 提供了一些内置的全局过滤器(继承自 GlobalFilter),例如:

过滤器类 功能描述
NettyRoutingFilter 将请求路由到实际服务(核心路由逻辑)
NettyWriteResponseFilter 处理响应内容写回客户端
RouteToRequestUrlFilter 将路由转换为具体请求 URL
ForwardPathFilter 用于内部转发请求
GatewayMetricsFilter 记录路由指标数据,供监控使用

这些内置过滤器通过不同的 Order 值按顺序执行,控制整个网关生命周期的处理流程。

内置全局过滤器的初始化也是在GatewayAutoConfiguration自动装配中完成的,如RouteToRequestUrlFilter过滤器

	@Bean@ConditionalOnEnabledGlobalFilterpublic RouteToRequestUrlFilter routeToRequestUrlFilter() {return new RouteToRequestUrlFilter();}

@ConditionalOnEnabledGlobalFilter注解会根据配置文件的enable值进行条件装配。其基类是OnEnabledComponent。配置项前缀是"spring.cloud.gateway.“,后缀是”.enabled"。ConditionalOnEnabledGlobalFilter上又有条件注解@Conditional(OnEnabledGlobalFilter.class),会在前面前后缀基础上中间添加:“global-filter.”+全局过滤器类名去掉GlobalFilter后剩下类名驼峰转”-“连接。

那ForwardPathFilter的完整对应配置项就是:spring.cloud.gateway.global-filter.forward-path.enabled。

spring:cloud:gateway:global-filter:forward-path:enabled: true

自定义一个全局过滤器也很简单,实现GlobalFilter 接口。并可选实现 org.springframework.core.Ordered 接口指定执行顺序。将该类作为一个bean放到spring容器中即可。

过滤器的触发是在FilteringWebHandler类中完成,FilteringWebHandler也是一个自动装配的bean。

FilteringWebHandler#handle()

	public Mono<Void> handle(ServerWebExchange exchange) {Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);List<GatewayFilter> gatewayFilters = route.getFilters();//全局过滤器和路由过滤器合并,List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);combined.addAll(gatewayFilters);//按order进行排序AnnotationAwareOrderComparator.sort(combined);//构造过滤器链进行依次执行	return new DefaultGatewayFilterChain(combined).filter(exchange);}

相关文章:

spring cloud gateway 断言(Predicates)与过滤器(filters)

断言 在 Spring Cloud Gateway 中&#xff0c;内置的断言&#xff08;Predicates&#xff09;用于对请求进行条件匹配。Spring Cloud Gateway 提供了多种内置断言&#xff0c;可以根据请求的路径、头部、方法等条件来决定是否将请求路由到特定的处理器。 内置断言 基于路径 …...

MySQL-数据查询(多表连接JOIN)-04-(11-2)

学生表 学号 姓名 班级 课程编号 课程名称 是否结课 create table xs( xs_id int auto_increment primary key, xs_xm varchar(30), xs_bj varchar(30), xs_kcbh varchar(30), xs_kcmc varchar(30), xs_sfjk varchar(30) );insert xs values(1,张三,24大数据技术,1001,MYS…...

解决leetcode第3537题填充特殊网格

3537.填充特殊网格 难度&#xff1a;中等 问题描述&#xff1a; 给你一个非负整数N&#xff0c;表示一个x的网格。你需要用从0到-1的整数填充网格&#xff0c;使其成为一个特殊网格。一个网格当且仅当满足以下所有条件时&#xff0c;才能称之为特殊网格&#xff1a; 右上角…...

C++_MD5算法

文章目录 概要代码应用 概要 MD5算法在数据加密、一致性哈希、安全性验证等技术中有广泛的应用。 MD5算法的原理可简要的叙述为&#xff1a;MD5码以512位分组来处理输入的信息&#xff0c;且每一分组又被划分为16个32位子分组&#xff0c;经过了一系列的处理后&#xff0c;算法…...

深入理解C++ Lambda表达式:从基础到高级应用

在现代C编程中&#xff0c;Lambda表达式已经成为不可或缺的特性之一。自C11引入以来&#xff0c;Lambda极大地改变了我们编写函数对象和回调的方式&#xff0c;使代码更加简洁、表达力更强。本文将全面探讨C Lambda表达式的各个方面&#xff0c;从基础语法到高级应用场景&#…...

蓝桥杯 20. 倍数问题

倍数问题 原题目链接 题目描述 众所周知&#xff0c;小葱同学擅长计算&#xff0c;尤其擅长判断一个数是否是另一个数的倍数。但当面对多个数时&#xff0c;他就比较苦恼了。 现在小葱给了你 n 个数&#xff0c;希望你从中找出三个数&#xff0c;使得这三个数的 和是 K 的倍…...

2025最新出版 Microsoft Project由入门到精通(二)

目录 项目五部曲 第一步&#xff1a;先设置项目的信息和日历 项目的开始结束日期 项目的日历 默认日历改为全年无休&#xff08;除法定节假日&#xff09; 六天工作制/七天工作制设置方法 七天工作制的设置方法 全年无休工作制的设置方法 大小周交替日历设置方法&…...

从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析

在工业自动化、医疗辅助、灾难救援与太空探索等前沿领域&#xff0c;Kinova轻型机械臂凭借7自由度关节设计和出色负载能力脱颖而出。它能精准完成物体抓取、复杂装配和精细操作等任务。然而&#xff0c;实现人类操作者对Kinova机械臂的直观高效远程控制一直是技术难题。传统远程…...

【ABAP】定时任务DEBUG方法

事物码SM37 执行后&#xff0c;选中作业名&#xff0c;在输入框输入“JDBG”&#xff0c;进入调试模式&#xff08;提前在需要的调试的程序设置断点&#xff09;...

DDPM(Denoising Diffusion Probabilistic Models,去噪扩散概率模型)

简介 DDPM即去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Models&#xff09;&#xff0c;是一种生成式模型&#xff0c;在图像生成、视频生成等领域有广泛应用。以下是其详细介绍&#xff1a; 原理 DDPM的核心思想是通过在数据上逐步添加噪声来破坏数据…...

C26-冒泡排序法

一 算法步骤 外层循环:控制遍历轮数(共n-1轮,n为数组长度)内层循环:每轮比较相邻的元素,若顺序错误则交换,将当前一轮最大(最小)的元素移至末尾 二 实例 代码 #include <stdio.h> int main() {//数组及相关数据定义int arr[4]{12,4,78,23};int i;int j;int temp;int …...

CentOS 7.9 安装详解:手动分区完全指南

CentOS 7.9 安装详解&#xff1a;手动分区完全指南 为什么需要手动分区&#xff1f;CentOS 7.9 基本分区说明1. /boot/efi 分区2. /boot 分区3. swap 交换分区4. / (根) 分区 可选分区&#xff08;进阶设置&#xff09;5. /home 分区6. /var 分区7. /tmp 分区 分区方案建议标准…...

大模型系列(五)--- GPT3: Language Models are Few-Shot Learners

论文链接&#xff1a; Language Models are Few-Shot Learners 点评&#xff1a; GPT3把参数规模扩大到1750亿&#xff0c;且在少样本场景下性能优异。对于所有任务&#xff0c;GPT-3均未进行任何梯度更新或微调&#xff0c;仅通过纯文本交互形式接收任务描述和少量示例。然而&…...

BK精密电源操作软件 9130BA系列和手侧user manual

BK精密电源操作软件 9130BA系列和手侧user manual...

MATLAB的cvpartition函数用法

1. 函数作用 cvpartition 将数据集划分为训练集和测试集&#xff0c;支持多种交叉验证方法&#xff0c;包括&#xff1a; Hold-Out验证&#xff1a;单次划分&#xff08;如70%训练&#xff0c;30%测试&#xff09;K折交叉验证&#xff1a;数据分为K个子集&#xff0c;依次用其…...

含铜废水回收的好处体现

一、环境保护&#xff1a;减少污染&#xff0c;守护生态安全 降低重金属污染 含铜废水若直接排放&#xff0c;铜离子会通过食物链富集&#xff0c;对水生生物和人体造成毒性影响&#xff08;如肝肾损伤&#xff09;。回收处理可去除废水中90%以上的铜离子&#xff0c;显著降低…...

C++20新特新——02特性的补充

虽然上节我们介绍了不少关于协程的特点&#xff0c;但是大家可能对协程还是不是很了解&#xff0c;没关系&#xff0c;这里我们再对其进行补充&#xff0c;详细讲解一下&#xff1b; 一、协程函数与普通函数的区别 这里我们再回归到问题&#xff1a;普通函数和协程在这方面的…...

【c++】 我的世界

太久没更新小游戏了 给个赞和收藏吧&#xff0c;求求了 要游戏的请私聊我 #include <iostream> #include <vector>// 定义世界大小 const int WORLD_WIDTH 20; const int WORLD_HEIGHT 10;// 定义方块类型 enum BlockType {AIR,GRASS,DIRT,STONE };// 定义世界…...

Redis从入门到实战 - 高级篇(上)

一、分布式缓存 1. 单点Redis的问题 数据丢失问题&#xff1a;Redis是内存存储&#xff0c;服务重启可能会丢失数据 -> 实现Redis数据持久化 并发能力问题&#xff1a;单节点Redis并发能力虽然不错&#xff0c;但也无法满足如618这样的高并发场景 -> 搭建主从集群&…...

常见的卷积神经网络列举

经典的卷积神经网络&#xff08;CNN&#xff09;在深度学习发展史上具有重要地位&#xff0c;以下是一些里程碑式的模型及其核心贡献&#xff1a; 1. LeNet-5&#xff08;1998&#xff09; 提出者&#xff1a;Yann LeCun特点&#xff1a; 首个成功应用于手写数字识别&#xff…...

Linux如何安装AppImage程序

Linux如何安装AppImage程序 文章目录 Linux如何安装AppImage程序 在 Linux 中&#xff0c;.AppImage 是一种便携式的应用程序格式&#xff0c;无需安装即可运行。 1.赋予该文件可执行权限 可以使用下列命令&#xff0c;赋予可执行权限 # 举个例子 chmod x /path/to/MyApp.App…...

人工智能如何进行课堂管理?

人工智能如何协助老师课堂管理&#xff1f; 第一步&#xff1a;在腾讯元宝对话框中输入&#xff1a;如何协助老师进行课堂管理&#xff0c;通过提问&#xff0c;我们了解了老师高效备课可以从哪些方面入手&#xff0c;提高效率。 第二步&#xff1a;编辑问题进行提问&#xf…...

如何理解参照权

在管理学和组织行为学中&#xff0c;“参照权力”&#xff08;Referent Power&#xff09;是一种非常重要的权力来源&#xff0c;它属于非强制性权力的一种&#xff0c;主要基于个人特质和人际关系。以下是对参照权力的详细解释&#xff1a; 一、定义 参照权力是指一个人由于…...

从一次被抄袭经历谈起:iOS App 安全保护实战

如何保护 iOS App 的最后一道防线&#xff1a;那些你可能忽略的混淆技巧 如果你曾认真反编译过别人的 .ipa 文件&#xff0c;很可能会有这种感受&#xff1a;“哇&#xff0c;这代码也太干净了吧。” 类名像 UserManager&#xff0c;方法名是 getUserToken&#xff0c;甚至资源…...

从交互说明文档,到页面流程图设计全过程

依据交互说明文档绘制页面流程图&#xff0c;能够将抽象的交互逻辑转化为可视化、结构化的表达&#xff0c;为开发、测试及团队协作提供清晰指引。接下来&#xff0c;我们以外卖 App 订单确认页为例&#xff0c;详细拆解从交互说明文档到完整页面流程图的设计全过程。 一、交互…...

fedora系统详解详细版本

Fedora 系统详解&#xff1a;从起源到实践的深度解析 一、Fedora 概述&#xff1a;开源社区的技术先锋 Fedora 是由 Fedora 项目社区 开发、Red Hat 公司赞助 的 Linux 发行版&#xff0c;以 自由开源、技术前沿 和 稳定性平衡 著称。它是 Red Hat Enterprise Linux&#xff…...

2025-05-07-FFmpeg视频裁剪(尺寸调整,画面比例不变)

原比例如图 原比例如图裁剪后的比例 代码&#xff1a; 方法一&#xff1a;极速 ffmpeg -i input.mp4 -vf "crop1080:750:0:345" -c:v libx264 -preset ultrafast -c:a copy output.mp4关键参数说明&#xff1a; vf “crop宽:高❌y”&#xff1a;定义裁剪区域。 …...

RISC-V JTAG:开启MCU 芯片调试之旅

在当今电子科技飞速发展的时代&#xff0c; MCU 芯片成为众多企业追求技术突破与创新的关键领域。而芯片的调试过程则是确保其性能与可靠性的重要环节。本文以国科安芯自研 AS32A601为例&#xff0c;旨在详细记录基于 RISC-V 架构的 MCU 芯片JTAG 调试过程及操作&#xff0c;为…...

51单片机快速成长路径

作为在嵌入式领域深耕18年的工程师&#xff0c;分享一条经过工业验证的51单片机快速成长路径&#xff0c;全程干货无注水&#xff1a; 一、突破认知误区&#xff08;新手必看&#xff09; 不要纠结于「汇编还是C」&#xff1a;现代开发90%场景用C&#xff0c;掌握指针和内存管…...

idea左侧项目资源管理器不见了处理

使用idea误触导致&#xff0c;侧边栏和功能栏没了&#xff0c;如何打开&#xff1f; 1.打开文件&#xff08;File&#xff09; 2. 打开设置&#xff08;Settings&#xff09; 3.选择Appearance&Behavior--->Appearance划到最下面&#xff0c;开启显示工具栏和左侧并排布…...

给小白的AI Agent 基本技术点分析与讲解

引言&#xff1a;重塑交互与自动化边界的 AI Agent 在人工智能技术飞速发展的浪潮中&#xff0c;AI Agent&#xff08;智能体&#xff09;概念的兴起标志着自动化和人机交互正迈向一个全新的阶段。传统的软件系统通常被设计来执行精确预设的指令序列&#xff0c;它们强大且高效…...

[特殊字符] 深入解析:Go 与 Rust 中的数组与动态集合结构

在 Go 和 Rust 这两种现代语言中&#xff0c;数组和动态集合&#xff08;如切片或 Vec&#xff09;是处理数据的基础工具。虽然它们都提供了高效的内存访问能力&#xff0c;但设计理念却截然不同&#xff1a; Go 更注重灵活性和性能&#xff0c;允许开发者直接操作底层指针和容…...

C25-数组应用及练习

第一题 题目: 代码 #include <stdio.h> int main() {//数组及相关数据定义int arr[10];int i;//基于循环的数组数据输入for(i0;i<10;i){arr[i]i;}//基于循环的数组数据输出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }结果 第二题 题目 代码 …...

Soft Mask(软遮罩)技术

一、概述 Soft Mask是一种技术或工具&#xff0c;主要用于实现平滑的边缘遮罩效果。它在不同的应用领域有不同的实现和定义 1.在Unity UI设计中 SoftMask是一款专为Unity设计的高级遮罩工具&#xff0c;它突破了传统Mask的限制&#xff0c;提供了更为灵活和细腻的UI遮罩解决方案…...

683SJBH基于J2EE的广州旅游管理系统

第1章  绪论 课题背景 自互联网internet成为一种革命性的大众媒体以来&#xff0c;其发展速度之快令人惊叹。而作为世界最大朝阳产业的旅游&#xff0c;当它与电子商务这一新兴模式相结合时&#xff0c;其潜藏的商业价值表露无遗。根据CNN&#xff08;美国有线电视新闻网&…...

关于STM32 SPI收发数据异常

问题描述&#xff1a; STM32主板做SPI从机&#xff0c;另一块linux主板做主机&#xff0c;通信的时候发现从机可以正确接收到主机数据&#xff0c;但是主机接收从机数据时一直不对&#xff0c;是随机值。 问题原因&#xff1a; 刚发现问题的时候&#xff0c;用逻辑分析仪抓包…...

雅努斯问题(Janus Problem)及解决方案

一、雅努斯简介 雅努斯&#xff08;Janus&#xff09;是罗马神话中的门神&#xff0c;也是罗马人的保护神。他具有前后两个面孔或四方四个面孔&#xff0c;象征开始。雅努斯被认为是起源神&#xff0c;执掌着开始和入门&#xff0c;也执掌着出口和结束&#xff0c;因此他又被成…...

ACE-Step:扩散自编码文生音乐基座模型快速了解

ACE-Step 模型速读 一、模型概述 ACE-Step 是一款由 ACE Studio 和 StepFun 开发的新型开源音乐生成基础模型。它通过整合基于扩散的生成方式、Sana 的深度压缩自编码器&#xff08;DCAE&#xff09;以及轻量级线性变换器&#xff0c;在音乐生成速度、音乐连贯性和可控性等方…...

【论文阅读】在调制分类中针对对抗性攻击的混合训练时和运行时防御

A Hybrid Training-Time and Run-Time Defense Against Adversarial Attacks in Modulation Classification 摘要 在深度学习在包括计算机视觉和自然语言处理在内的许多应用中的卓越性能的推动下,最近的几项研究侧重于应用深度神经网络来设计未来几代无线网络。然而,最近的…...

HDMI布局布线

1 HDMI简介 高清多媒体接口(High Definition Multimedia Interface),简称:HDMI,是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。随着技术的不断提升,HDMI的传输速率也不断的提升,HDMI2.0最大传输速率可达14.4Gbit/s,HDMI2.1最大传输数据速率可达42.6Gbit/s…...

国家信息中心:基于区块链和区块链服务网络(BSN)的可信数据空间建设指引

推荐语&#xff1a; 可信数据空间包含场景应用、生态主体、数据资源、规则机制、技术系统五大部分。《基于区块链和区块链服务网络&#xff08;BSN&#xff09;的可信数据空间建设指引》聚焦可信数据空间的单个数据空间中的场景应用、数据资源、规则机制及技术系统四大核心要点…...

分区器(1)

1. 需求分析 在分布式计算中&#xff0c;Map任务通常会产生大量的中间结果&#xff0c;这些结果需要被分配到不同的Reducer任务中进行进一步处理。分区器的作用是根据一定的规则将中间结果分配到不同的分区&#xff08;Partition&#xff09;&#xff0c;从而确保数据能够被正…...

设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?

一、高吞吐低延迟 Kafka 集群设计要点 1. 分区策略优化 // 计算合理分区数公式&#xff08;动态调整&#xff09; int numPartitions max(Tp, Tc) / min(Tp, Tc) // Tp生产者吞吐量 Tc消费者吞吐量建议初始按业务键&#xff08;如订单ID&#xff09;哈希分区单分区吞吐建议…...

大模型工具与案例:云服务器部署dify(1)

如果您可以装wsl&#xff0c;可以在本机部署参考windows安装dify-江鸟阁长 因为笔者的windows电脑不可以安装wsl&#xff0c;所以本文会带大家在linux云服务器上部署。目前很多厂家都推出了一键部署&#xff0c;但是价格也有差 阿里云 通用型服务器 70rmb/月 华为云比较便宜&a…...

屏蔽力 | 在复杂世界中从内耗到成长的转变之道

注&#xff1a;本文为“屏蔽力”相关文章合辑。 略作重排&#xff0c;未全整理。 世上的事再复杂&#xff0c;不外乎这三种 原创 小鹿 读者 2022 年 12 月 02 日 18 : 27 甘肃 文 / 小鹿 在这世上&#xff0c;每天都有大事小事、琐事烦事。我们总为世事奔波忙碌&#xff0c;…...

信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十一)

个人笔记整理---仅供参考 第十一章项目成本管理 11.1管理基础 11.2项目成本管理过程 11.3规划成本管理 11.4估算成本 11.5制定预算 11.6控制成本...

大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战

引言&#xff1a;当数据成为新时代的“石油” 在数字经济时代&#xff0c;数据量以每年50%的速度爆发式增长。如何高效存储、处理和分析PB级数据&#xff0c;成为企业竞争力的核心命题。本文将通过通俗类比场景化拆解&#xff0c;带你深入理解四大关键技术&#xff1a;Hadoop、…...

Linux 驱动开发步骤及 SPI 设备驱动移植示例

Linux 驱动开发的一般步骤 硬件了解&#xff1a;深入研究目标硬件设备的工作原理、寄存器映射、电气特性、中断机制等。例如&#xff0c;若开发网卡驱动&#xff0c;需清楚网卡如何与网络介质交互、数据包的收发流程、硬件缓冲区的管理等。只有透彻理解硬件&#xff0c;才能编…...

直播数据大屏是什么?企业应如何构建直播数据大屏?

目录 一、直播数据大屏是什么&#xff1f; 1. 定义 2. 特点 ​编辑二、企业如何构建直播数据大屏&#xff1f; &#xff08;一&#xff09;明确需求和目标 &#xff08;二&#xff09;数据采集和整合 &#xff08;三&#xff09;选择合适的可视化工具 &#xff08;四&a…...

Vue与Python的深度整合:构建现代Web应用的全栈范式

在前后端分离架构成为行业标准的今天&#xff0c;Vue.js与Python的组合为全栈开发提供了高效且灵活的技术方案。这种组合不仅继承了Vue组件化开发的敏捷性&#xff0c;更借助Python后端框架&#xff08;如Django/Flask&#xff09;的强大生态&#xff0c;实现了从原型设计到生产…...