Reactive编程框架与工具

文章目录
- 6.2 后端 Reactive 框架
- 6.2.1 Spring WebFlux
- 核心架构
- 核心组件
- 实际应用
- 高级特性
- 性能优化
- 适用场景与限制
- 6.2.2 Akka(Actor模型)
- Actor模型基础
- 基本用法
- 高级特性
- 响应式特性实现
- 性能优化
- 实际应用场景
- 优势与挑战
- 6.2.3 Vert.x(事件驱动)
- 核心概念
- 基本架构
- 基本用法
- 核心组件
- 响应式编程支持
- 高级特性
- 性能优化
- 实际应用场景
- 优势与挑战
- 6.2.4 后端响应式框架比较
- 6.2.5 响应式后端设计模式
- 6.2.6 响应式后端最佳实践
- 6.2.7 未来趋势
6.2 后端 Reactive 框架
随着现代应用对高并发、低延迟需求的增长,响应式编程在后端开发领域获得了广泛关注。后端响应式框架通过非阻塞I/O、异步处理和事件驱动架构,能够更高效地利用系统资源,处理大量并发请求。本节将深入探讨三种主流后端响应式框架:Spring WebFlux、Akka和Vert.x。
6.2.1 Spring WebFlux
Spring WebFlux是Spring Framework 5.0引入的响应式Web框架,它支持响应式流(Reactive Streams)规范,提供了一种非阻塞的编程模型来处理并发请求。
核心架构
-
响应式基础:
- 基于Project Reactor实现,提供Mono(0-1个元素)和Flux(0-N个元素)两种发布者类型
- 完全非阻塞,支持背压(backpressure)
- 可运行在Netty、Undertow或Servlet 3.1+容器上
-
与传统Spring MVC对比:
| 特性 | Spring MVC | Spring WebFlux |
|---|---|---|
| 编程模型 | 命令式 | 声明式响应式 |
| 线程模型 | 每个请求一个线程 | 少量线程处理所有请求 |
| 阻塞支持 | 是 | 否 |
| 容器要求 | Servlet容器 | Servlet容器或Netty等 |
| 适用场景 | 传统同步应用 | 高并发、低延迟应用 |
核心组件

- Reactor类型:
// Mono示例
Mono<String> mono = Mono.just("Hello").delayElement(Duration.ofSeconds(1)).map(String::toUpperCase);// Flux示例
Flux<Integer> flux = Flux.range(1, 10).delayElements(Duration.ofMillis(500)).filter(i -> i % 2 == 0);
-
WebHandler API:
WebFilter:类似于Servlet Filter的响应式版本WebExceptionHandler:处理异常的响应式方式WebSessionManager:管理会话的响应式接口
-
响应式Repository:
public interface UserRepository extends ReactiveCrudRepository<User, Long> {Flux<User> findByLastName(String lastName);Mono<User> findFirstByUsername(String username); }
实际应用

- 创建响应式控制器:
@RestController
@RequestMapping("/users")
public class UserController {private final UserRepository userRepository;public UserController(UserRepository userRepository) {this.userRepository = userRepository;}@GetMappingpublic Flux<User> getAllUsers() {return userRepository.findAll();}@GetMapping("/{id}")public Mono<User> getUserById(@PathVariable Long id) {return userRepository.findById(id);}@PostMappingpublic Mono<User> createUser(@RequestBody User user) {return userRepository.save(user);}
}
- 响应式WebClient:
WebClient client = WebClient.create("http://example.com");Mono<User> userMono = client.get().uri("/users/{id}", 1L).retrieve().bodyToMono(User.class);Flux<Order> ordersFlux = client.get().uri("/users/{id}/orders", 1L).retrieve().bodyToFlux(Order.class);
- 函数式端点:
@Configuration
public class RouterConfig {@Beanpublic RouterFunction<ServerResponse> route(UserHandler userHandler) {return RouterFunctions.route().GET("/users", userHandler::listUsers).GET("/users/{id}", userHandler::getUser).POST("/users", userHandler::createUser).build();}
}@Component
public class UserHandler {private final UserRepository userRepository;public UserHandler(UserRepository userRepository) {this.userRepository = userRepository;}public Mono<ServerResponse> listUsers(ServerRequest request) {return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(userRepository.findAll(), User.class);}// 其他处理方法...
}
高级特性
-
响应式事务:
@Transactional public Mono<Void> transferMoney(Long fromId, Long toId, BigDecimal amount) {return userRepository.findById(fromId).flatMap(from -> userRepository.findById(toId).flatMap(to -> {from.setBalance(from.getBalance().subtract(amount));to.setBalance(to.getBalance().add(amount));return userRepository.save(from).then(userRepository.save(to));}).then(); } -
服务器发送事件(SSE):
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<StockPrice> streamStockPrices() {return Flux.interval(Duration.ofSeconds(1)).map(i -> new StockPrice("SYM", 100 + random.nextDouble() * 10)); } -
WebSocket支持:
@Configuration @EnableWebFlux public class WebSocketConfig implements WebSocketHandlerConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(myHandler(), "/ws").setAllowedOrigins("*");}@Beanpublic WebSocketHandler myHandler() {return new MyWebSocketHandler();} }
性能优化
-
调度器配置:
- 默认使用弹性(elastic)调度器处理阻塞操作
- 可配置并行(parallel)调度器用于CPU密集型任务
-
背压策略:
onBackpressureBuffer:缓冲元素onBackpressureDrop:丢弃无法处理的元素onBackpressureLatest:只保留最新元素
-
响应式缓存:
CacheManager cacheManager = new ReactiveRedisCacheManager(redisTemplate);@Cacheable("users") public Mono<User> getUserById(Long id) {return userRepository.findById(id); }

适用场景与限制
适用场景:
- 高并发、低延迟的微服务
- 流式数据处理应用
- 实时通信系统
- 需要水平扩展的服务
限制:
- 学习曲线较陡
- 调试相对困难
- 与传统JDBC的集成有限
- 并非所有库都支持响应式
6.2.2 Akka(Actor模型)
Akka是一个基于Actor模型的响应式工具包和运行时,用于构建高并发、分布式、弹性、消息驱动的应用。
Actor模型基础
-
核心概念:
- Actor:计算的基本单元,包含状态、行为、邮箱和子Actor
- 消息:Actor之间通信的唯一方式,不可变且异步发送
- 邮箱:存储接收到的消息队列
- Actor系统:Actor的层级容器,提供配置和调度
-
Actor生命周期:
preStart():Actor启动时调用postStop():Actor停止时调用preRestart()和postRestart():Actor重启时调用
基本用法
- 定义Actor:
public class Greeter extends AbstractActor {@Overridepublic Receive createReceive() {return receiveBuilder().match(Greet.class, g -> {System.out.println("Hello " + g.who);getSender().tell(new Greeted(g.who), getSelf());}).build();}public static class Greet {public final String who;public Greet(String who) { this.who = who; }}public static class Greeted {public final String who;public Greeted(String who) { this.who = who; }}
}
- 创建Actor系统:
ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter");greeter.tell(new Greeter.Greet("World"), ActorRef.noSender());
高级特性
- 路由(Routing):
ActorRef workerRouter = system.actorOf(Props.create(Worker.class).withRouter(new RoundRobinPool(5)));
- 持久化(Persistence):
public class PersistentActor extends AbstractPersistentActor {private List<Object> events = new ArrayList<>();@Overridepublic String persistenceId() { return "sample-id-1"; }@Overridepublic Receive createReceiveRecover() {return receiveBuilder().match(Event.class, events::add).build();}@Overridepublic Receive createReceive() {return receiveBuilder().match(Cmd.class, c -> {persist(new Event(c.getData()), evt -> {events.add(evt);getSender().tell(evt, getSelf());});}).build();}
}
- 集群(Cluster):
akka {actor {provider = cluster}remote {artery {canonical.hostname = "127.0.0.1"canonical.port = 2551}}cluster {seed-nodes = ["akka://MySystem@127.0.0.1:2551","akka://MySystem@127.0.0.1:2552"]}
}
- 流处理(Akka Streams):
Source<Integer, NotUsed> source = Source.range(1, 100);
Flow<Integer, String, NotUsed> flow = Flow.of(Integer.class).map(i -> i.toString());
Sink<String, CompletionStage<Done>> sink = Sink.foreach(System.out::println);RunnableGraph<NotUsed> runnable = source.via(flow).to(sink);
runnable.run(system);

响应式特性实现
-
弹性(Resilience):
- 监督策略(Supervision):定义Actor失败时的恢复策略
- 断路器(Circuit Breaker):防止级联失败
-
响应性(Responsive):
- 基于事件的消息驱动模型
- 非阻塞通信
-
弹性(Elastic):
- 运行时动态调整Actor数量
- 集群自动负载均衡
-
消息驱动(Message Driven):
- 完全基于异步消息传递
- 位置透明性(Location Transparency)
性能优化
-
调度器配置:
- 为不同类型任务配置不同调度器
- 隔离阻塞操作
-
邮箱选择:
- 无界邮箱(默认)
- 有界邮箱
- 优先级邮箱
-
序列化优化:
- 使用高效的序列化机制(如Protobuf)
- 避免发送大型消息
实际应用场景
-
交易处理系统:
- 每个交易作为一个Actor
- 实现高并发处理
- 确保事务隔离
-
实时分析系统:
- 使用Akka Streams处理数据流
- 实现复杂事件处理(CEP)
-
物联网平台:
- 每个设备对应一个Actor
- 处理设备消息
- 实现设备状态管理
优势与挑战
优势:
- 高并发处理能力
- 分布式原生支持
- 弹性设计
- 成熟的生态系统
挑战:
- 思维模式转变(从面向对象到Actor模型)
- 调试困难
- 学习曲线陡峭
- 某些场景下性能不如专有解决方案
6.2.3 Vert.x(事件驱动)

Vert.x是一个轻量级、高性能的响应式应用框架,基于事件总线和非阻塞I/O模型。
核心概念
-
Verticle:
- Vert.x的基本部署单元
- 类似Actor,但更轻量级
- 可以有多种类型(Standard, Worker, Multi-threaded)
-
Event Bus:
- 应用内部的分布式消息系统
- 支持点对点、发布/订阅模式
- 支持集群通信
-
非阻塞API:
- 所有I/O操作都是异步非阻塞的
- 基于回调、Future或RxJava
基本架构
-
多语言支持:
- 核心API支持Java、Kotlin、Scala、Groovy等
- 通过语言扩展支持JavaScript、Ruby等
-
模块系统:
- 通过Vert.x Module System管理模块
- 支持服务发现和动态加载
-
垂直扩展与水平扩展:
- 单机多核利用(Event Loop)
- 集群模式支持
基本用法
- 创建Verticle:
public class MyVerticle extends AbstractVerticle {@Overridepublic void start() {// 创建HTTP服务器vertx.createHttpServer().requestHandler(req -> req.response().end("Hello Vert.x!")).listen(8080);// 事件总线示例vertx.eventBus().consumer("news.uk.sport", message -> {System.out.println("Received news: " + message.body());});}
}
- 部署Verticle:
public static void main(String[] args) {Vertx vertx = Vertx.vertx();vertx.deployVerticle(new MyVerticle());
}
核心组件
- Web组件:
Router router = Router.router(vertx);router.get("/api/users").handler(ctx -> {ctx.response().putHeader("content-type", "application/json").end(new JsonArray().add("user1").add("user2").toString());
});vertx.createHttpServer().requestHandler(router).listen(8080);
- 数据访问:
// JDBC
JDBCClient jdbc = JDBCClient.createShared(vertx, config);
jdbc.getConnection(res -> {if (res.succeeded()) {SQLConnection connection = res.result();connection.query("SELECT * FROM users", ar -> {if (ar.succeeded()) {// 处理结果}});}
});// Redis
RedisClient redis = RedisClient.create(vertx);
redis.get("key", res -> {if (res.succeeded()) {String value = res.result();}
});
- 服务发现:
ServiceDiscovery discovery = ServiceDiscovery.create(vertx);
discovery.getRecord(r -> r.getName().equals("my-service"), ar -> {if (ar.succeeded()) {Record record = ar.result();// 使用服务}
});

响应式编程支持
- RxJava集成:
// 创建Rxified Vertx实例
Vertx vertx = io.vertx.reactivex.core.Vertx.vertx();// Rx风格的HTTP服务器
vertx.createHttpServer().requestHandler(req -> req.response().end("Hello Rx Vert.x!")).rxListen(8080).subscribe(server -> System.out.println("Server started"));
- 响应式流处理:
// 从HTTP请求读取数据流
router.post("/upload").handler(ctx -> {ctx.request().toFlowable().flatMap(buffer -> {// 处理每个bufferreturn processBuffer(buffer);}).subscribe(result -> {/* 处理成功 */},error -> {/* 处理错误 */});
});
- Future/Promise:
Promise<String> promise = Promise.promise();vertx.fileSystem().readFile("data.txt", ar -> {if (ar.succeeded()) {promise.complete(ar.result().toString());} else {promise.fail(ar.cause());}
});Future<String> future = promise.future();
future.compose(content -> {// 处理内容return processContent(content);
}).onSuccess(result -> {// 最终成功处理
}).onFailure(err -> {// 错误处理
});
高级特性
- 集群模式:
Vertx.clusteredVertx(new VertxOptions(), res -> {if (res.succeeded()) {Vertx vertx = res.result();// 集群模式运行}
});
-
微服务支持:
- 服务发现与注册
- 断路器(Circuit Breaker)
- 配置中心集成
-
事件总线桥接:
- 连接浏览器与后端事件总线
- 支持SockJS
-
Metrics监控:
- 内置Micrometer支持
- 提供JVM、事件总线、HTTP等指标
性能优化
-
Event Loop优化:
- 避免在Event Loop中执行阻塞操作
- 使用Worker Verticle处理阻塞任务
-
配置调优:
- 调整Event Loop线程数
- 优化Worker线程池大小
-
序列化优化:
- 使用高效的序列化机制
- 避免发送大型消息
实际应用场景
-
实时API网关:
- 高并发请求处理
- 动态路由
- 认证授权
-
微服务架构:
- 轻量级服务实现
- 服务间事件通信
- 弹性设计
-
物联网后端:
- 处理设备事件
- 实时数据处理
- 设备管理

优势与挑战
优势:
- 极高性能
- 轻量级设计
- 多语言支持
- 丰富的模块生态系统
- 易于扩展
挑战:
- 回调地狱风险(需配合RxJava/Future解决)
- 调试复杂性
- 与传统框架集成有限
- 学习曲线
6.2.4 后端响应式框架比较
| 特性 | Spring WebFlux | Akka | Vert.x |
|---|---|---|---|
| 编程模型 | 响应式流 | Actor模型 | 事件驱动 |
| 基础技术 | Project Reactor | Actor模型实现 | Netty事件循环 |
| 主要语言 | Java/Kotlin | Java/Scala | 多语言支持 |
| 学习曲线 | 中等 | 陡峭 | 中等 |
| 分布式支持 | 需额外组件 | 原生支持 | 原生支持 |
| 微服务适用性 | 优秀 | 优秀 | 优秀 |
| 性能 | 高 | 很高 | 极高 |
| 社区生态 | 非常丰富 | 丰富 | 较丰富 |
| 适用场景 | 传统企业应用现代化 | 分布式复杂系统 | 高性能实时系统 |
6.2.5 响应式后端设计模式
-
事件溯源(Event Sourcing):
- 存储状态变化事件而非最终状态
- 结合CQRS(命令查询职责分离)
-
反应式微服务(Reactive Microservices):
- 服务间异步通信
- 弹性设计模式(断路器、重试、超时)
-
数据流处理(Stream Processing):
- 使用响应式流处理连续数据
- 实现复杂事件处理
-
背压处理(Backpressure Handling):
- 消费者控制生产者速率
- 防止系统过载
6.2.6 响应式后端最佳实践
-
避免阻塞操作:
- 识别并隔离所有阻塞调用
- 使用专用线程池处理阻塞操作
-
资源管理:
- 确保所有资源(连接、文件等)正确释放
- 使用响应式方式管理资源
-
错误处理:
- 为所有异步操作提供错误处理
- 实现弹性模式
-
测试策略:
- 使用StepVerifier测试响应式流
- 模拟高负载场景
- 验证背压行为
-
监控与调优:
- 监控关键指标(延迟、吞吐量、资源使用)
- 根据性能测试结果调整配置

6.2.7 未来趋势
-
服务网格集成:
- 与Istio、Linkerd等服务网格技术深度整合
- 增强可观察性和弹性
-
云原生支持:
- 更好的Kubernetes集成
- 自动伸缩能力增强
-
多语言统一API:
- 跨语言一致的响应式API
- 更简单的多语言服务开发
-
响应式SQL:
- 更多数据库支持真正的响应式访问
- 标准化响应式数据访问接口
-
Wasm集成:
- WebAssembly在服务端的应用
- 高性能响应式计算
响应式编程已成为现代后端开发的范式转变,它使开发者能够构建更具弹性、可扩展性和响应性的系统。无论是选择Spring WebFlux、Akka还是Vert.x,理解响应式原则并掌握相应工具,对于构建面向未来的后端系统至关重要。
相关文章:
Reactive编程框架与工具
文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka(Actor模型)Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x(事件驱动&…...
五子棋游戏开发:静态资源的重要性与设计思路
以下是以CSDN博客的形式整理的关于五子棋游戏静态资源需求的文章,基于我们之前的讨论,内容结构清晰,适合开发者阅读和参考。我尽量保持技术性、实用性,同时加入一些吸引读者的亮点。 五子棋游戏开发:静态资源的重要性与…...
Python爬虫第7节-requests库的高级用法
目录 前言 一、文件上传 二、Cookies 三、会话维持 四、SSL证书验证 五、代理设置 六、超时设置 七、身份认证 八、Prepared Request 前言 上一节,我们认识了requests库的基本用法,像发起GET、POST请求,以及了解Response对象是什么。…...
Maven的安装配置-项目管理工具
各位看官,大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习:Maven的安装配置-项目管理工具 目录 1.什么是Maven?Maven用来干什么的?…...
智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月
📌 更新速览 本月更新包含 21项功能增强 和 9项问题修复,重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析(3/26) ALTER INDEX RENAME/VISIBLE 语句解析&#…...
Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程
Ubuntu虚拟机的安装过程可以查看另一篇文章:VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程-CSDN博客 目前我们已经下载好了OpenCV,这里以OpenCV4.5.2为例。 在内存要求尽可能小的情况下,可以尝试只编译安装代码中使用到的OpenC…...
find指令中使用正则表达式
linux查找命令能结合正则表达式吗 find命令要使用正则表达式需要结合-regex参数 另,-type参数可以指定查找类型(f为文件,d为文件夹) rootlocalhost:~/regular_expression# ls -alh 总计 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…...
Java Web从入门到精通:全面探索与实战(二)
Java Web从入门到精通:全面探索与实战(一)-CSDN博客 目录 四、Java Web 开发中的数据库操作:以 MySQL 为例 4.1 MySQL 数据库基础操作 4.2 JDBC 技术深度解析 4.3 数据库连接池的应用 五、Java Web 中的会话技术ÿ…...
基于大模型的阵发性室上性心动过速风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、阵发性室上性心动过速概述 2.1 定义与分类 2.2 发病机制与流行病学 2.3 临床表现与诊断方法 三、大模型在阵发性室上性心动过速预测中的应用 3.1 大模型技术原理与特点 3.2 模型构…...
秒杀业务的实现过程
一.后台创建秒杀的活动场次信息,并关联到要秒杀的商品或服务; 二.通过定时任务,将秒杀的活动信息和商品服务信息存储到redis; 三.在商品展示页的显眼位置加载秒杀活动信息; 四.用户参与秒杀,创建订单,将…...
spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解
ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解,用于将方法返回的对象直接序列化为 HTTP 响应体(如 JSON 或 XML),而不是通过视图解析器渲染为视图(如 HTML&…...
TDengine.C/C++ 连接器
简介 C/C 开发人员可以使用 TDengine 的客户端驱动,即 C/C 连接器(以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...
[docker] 简单操作场景
Docker的简单操作场景 1 安装 暂时没空写~ 2 登陆 一共4步: ~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d765d4c1eb5f ubuntu:24.04 "/bin/bash" …...
skynet.rawcall使用详解及应用场景
目录 核心特性函数原型使用场景场景 1:高性能二进制传输(如文件转发)场景 2:自定义序列化协议(如 Protocol Buffers)场景 3:跨服务共享内存(避免拷贝) 配套接收方实现与 …...
使用SpringSecurity下,发生重定向异常
使用SpringSecurity下,发生空转异常 环境信息: Spring Boot 3.4.4 , jdk 17 , springSecurity 6.4.4 问题背景: 没有自定义controller ,改写了login 页面,并且进行了成功后的跳转处理…...
gbase8s之逻辑导出导入脚本(完美版本)
该脚本dbexport.sh用于快速导出库和导入库(使用多并发unload,和多并发dbload的方式) #!/bin/sh #脚本功能:将数据导出成文本,迁移至其他实例 #最后更新时间:2023-12-19 #使用方法: #1.执行该脚…...
Elasticsearch | ES索引模板、索引和索引别名的创建与管理
关注:CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时,索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名,并提供具…...
【Easylive】视频删除方法详解:重点分析异步线程池使用
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作,主要完成以下功能: 权限验证:检查视频是否存在及用户是否有权限删除核心数据删除&…...
力扣hot100_回溯(2)_python版本
一、39. 组合总和(中等) 代码: class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...
SGLang实战:从KV缓存复用到底层优化,解锁大模型高效推理的全栈方案
在当今快速发展的人工智能领域,大型语言模型(LLM)的应用已从简单对话扩展到需要复杂逻辑控制、多轮交互和结构化输出的高级任务。面对这一趋势,如何高效地微调并部署这些大模型成为开发者面临的核心挑战。本文将深入探讨SGLang——这一专为大模型设计的高…...
LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南
由于之前DDR的系列选型文章有很好的反馈,所以补充LPDDR4低功耗内存的选型和命名规则,总结了目前市面上常用的内存,供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中,LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…...
特权FPGA之Johnson移位
完整代码: module johnson(clk,rst_n,led,sw1_n,sw2_n,sw3_n);input clk; //时钟信号,50MHz input rst_n; //复位信号,低电平有效 output[3:0] led; //LED控制,1--灭…...
网络安全小知识课堂(最终完结版)
网络安全入门 :从 “小白” 到 “守护者” 的蜕变之旅 写在完结之际 历经 13 篇的深度探索,我们从 DDoS 攻击的 “流量洪水” 一路闯关到 HTTPS 的 “加密堡垒”,揭开了网络安全世界的层层面纱。感谢每一位读者的陪伴与互动,你们…...
2025年AI生成引擎搜索发展现状与趋势总结
2025年AI生成引擎搜索发展现状与趋势总结 一、国内外AI生成引擎搜索发展现状 1. 国内动态 社交搜索崛起:小红书2024年Q4日均搜索量达6亿次,用户更依赖社交平台UGC内容进行决策(如购物、旅游场景)&#…...
【杂谈】Godot4.4导出到Android平台(正式导出)
学博而后可约,事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台(调试导出)的基础上,进行正式导出。调试导出并不是真正的编译导…...
VBA将Word文档内容逐行写入Excel
如果你需要将Word文档的内容导入Excel工作表来进行数据加工,使用下面的代码可以实现: Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…...
基于AI设计开发出来的业务系统是什么样的?没有菜单?没有表格?
基于AI设计开发出的业务系统仍然会包含菜单、表格等传统UI元素,但AI技术会显著改变它们的实现方式和交互逻辑。以下是具体分析: 一、传统元素的持续存在 功能刚需性 • 菜单承担着系统导航的核心功能,表格则是结构化数据展示的基础载体。根…...
C++ -异常之除以 0 问题(整数除以 0 编译时检测、整数除以 0 运行时检测、浮点数除以 0 编译时检测、浮点数除以 0 运行时检测)
一、整数除以 0(编译时检测) 1、演示 #include <iostream>using namespace std;int main() {int result 10 / 0;cout << result << endl;return 0; }程序无法运行,输出结果 error C2124: 被零除或对零求模2、演示解读 …...
数字足迹管理(DFM):你的网络隐身指南
数字足迹管理(DFM):你的网络隐身指南 你可能不知道,你的姓名、电话、住址正在网上被“明码标价” ——而这一切,可能只是因为你点过外卖、寄过快递,甚至注册过一个网站。 一、什么是数字足迹管理&#…...
如何避免“过度承诺”导致的验收失败
如何避免“过度承诺”导致的验收失败?关键在于: 评估可行性、设置合理目标、高频沟通反馈、阶段性验收、做好风险管理。其中设置合理目标至关重要,很多团队往往在项目初期为迎合客户或领导而报出“最理想方案”,忽略了资源、技术及…...
