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(事件驱动&…...
vi/vim常用快捷键
那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...
初始JavaEE篇 —— SpringBoot 统一功能处理
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 前言 拦截器 基本使用 拦截器的路径配置 统一数据返回格式 统一异常处理 前言 在实际开发中,某些功能需要强…...
Spring AI Alibaba 文档检索使用
一、文档检索 (Document Retriever)简介 1、核心概念 文档检索(DocumentRetriever)是一种信息检索技术,旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…...
遍历算法及其应用详解
李升伟 整理 什么是遍历? 遍历是指按照某种规则或顺序,系统地访问数据结构(如树、图等)中的每个节点一次且仅一次的过程。遍历是算法设计中的基本操作,用于访问、检查或修改数据结构中的所有元素。 主要遍历算法 1…...
.NET-EFCore基础知识
.NET EF Core(Entity Framework Core)是微软开发的一款开源的对象关系映射(ORM)框架,用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识: 1. 什么是 EF Core EF Core 是.NET 平…...
R语言基础包可视化(一:axis函数)
R语言基础包可视化(一:axis函数) 背景axis函数(坐标轴函数)各参数的图片示例hadj和padjline和poslty,lwd,lwd.ticksgap.axis总结背景 之前在介绍正态Q-Q图的过程中,画过标准正态分布的随机数、分数数、分布函数、密度函数的图像,相关的文章连接参考此处:R语言正态Q-Q图…...
Axure疑难杂症:垂直菜单折叠与展开(玩转垂直菜单)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:垂直菜单折叠与展开 主要内容:折叠与展开效果 应用场景:PC后台菜单、动态下拉菜单、商品分类选择等折叠与展开场景 案例展示: 案例视频: 垂直菜单折叠与展开效果 正文内容: 关于垂直菜单的折叠与…...
docker 中跑faster-whisper 教程(1050显卡)
之前我本地机器运行faster-whisper 会报错类似 Could not load library libcudnn_ops_infer.so.8github 上也有类似的情况 :https://github.com/SYSTRAN/faster-whisper/issues/516#issuecomment-2785038635 缺少.so.8 文件,我通过以下方式,…...
MySQL 在 CentOS 7 环境安装完整步骤
1. 卸载已有环境(MariaDB/旧版MySQL) 1.停止 MariaDB 服务 systemctl stop mariadb.service 2.检查并卸载 MariaDB/MySQL 安装包 rpm -qa | grep mariadb # 检查 MariaDB 相关包 rpm -qa | grep mysql # 检查 MySQL 相关包 sudo yum remo…...
下一代智能爬虫框架:ScrapeGraphAI 详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、ScrapeGraphAI 概述1.1 ScrapeGraphAI介绍1.2 核心特点1.3 工作流程1.4 关键模块1.5 对比传统爬虫框架1.6 安装二、基础操作2.1 自定义解析规则2.2 数据后处理2.3 分布式爬取三、高级功能3.1 多步骤交互采集3.2 动态…...
C++-ffmpeg-2-3-工厂模式封装SDL-9-7
1.接口设计 2.窗口渲染器和材质初始化 3.渲染Draw并测试渲染YUV 4.渲染画面随窗口大小自动缩放并抗锯齿 5.清理接口和接收窗口退出事件 1.接口设计:原则 主要的实现步骤: main的流程: 1打开文件 yuv_file.open("400_300_25.yuv&quo…...
下载极客漫画——Beautiful Soup实用案例
文章目录 一、背景介绍 二、实现思路 三、效果图 四、构思 五、实现细节 1. 第一步下载网页 2. 寻找和下载漫画图像 3. 保存图像,找到前⼀张漫画 六、完整代码 七、程序输出 八、附录 九、总结 一、背景介绍 XKCD网站是一个关于浪漫、隐喻、数字、以及…...
【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施
1. 背景 大模型(LLM)和多模态大模型(MLLM)利用基于Transformer的架构获得了很迅速的发展。为满足对这些模型的训练和轻量级微调需求,目前已有一些开源框架,如LLaMA-Factory、Firefly、FastChat、Axolotl和LMFlow等。但这些框架在支持的模型、技术和功能上…...
利用 schedule 模块在每日上午每 3 秒执行任务
一、schedule 模块基础原理与功能概述 schedule 模块维护了一个任务队列,每个任务都关联着一个特定的时间触发器和对应的执行函数。当系统时间到达任务设定的触发时间时,模块会从队列中取出相应的任务并执行其关联的函数。这种设 计模式使得开发者无需过多关注底层的时间处理…...
ruby超高级语法
以下是 Ruby 中一些 极度硬核 的语法和底层特性,涉及元编程的深渊、虚拟机原理、语法黑魔法等,适用于追求极限的 Ruby 开发者: 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def foo; "B…...
Java Stream API:现代化集合处理的艺术
Java Stream API:现代化集合处理的艺术 引言 在Java 8中引入的Stream API彻底改变了我们处理集合数据的方式。它不仅仅是一个新的工具集,更代表了一种声明式、函数式的编程范式。本文将深入探讨Java Stream的核心概念、使用场景和最佳实践。 一、什么是Stream? Stream(…...
ruby高级语法
以下是 Ruby 高级语法的详细总结,涵盖元编程、模式匹配、闭包、并发模型等核心主题: 一、元编程(Metaprogramming) 1. 动态定义方法 class DynamicClass# 使用 define_method 动态定义方法["foo", "bar"].e…...
特权FPGA之UART串口
0.简介 通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232和RS 485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250,1645…...
oracle 索引失效
在 Oracle 11g 中,索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等,解决方法需结合版本特性(如虚拟列、索引跳跃扫描)。通过执行计划分析、统计信息维护和合理使用提示(Hints),…...
MySQL查看binlog执行情况
因数据丢失,被要求使用binlog查看 执行SQL的具体情况。 拿到数据库压缩包,解压缩获得文件和文件夹若干。 如图,有17个binlog文件,目标数据库名应为corr。 已知这个数据库是安装在windows下,版本8.0. 先下载一个mysq…...
kotlin,Android,jetpack compose,日期时间设置
AI生成,调试出来学习,这些小组件会用了,就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...
sql-labs靶场 less-2
文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
ssh密钥连接远程服务器并用scp传输文件
ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH...
【锂电池SOH预测】PSO-BP锂电池健康状态预测,锂电池SOH预测(Matlab完整源码和数据)
预测效果 基于PSO-BP算法的锂电池健康状态预测研究 一、引言 1.1 研究背景与意义 在当今社会,锂电池凭借其高能量密度、长寿命及环境友好等特性,在现代能源系统中占据着举足轻重的地位。从消费电子领域如智能手机、笔记本电脑,到动力领域中…...
找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索
一、市场前景:为什么现在需要"找搭子"? 孤独经济爆发 超60%年轻人存在"精准陪伴"需求(2024社交报告) 传统社交App无法满足"非婚恋、非熟人"的中间态需求 线下活动复苏 剧本杀/飞盘等兴趣活动年增…...
《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》
前言 在数字化时代背景下,订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统,通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架,结合 MyBatis …...
软件需求分析习题汇编
需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对( )的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生( ) A. 项目开发…...
51单片机的汇编伪指令
目录 一、ORG 汇编起始地址命令 1、功能 2、语法格式 3、使用示例 4、注意事项 二、END 汇编终止命令 1、功能 2、语法格式 3、使用示例 4、注意事项 三、EQU 赋值命令 1、功能 2、语法格式 3、使用示例 4、注意事项 四、BIT 位定义命令 1、功能 2、语法格式…...
深入探究Python的re模块及其在爬虫中的应用
深入探究Python的re模块及其在爬虫中的应用 一、引言 在Python的强大生态系统中,re模块作为处理正则表达式的核心工具,发挥着举足轻重的作用。正则表达式是一种描述文本模式的强大语言,能够高效地进行字符串的匹配、查找、替换等操作。无论…...
aosp13增加摄像头控制功能实现
A13中,可以要求做一个开关来控制摄像头是否可用,约束所有使用摄像头的应用。思路:设置中增加开关设置一个属性值,在摄像头调用实现层增该值判断即可 一 开关的开发: 设置-安全中增加开关选项 代码部分&#x…...
Kotlin 之 vararg 参数向下传递的几种方式
在 Kotlin 中,vararg 参数是一种特殊的参数类型,用于表示可变数量的参数。vararg 参数是否可以向下传递,需要根据目标方法的参数类型来决定。 1、目标方法参数也是vararg类型,可直接向下传递 在 method 方法中,通过 …...
Kotlin学习
kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭,推荐几款开源的Kotlin的Android项目...
AI写程序:图片批量重命名工具 - 自动化整理您的图片库
图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工具,用于批量重命名文件夹中的图片文件。它能够递归处理选定文件夹及其所有子文件夹中的图片,按照…...
git命令自动拉去远程分支到本地
是的,可以通过 Git 命令自动拉取远程分支并在本地创建同名分支。以下是几种方法: 方法 1:直接拉取远程分支并创建同名本地分支 git fetch origin <远程分支名> # 拉取远程分支 git checkout -b <本地分支名> origin/<远程分…...
[创业之路-364]:穿透表象:企业投资的深层逻辑与误区规避
前言: 透过现象看本质 企业一生与人生相似 看企业如同看人 三岁看大,七岁看老 三十年河东,三十年河西 企业也有品行、文化、气质、性格、赚钱、生命周期与赚钱曲线 投资公司的目的是未来赚钱,赚未来赚钱。投资创业中的企业主要看…...
UE5 蓝图里的声音
文章目录 支持的格式设置循环播放在场景中放置音频设置音频的衰减与不衰减在UI动画中播放声音使用蓝图节点播放声音按钮本身就可以播放声音 支持的格式 支持:WAV 不支持:MP3 设置循环播放 双击音频,打开音频设置,勾选Looping …...
Spring Boot 邮件发送配置遇到的坑:解决 JavaMailSenderImpl 未找到的错误
在使用 Spring Boot 开发时,我们经常需要通过邮件发送功能来实现某些业务逻辑。为了方便快速集成,Spring Boot 提供了一个非常好用的 spring-boot-starter-mail 模块,帮助我们轻松发送邮件。但是,在配置过程中可能会遇到一些问题&…...
路由表的最终地址 root 路由跟踪,最终到哪里去
在路由跟踪(如tranceroute或trancert命令)中,最终地址是目标主机或服务器的IP地址或域名所对应的实际网络地址; 路由跟踪的目的是显示数据包从本地主机到目标主机所经过的每一跳路由器或网络节点,而最终地址是数据包要到达的目标设备。 1.路由跟踪的最终地址 目标主机:路…...
Docker面试全攻略(一):镜像打包、容器运行与高频问题解析
引言 在云原生和微服务架构盛行的今天,Docker 已成为后端开发的必备技能。本文从 面试高频考点 出发,系统梳理 Docker 镜像构建、容器运行的核心知识点,助你轻松应对 Docker 相关的技术面试! 一、Docker 镜像构建核心(面试必问) 1. Dockerfile 核心命令与参数 FROM:基…...
方法的重写
目录 1、重写的概念2、方法重写的规则3、重写 VS 重载 1、重写的概念 重写,也称为覆盖,是子类对父类的非构造、非静态、非 final 修饰、非 private 修饰的方法的实现过程的重新编写。重写可以让子类根据需要来实现父类的方法。方法重写是子类与父类的一…...
搭建hadoop集群模式并运行
3.1 Hadoop的运行模式 先去官方看一看Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster. 本地模式:数据直接存放在Linux的磁盘上,测试时偶尔用一下 伪分布式:数据存放在HDFS,公司资金不足的时候用 完全分布式&a…...
【学Rust写CAD】39 over_in_in 函数(alpha256补充方法)
源码 // Similar to over_in but includes an additional clip alpha value#[inline]pub fn over_in_in(self,src: Argb, dst: Argb, clip: Alpha) -> Argb {let src_alpha self * clip;let dst_alpha !(src_alpha*src.alpha_t());// we sum src and dst before reducing…...
Visual Studio 2022 UI机器学习训练模块
VS你还是太超标了,现在机器学习都不用写代码了吗!! 右键项目解决方案,选择机器学习模型...
c# 企业级ADB通信示例
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ADB_Demo {/// <summary>/// ADB管理器,提供与Android设备的通信功能/// </summary>publ…...
linux上todesk无法使用问题
安装 x11 查看是否已安装 X11 dpkg -l | grep xserver-xorg-core 安装 X11,大概需要 17 - 222 MB(前者是在服务器上装,后者在自己的 WSL 装,具体视情况而定) sudo apt-get install xorg sudo apt-get install xauth s…...
数字IC后端项目典型问题之后端实战项目问题记录
Q1:为了更高效过掉Calibre LVS,我们要求学员在chipfinish阶段需要先做Online LVS检查。该学员在做verifyConnectivity检查发现设计中存在大量的M1 VDD_CORE Un-Connect Pin的violation,具体violation如下图所示。 数字后端培训实战项目六大典型后端实现…...
【机器学习】决策树
一、什么是决策树? 想象一下你玩“二十个问题”游戏的场景,你通过问一系列“是”或“否”的问题来猜测对方心中的物体。决策树的工作方式与此非常相似。它本质上是一个流程图结构,其中: 每个内部节点(Internal Node&…...
大模型格式化输出的几种方法
大模型格式化输出的几种方法 在开发一些和LLM相关的应用的时候,如何从大模型的反馈中拿到结构化的输出数据是非常重要的,那么本文就记录几种常用的方法。 OpenAI提供的新方法 在 OpenAI 的 Python 库中,client.beta.chat.completions.parse 是一个用于生成结构化输出的方法…...
250408_解决加载大量数据集速度过慢,耗时过长的问题
250408_解决加载Cifar10等大量数据集速度过慢,耗时过长的问题(加载数据时多线程的坑) 在做Cifar10图像分类任务时,发现每个step时间过长,且在资源管理器中查看显卡资源调用异常,主要表现为,显卡…...