实时反欺诈:基于 Spring Boot 与 Flink 构建信用卡风控系统

在金融科技飞速发展的今天,信用卡欺诈手段日益高明和快速。传统的基于批处理的事后分析模式已难以应对实时性要求极高的欺诈场景。本文将详细介绍如何利用
Spring Boot 和 Apache Flink 这对强大的组合,构建一个高性能、可扩展的实时信用卡反欺诈系统。

一、 核心思想:从“单点”到“模式”

传统的反欺诈规则可能只关注单笔交易的某个特征,比如“金额是否过大”。而现代的欺诈行为往往是一种模式 (Pattern),在短时间内通过一系列看似正常的交易来达成目的。例如:

  • 高频交易: 1分钟内,在不同商户连续交易超过5次。
  • 异地消费: 10分钟内,在两个物理上不可能到达的城市(如北京和广州)都有消费记录。
  • 短时大额: 5分钟内,累计消费金额超过正常阈值(如2万元)。
  • 深夜异常: 在用户历史睡眠时段(如凌晨3点),突然发生多笔交易。

这些模式的核心在于时间状态。我们需要一个能够跨多笔事件、在特定时间窗口内、为每个用户维持状态并进行复杂计算的引擎。这正是 Apache Flink 的用武之地。

好的,这是一个非常经典且有价值的场景。使用 Spring Boot + Flink 来实现实时信用卡反欺诈检测,思路清晰的话,实现起来会非常高效。

下面是实现这个功能的整体思路,分为 数据流部分(Flink)查询服务部分(Spring Boot)

调用方 (API Consumers)
API服务层 (Serving Layer)
高速状态存储 (State Store)
实时计算引擎 (Real-time Computing)
数据总线 (Data Bus)
业务系统 (Transaction Producers)
1. 发送交易事件
1. 发送交易事件
2. 持续消费交易流
3. 计算风险特征
4. 将结果写入Redis
6. 查询风险状态 (毫秒级)
5. 调用API判断风险
5. 调用API查询用户
7. 返回判断结果
7. 返回判断结果
支付网关
内部风控后台
Spring Boot
反欺诈API服务
Redis
用户风险状态
Flink 集群
Kafka Topic
'transactions'
Web/App 应用
线下POS机

二、 实现思路

第一部分:实时特征计算 (Flink)

这部分是反欺诈系统的大脑,它不直接对外提供服务,而是持续不断地在后台消费交易数据,计算出能够反映用户行为模式的“实时特征”。

1. 数据源 (Source):

  • 目标: 获取实时的信用卡交易流水。
  • 实现: 生产环境中,这通常是一个 Kafka Topic。每一笔交易(刷卡、线上支付)完成后,业务系统会立即发送一条消息到这个Topic。
    • 消息格式(JSON)应包含:transactionId, userId, amount, timestamp, merchantId, location (经纬度或城市代码)等。

2. 数据流处理 (Flink Job):

  • 步骤1:数据解析与预处理

    • 从 Kafka Source 读取原始JSON数据。
    • 将JSON字符串解析成 Transaction Java对象。
    • userId 进行 keyBy,确保同一个用户的所有交易都在同一个处理线程上。
  • 步骤2:定义欺诈规则并计算特征 (核心)

    • 规则1:高频交易检测

      • 使用滑动窗口 (SlidingProcessingTimeWindows),比如 window(Time.minutes(1), Time.seconds(10)),表示窗口长度为1分钟,每10秒滑动一次。
      • 在窗口函数中,计算窗口内的交易次数 count()
      • 如果 count > 5,则生成一个“高频交易”的告警(Alert)事件。
    • 规则2:异地消费检测

      • 使用滚动窗口 (TumblingProcessingTimeWindows),比如 window(Time.minutes(10))
      • 在窗口函数中,获取该窗口内所有的交易记录。
      • 检查交易记录中的 location 列表。如果发现地理位置变化异常(比如10分钟内,在北京和广州都有消费),则生成“异地消费”告警事件。
    • 规则3:短时大额消费

      • 使用滑动窗口,比如 window(Time.minutes(5), Time.seconds(30))
      • 在窗口函数中,对交易金额进行 sum()
      • 如果 sum > 20000 (比如2万),则生成“短时大额”告警事件。
    • …可以定义更多、更复杂的规则。

  • 步骤3:特征/告警的输出 (Sink)

    • 目标: 将计算出的实时特征或告警事件存储起来,以便查询。
    • 实现: 最理想的存储是高速键值数据库,如 Redis
      • 为什么用Redis? 查询速度极快(毫秒级),非常适合用于在线服务的实时查询。
      • 存储什么?
        • 用户状态: 可以为每个userId在Redis中维护一个HASH。例如:KEY: user_status:{userId}
        • 特征值: FIELD: last_1min_tx_count, VALUE: 7
        • 告警标记: FIELD: has_high_freq_alert, VALUE: true
        • FIELD: last_alert_time, VALUE: 2023-10-27T14:30:00Z
      • Flink 作业的最后一步就是一个 FlinkRedisSink,它会把计算出的特征实时更新到 Redis 中。
第二部分:欺诈判断服务 (Spring Boot)

这部分是反欺诈系统的“门面”,它接收外部请求,并给出“是否欺诈”的判断。

1. 创建API接口:

  • 在 Spring Boot 中创建一个 RestController,例如 FraudDetectionController
  • 定义一个接口,比如 GET /api/fraud/check/{userId}

2. 接口实现逻辑:

  • 当这个接口被调用时,它会去查询 Redis
  • 它会根据 userId 从 Redis 中获取该用户的实时状态和特征(就是 Flink 作业计算后存入的那些)。
  • 判断逻辑:
    • IF redis.get("user_status:{userId}", "has_high_freq_alert") == true
    • OR redis.get("user_status:{userId}", "has_geo_anomaly_alert") == true
    • THEN return "欺诈风险: 高"
    • 你还可以设计更复杂的评分卡模型,根据不同的特征和告警组合,计算出一个风险分数,然后根据分数返回不同的风险等级(高、中、低)。
  • 接口将最终的判断结果(或风险分数)返回给调用方。

整体流程串联

  1. 用户的信用卡产生一笔交易。
  2. 业务系统将交易信息发送到 Kafka。
  3. Flink 作业实时消费 Kafka 中的交易数据。
  4. Flink 根据定义的规则(如1分钟内交易次数)在内存中进行计算。
  5. 一旦某个规则被触发(如交易次数 > 5),Flink 就会将一个告警或更新后的特征(如 last_1min_tx_count = 6)写入 Redis
  6. 此时,另一个系统(如在线支付网关)在处理该用户的下一笔支付前,调用 Spring Boot 提供的API /api/fraud/check/{userId}
  7. Spring Boot 应用从 Redis 中查询该用户的状态,发现has_high_freq_alerttrue
  8. API 接口立即返回“高风险”的判断。
  9. 支付网关收到高风险提示,可以选择拒绝本次交易或要求用户进行二次验证。

这个架构将计算密集型的实时分析任务(Flink)和低延迟查询服务任务(Spring Boot + Redis)完美地结合并解耦,是实现这类系统的标准且高效的模式。

二、 系统架构:计算与服务分离

为了构建一个健壮的系统,我们采用计算与服务分离的经典架构。

  1. 数据总线 (Message Bus) - Kafka:

    • 角色: 系统的“主动脉”。所有交易流水作为事件(Event)被实时发送到 Kafka 的特定主题(Topic)中。
    • 优点: 解耦了交易系统(生产者)和风控系统(消费者),提供了削峰填谷的数据缓冲能力和高容错性。
  2. 实时计算引擎 (Computing Engine) - Apache Flink:

    • 角色: 系统的大脑。它持续消费 Kafka 中的交易数据,基于预设的欺诈规则进行实时计算。
    • 职责: 它不直接对外服务,唯一的任务就是计算出用户的“实时风险特征”,如“最近1分钟交易次数”、“是否存在异地消费告警”等。
  3. 高速状态存储 (State Store) - Redis:

    • 角色: Flink 与服务层之间的桥梁。
    • 职责: Flink 将计算出的实时特征和告警状态高速写入 Redis。我们为每个用户维护一个键值对,例如一个 Hash 存储该用户的所有风险指标。
  4. API 服务层 (Serving Layer) - Spring Boot:

    • 角色: 系统的“门面”。它提供一个低延迟的 HTTP 接口,供其他业务系统(如支付网关)调用。
    • 职责: 当需要判断一笔交易的风险时,外部系统调用此接口。接口的核心逻辑就是查询 Redis,获取指定用户的实时风险状态,并立即返回判断结果。

三、 实现详解

第一部分:Flink 实时特征计算

这是我们风控逻辑的核心。一个 Flink 作业通常包含 Source、Transformation、Sink 三个部分。

1. 数据源 (Source)
我们配置 Flink 从 Kafka 的 transactions 主题中消费数据。

// 交易数据模型
public class Transaction {Long userId;Double amount;Long timestamp;String location;// ... getters and setters
}// Flink 作业中创建Kafka数据源
KafkaSource<String> source = KafkaSource.<String>builder().setBootstrapServers(KAFKA_BROKERS).setTopics("transactions-topic").setGroupId("fraud-detection-group").setStartingOffsets(OffsetsInitializer.latest()).setValueOnlyDeserializer(new SimpleStringSchema()).build();DataStream<Transaction> transactionStream = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source").map(jsonString -> new ObjectMapper().readValue(jsonString, Transaction.class)); // JSON -> Object

2. 核心处理 (Transformation)
这是定义各种欺诈规则的地方。核心是先用 keyBy(userId) 将数据流按用户ID进行分区,然后应用窗口逻辑。

示例:实现“1分钟内高频交易”检测

我们使用滑动窗口 (Sliding Window),窗口长度为1分钟,每10秒滑动一次。这意味着每10秒,我们都会检查过去1分钟的数据。

DataStream<FraudAlert> highFreqAlerts = transactionStream.keyBy(Transaction::getUserId).window(SlidingProcessingTimeWindows.of(Time.minutes(1), Time.seconds(10))).process(new ProcessWindowFunction<Transaction, FraudAlert, Long, TimeWindow>() {@Overridepublic void process(Long userId, Context context, Iterable<Transaction> elements, Collector<FraudAlert> out) {long count = 0;for (Transaction element : elements) {count++;}if (count > 5) { // 规则:1分钟内交易超过5次out.collect(new FraudAlert(userId, "HIGH_FREQUENCY_ALERT", "1分钟内交易次数: " + count));}}});

3. 结果输出 (Sink)
计算出的告警事件需要被写入 Redis,供 API 层查询。

// 告警事件写入Redis
// 实际中会使用 Flink 官方或第三方的 Redis Sink 连接器
highFreqAlerts.addSink(new MyCustomRedisSink()); // Redis Sink 伪代码逻辑
public class MyCustomRedisSink extends RichSinkFunction<FraudAlert> {public void invoke(FraudAlert alert, Context context) {// 使用 Jedis 或 Lettuce 客户端// KEY: user_status:{userId}, FIELD: has_high_freq_alert, VALUE: trueredisClient.hset("user_status:" + alert.getUserId(), "has_high_freq_alert", "true");redisClient.expire("user_status:" + alert.getUserId(), 300); // 设置5分钟过期,自动降级}
}
第二部分:Spring Boot 欺诈判断服务

API 服务层的实现非常轻量级。

@RestController
@RequestMapping("/api/fraud")
public class FraudDetectionController {@Autowiredprivate StringRedisTemplate redisTemplate;@GetMapping("/check/{userId}")public ResponseEntity<Map<String, Object>> checkFraud(@PathVariable String userId) {Map<String, Object> response = new HashMap<>();String key = "user_status:" + userId;// 直接从Redis查询Flink计算好的状态Boolean isHighFrequency = redisTemplate.opsForHash().hasKey(key, "has_high_freq_alert");// ...可以查询更多由Flink计算的风险标签...if (Boolean.TRUE.equals(isHighFrequency)) {response.put("riskLevel", "HIGH");response.put("reason", "检测到高频交易模式");return ResponseEntity.ok(response);}response.put("riskLevel", "LOW");return ResponseEntity.ok(response);}
}

四、 关键挑战:如何处理数据延迟?

读者可能会提出一个至关重要的问题:“我的API接口会不会出现,查询Redis的时候,Flink还没把数据处理完的情况?

答案是:会的,这正是异步系统的固有特性,我们必须正视它。

从一笔交易产生,到被 Flink 计算完成并写入 Redis,存在一个端到端延迟(通常是毫秒级到秒级)。在这个延迟窗口期内,API 查询到的可能是“过时”的状态。

我们的解决思路不是消灭延迟,而是管理它。

  1. 接受最终一致性: 我们的首要目标不是100%拦截住触发规则的第一笔欺诈交易,而是快速识别出欺诈模式,并立即阻断后续的连续攻击
  2. 快速止损策略: 也许我们放过了第6笔欺诈交易,但当第7笔交易发生时(可能仅在1-2秒后),Flink 极大概率已经完成了计算并更新了 Redis。此时我们的 API 就能成功拦截第7、8、9笔交易,实现了快速止损。
  3. 架构的优势: 正是这种计算与服务的分离,保证了 API 接口始终有毫秒级的超低响应延迟,不会被复杂的 Flink 计算所拖慢,从而保障了核心交易链路的性能。
    您提的这个问题非常关键,直击了这类异步处理系统的核心!

答案是:是的,完全可能出现这种情况。 这是这类架构的一个固有特性,也是设计时必须考虑的一点。

让我为您详细拆解一下为什么会发生,以及业界是如何应对这个问题的。

为什么会发生“数据延迟”?

我们可以把一笔交易从发生到被 Flink 处理完成的整个过程想象成一条流水线,每个环节都需要时间:

  1. 交易产生 (T0): 用户完成刷卡。
  2. 数据发送 (T1): 业务系统将交易数据发送到 Kafka (网络延迟)。
  3. Flink 拉取 (T2): Flink 的消费者从 Kafka 拉取到这条数据 (取决于 Flink 的内部调度,通常是毫秒级)。
  4. Flink 处理 (T3): 数据在 Flink 内部流转,进行 keyBy,进入对应的计算窗口。
  5. Flink 窗口计算 (T4): 窗口可能还没到触发计算的时间点。比如,你设置了1分钟的窗口,那么 Flink 需要“攒”够1分钟的数据才会进行计算。
  6. Flink 输出 (T5): 窗口计算完成后,Flink 将结果写入 Redis (网络 + Redis 命令延迟)。

整个 T0 -> T5 的过程,我们称之为**“端到端延迟” (End-to-End Latency)**。这个延迟在负载正常的情况下可能是几百毫秒到几秒。

现在,设想一个欺诈场景:

  • 14:00:01: 骗子发起了第5次交易(触发了“1分钟5次”的规则)。
  • 14:00:02: 在这笔交易的特征还没来得及被 Flink 计算完并写入 Redis 的时候,骗子立刻发起了第6次交易。
  • 此时,支付网关调用你的 API 接口来检查第6次交易的风险。
  • 你的 API 查询 Redis,但 Redis 里的状态还是基于前4次交易的,是“安全的”。
  • 于是你的 API 返回“低风险”,导致第6次欺诈交易被放行。
  • 几秒钟后,Flink 处理完了第5次交易,更新 Redis 状态为“高风险”。但为时已晚,第6次交易已经完成了。

上述问题的本质是数据最终一致性 (Eventual Consistency)。我们无法做到绝对的实时,但我们可以设计系统来管理和减小风险。主要有以下几种策略:

策略一:接受延迟,快速止损 (最常用)
  • 思路: 我们承认无法100%阻止触发规则的那一笔交易以及紧随其后的少数几笔。我们的首要目标是快速响应,阻止后续更大规模的欺诈
  • 说明: 在上面的例子中,我们可能放过了第6笔交易,但当第7笔交易在 14:00:05 发生时,Flink 极有可能已经将 Redis 状态更新了。这时我们的 API 就能成功拦截第7、8、9…笔交易。我们用极小的损失(一两笔交易)换取了对整个欺诈模式的封堵。
  • 优点:
    • 系统架构清晰、简单。
    • API 接口响应极快(Redis 查询非常快)。
    • Flink 可以从容地处理复杂的计算逻辑,不用担心阻塞 API。
  • 这是业界最主流、最标准的做法,因为它在性能、成本和风险控制之间取得了最佳平衡。
策略二:API同步检查 + Flink异步分析 (混合模式)
  • 思路: 对于某些极其简单的规则,可以在 API 层面做一个同步的、补充性的检查。
  • 实现:
    1. API 接口收到请求后,首先查询 Redis (由 Flink 提供的复杂特征)。
    2. 如果 Redis 返回“低风险”,API 再做一个快速的同步查询。这个查询通常是针对一个准实时的数据库(比如把最近几分钟的交易流水也存放在一个高性能SQL数据库或另一个Redis Set里)。
    3. 例如,API可以自己去查:“该用户在过去1分钟内,在交易流水表里有几条记录?”
    4. 综合 Flink 的结果和 API 自己同步查的结果,共同做出决策。
  • 优点: 可以弥补 Flink 的延迟,理论上能拦截住触发规则的那一笔交易。
  • 缺点:
    • API 响应变慢: 引入了额外的数据库查询,接口性能下降。
    • 架构变复杂: 反欺诈的规则逻辑被分散在了 Flink 和 API 后端两个地方,维护成本变高。
    • 数据库压力大: 交易主库可能会被高频的欺诈查询拖垮。
结论与建议

对于您正在设计的系统,我强烈建议从 策略一 开始:

  1. 明确系统的目标: 我们的目标不是杜绝100%的欺诈,而是在欺诈行为发生时,近乎实时地识别出模式,并阻断后续的连续攻击
  2. 信任异步架构: 接受数据会有秒级的延迟,并围绕这个前提来设计风控策略和响应机制。
  3. 优化 Flink 任务: 尽可能地降低 Flink 处理的端到端延迟。比如优化窗口大小、合理配置资源、使用更高性能的硬件等。

只有在业务要求非常苛刻,且愿意为之付出更高的架构复杂度和性能成本时,才考虑引入策略二作为补充。

总结

通过结合 Spring Boot 的快速开发和 API 服务能力,以及 Flink 强大的实时流计算能力,我们可以构建一个架构清晰、可扩展、高性能的实时反欺诈系统。该架构的核心在于将重度的、有状态的模式计算任务交由 Flink 异步处理,而将轻量级的、无状态的服务查询交由 Spring Boot 同步处理,并通过 Redis 作为高速缓存进行解耦。理解并接受这种异步架构带来的最终一致性,是设计和实施此类系统的关键。

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

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

相关文章

通过apache共享文件

有时候&#xff0c;vmware虚拟机的vmware tools总是安装失败&#xff0c;这样就不能在虚拟机和主机之间共享文件。此时可以利用apache通过文件上传和下载共享文件。 通过下面的php文件&#xff0c;虚拟机作为客户端访问此php&#xff0c;可以在虚拟机和主机之间共享文件。当然…

Maven生命周期,测试

测试 Junit入门 单元测试 单元测试&#xff1a;就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其正确性进行测试。 JUnit&#xff1a;最流行的Java测试框架之一&#xff0c;提供了一些功能&#xff0c;方便程序进行单元测试&#xff08;第三方公司提供&#xff09…

H5调试工具vconsole和Eruda对比

VConsole与Eruda对比分析 VConsole和Eruda是两款主流的移动端JavaScript调试工具&#xff0c;它们在功能定位、使用场景和技术实现上有诸多差异。以下从多个维度进行对比&#xff0c;帮助你选择更适合的工具&#xff1a; 一、核心功能对比 功能维度VConsoleEruda基础日志输出…

Java经典编程题

题目 1&#xff1a;斐波那契数列 题目要求&#xff1a;编写一个方法&#xff0c;输入正整数n&#xff0c;输出斐波那契数列的第n项。斐波那契数列的定义是&#xff1a;F(0)0&#xff0c;F(1)1, 当n > 1时&#xff0c;F(n)F(n - 1)F(n - 2)。 答案&#xff1a; public cla…

BUG调试案例五十:“低级”设计BUG案例篇(持续更新中.........)

引言 回头看这些年硬件路,总有一些“低级Bug”一次次地在给我上课。它们不是复杂的架构设计,不是玄妙的信号完整性问题,而是最基础、最应该避免、却又最容易忽略的小细节。 每一次Bug的背后,都是教训,有的甚至让整个项目差点“翻车”。写下这篇文章记录那些“看似简单实…

DeepSeek中的提示库及其用法示例

《DEEPSEEK原生应用与智能体开发实践 图书》【摘要 书评 试读】- 京东图书 为了深入探索DeepSeek提示词样例的丰富内涵&#xff0c;充分挖掘其背后潜藏的无限可能&#xff0c;同时致力于为用户打造更为卓越、便捷且高效的使用体验&#xff0c;DeepSeek官网的API文档匠心独运地…

Node.js特训专栏-实战进阶:7.Express模板引擎选型与使用

&#x1f525; 欢迎来到 Node.js 实战专栏&#xff01;在这里&#xff0c;每一行代码都是解锁高性能应用的钥匙&#xff0c;让我们一起开启 Node.js 的奇妙开发之旅&#xff01; Node.js 特训专栏主页 专栏内容规划详情 Express模板引擎选型与使用全解析&#xff1a;打造动态We…

uniapp评价组件

组件目录 components/Evaluation.vue <template><view class"evaluation-container"><!-- 综合评价 --><view class"evaluation-item" tap"parentTap"><text class"label label-1">综合评价</text&…

SQL Server2022版详细安装教程(Windows)

一&#xff0c;下载SQL Server 可以浏览器自己搜索一下 2、安装 安装前需要先将防火墙和带杀毒软件的先退出关闭掉&#xff08;防止安装不成功&#xff09; 2.1、选择自定义安装 2.2、更改位置进行安装 2.3、等待安装 3、进行安装配置 当安装好后会弹出一个这样的页面 3.1、…

【图像】ubuntu中图像处理

一、环境设置 1、查看视频源 ls /dev/video* 2、查看摄像头的分辨率等参数 v4l2-ctl --device/dev/video0 --list-formats-ext 若未安装v4l-utils sudo apt install v4l-utils 3、测试摄像头能否正常工作 cheese

架构总结记录

1、架构模型解决的共同问题 1.1、高内聚低耦合&#xff1a;解耦外部依赖&#xff0c;分离业务复杂度和技术复杂度等。 1.2、信息孤岛和数据壁垒&#xff1a;单体架构垂直&#xff0c;没有相互调用和复用。逻辑抽象、能力下沉、多系统复用问题 1.3、熵增 2、‌单体架构与分布…

Python: file: encode: ‘gbk‘ codec can‘t encode character ‘\xe5‘ in position

错误 response requests.get(url, timeout5) # 请求一个网页 with open(‘response.txt’, ‘w’) as file: # 打开一个文件 file.write(response.text) # 向文件写入response 提示错&#xff1a; UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xe5’ in po…

PyTorch深度学习框架60天进阶学习计划 - 第59天模型鲁棒性(一):对抗样本生成机理与PGD攻击详解

PyTorch深度学习框架60天进阶学习计划 - 第59天模型鲁棒性&#xff08;一&#xff09;&#xff1a;对抗样本生成机理与PGD攻击详解 &#x1f3af; 第一部分&#xff1a;对抗样本的魔法世界 哈喽各位"反黑客"学员&#xff01;欢迎来到第59天的课程&#xff01;今天我…

kibana和elasticsearch安装

1、elasticsearch 6.8.23 安装包下载地址&#xff1a; Elasticsearch 6.8.23 | Elastic 通过网盘分享的文件&#xff1a;elasticsearch-6.8.23.zip 链接: https://pan.baidu.com/s/1D2SrJ8nVBlqC1QNswmMJXg?pwd1234 提取码: 1234 2、kibana 6.8.23 安装包下载地址&#xff…

vue3 el-table row-class-name 行字体颜色失效

在使用 Vue 3 中的 el-table 组件时&#xff0c;如果你遇到了 row-class-name 属性设置的行颜色失效&#xff0c;并被 el-table 的默认样式覆盖的问题&#xff0c;通常是因为 CSS 优先级或者样式冲突导致的。这里有几个方法可以帮助你解决这个问题&#xff1a; 1. 增加 CSS 优…

【跨界新视野】信号处理遇上VR/AR:下一代沉浸体验的核心技术与您的发表蓝海

导语&#xff1a; 元宇宙概念虽经历起伏&#xff0c;但其底层支撑技术——信号处理&#xff08;Signal Processing&#xff09;与虚拟/增强现实&#xff08;VR/AR&#xff09; 的融合创新正蓬勃发展。从高保真音效定位、脑机接口信号解析&#xff0c;到实时三维重建与交互渲染&…

VMware 2025安装教程(附安装包)VMware 2025下载详细安装图文教程

文章目录 引言第A部分&#xff1a;vmware虚拟机安装包的获取与准备第1步&#xff1a;下载VMware虚拟机安装程序 第B部分&#xff1a;VMware虚拟机安装步骤第3步&#xff1a;启动安装向导第4步&#xff1a;同意软件许可协议第5步&#xff1a;设定程序安装路径第6步&#xff1a;配…

wsl2 用桥接方式连网

安装 Hyper-V windows 家庭版怎么安装 Hyper-V-CSDN博客 用管理员打开 PowerShell 执行 Get-NetAdapter 出系统所有的网卡&#xff0c;记住想要桥接的网卡名称 无线网名称一般为 WLAN&#xff0c;有线网名称一般为 以太网&#xff0c;我的是 以太网 2 执行 Get-VMSwitch 查…

<tauri><threejs><rust><GUI>基于tauri和threejs,实现一个3D图形浏览程序

前言 本专栏是基于rust和tauri&#xff0c;由于tauri是前、后端结合的GUI框架&#xff0c;既可以直接生成包含前端代码的文件&#xff0c;也可以在已有的前端项目上集成tauri框架&#xff0c;将前端页面化为桌面GUI。 发文平台 CSDN 环境配置 系统&#xff1a;windows 10 …

C++基础之指针

文章目录 指针介绍 C指针的定义与用法指针的定义指针的基本操作指针的常见用法1. 动态内存分配2. 指针与数组3. 指针作为函数参数&#xff08;传址调用&#xff09;4. 函数返回指针 特殊指针类型智能指针&#xff08;C11起&#xff09;2.入门代码3.总结 指针介绍 C指针的定义与…