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

SpringCloud Stream:消息驱动的微服务架构设计

在这里插入图片描述

文章目录

    • 引言
    • 一、Spring Cloud Stream基础概念
    • 二、核心组件和架构
    • 三、消息生产者实现
    • 四、消息消费者实现
    • 五、消息分组与持久化
    • 六、消息分区与扩展
    • 七、函数式编程模型
    • 八、错误处理与重试机制
    • 九、测试与监控
    • 总结

引言

在当今复杂的分布式系统环境中,微服务架构已经成为主流设计范式。然而,微服务之间的通信一直是一个挑战性问题。Spring Cloud Stream应运而生,它提供了一个轻量级的消息驱动框架,使开发人员能够构建可靠的、基于消息的微服务应用。通过抽象底层消息中间件的复杂性,Spring Cloud Stream使开发者可以专注于业务逻辑,而不必担心消息传递的技术细节。本文将深入探讨Spring Cloud Stream的核心概念、实现机制以及最佳实践,帮助读者掌握这一强大工具。

一、Spring Cloud Stream基础概念

Spring Cloud Stream是构建消息驱动微服务的框架,它基于Spring Boot和Spring Integration,提供了与消息系统集成的高度抽象。该框架的核心思想是将消息中间件的细节与应用程序逻辑分离,通过"绑定"的概念实现消息的发布与消费。开发者只需关注业务功能的实现,而不必深入理解底层消息中间件的特性和配置。Spring Cloud Stream支持多种消息中间件,包括RabbitMQ、Kafka等,并且可以在不修改代码的情况下切换不同的中间件实现。

// 添加依赖到pom.xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId><!-- 使用RabbitMQ作为消息中间件 -->
</dependency>// 或者使用Kafka
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><!-- 使用Kafka作为消息中间件 -->
</dependency>

二、核心组件和架构

Spring Cloud Stream的架构由几个关键组件组成,这些组件共同工作以提供消息驱动的功能。Destination Binders是连接消息中间件的组件,它们负责提供与外部消息系统的集成。Bindings定义了应用程序与消息中间件之间的桥梁,通过输入和输出通道连接外部消息系统。Message是Spring Cloud Stream中的传输载体,遵循Spring Messaging规范。这种架构设计使得应用程序可以通过简单的注解和接口与消息系统交互,而不必编写特定于中间件的代码。

// 定义消息通道接口
public interface MessageChannels {String OUTPUT = "output-channel"; // 发送消息的通道名String INPUT = "input-channel";   // 接收消息的通道名@Output(OUTPUT)MessageChannel output();  // 输出通道,用于发送消息@Input(INPUT)SubscribableChannel input();  // 输入通道,用于接收消息
}

三、消息生产者实现

在Spring Cloud Stream中实现消息生产者非常直观。通过定义输出通道并使用StreamBridge或函数式编程模型,我们可以轻松发送消息到指定目的地。消息生产者不需要知道消息如何路由或存储,只需关注消息的创建和发送。这种设计极大地简化了开发工作,使得即使是复杂的消息传递需求也能够被简单地实现。对于业务事件的发布,这种方式尤其适合,因为它使事件发布变得透明和可靠。

@RestController
@EnableBinding(MessageChannels.class)
public class MessageProducerController {@Autowiredprivate MessageChannels channels;// 使用通道发送消息@PostMapping("/messages")public ResponseEntity<String> sendMessage(@RequestBody String payload) {// 创建消息对象,包含有效载荷和头信息Message<String> message = MessageBuilder.withPayload(payload).setHeader("contentType", "application/json").build();// 通过输出通道发送消息channels.output().send(message);return ResponseEntity.ok("消息已发送: " + payload);}
}

四、消息消费者实现

消息消费者是处理输入消息的组件。在Spring Cloud Stream中,可以使用@StreamListener注解或者函数式方法来消费消息。消费者订阅指定的输入通道,当消息到达时,相应的处理方法会被调用。消费者可以对消息进行各种处理,包括数据转换、业务逻辑执行或者触发其他操作。消息消费模式支持多种配置,如消费者组、分区等,以满足不同的业务需求。

@Service
@EnableBinding(MessageChannels.class)
public class MessageConsumerService {private final Logger logger = LoggerFactory.getLogger(MessageConsumerService.class);// 使用StreamListener注解消费消息@StreamListener(MessageChannels.INPUT)public void receiveMessage(Message<String> message) {// 从消息中获取有效载荷String payload = message.getPayload();// 从消息头获取内容类型Object contentType = message.getHeaders().get("contentType");logger.info("接收到消息: {}, 内容类型: {}", payload, contentType);// 执行业务逻辑处理processMessage(payload);}private void processMessage(String payload) {// 实际的业务处理逻辑logger.info("处理消息: {}", payload);}
}

五、消息分组与持久化

消息分组是Spring Cloud Stream中的重要概念,它确保消息只被特定消费者组中的一个实例处理,从而实现负载均衡。通过配置消费者组,我们可以控制消息的分发策略。在微服务架构中,消息的持久化也至关重要,它确保系统即使在故障情况下也能恢复消息处理。Spring Cloud Stream通过与底层消息中间件的集成,提供了可靠的消息传递保证,包括至少一次传递和消息确认机制。

// 在application.yml中配置消费者组和持久化
spring:cloud:stream:bindings:input-channel:destination: messageDestinationgroup: messageConsumerGroup  # 定义消费者组consumer:maxAttempts: 3  # 消息处理失败后的重试次数backOffInitialInterval: 1000  # 初始重试间隔(毫秒)backOffMultiplier: 2.0  # 重试间隔的乘数defaultRetryable: true  # 默认是否可重试rabbit:  # RabbitMQ特定配置bindings:input-channel:consumer:acknowledgeMode: MANUAL  # 手动确认模式durableSubscription: true  # 持久订阅

六、消息分区与扩展

在处理大量消息时,消息分区是提高性能和可伸缩性的关键技术。Spring Cloud Stream支持消息分区,允许相关消息被发送到同一个消费者实例。这对于需要有序处理或状态管理的场景尤为重要。通过配置分区键和分区数量,我们可以控制消息的路由方式。Spring Cloud Stream还提供了多种扩展点,允许开发者自定义消息处理流程,如消息转换、错误处理和自定义中间件配置。

// 配置消息分区
spring:cloud:stream:bindings:output-channel:destination: partitionedMessagesproducer:partitionKeyExpression: payload.id  # 使用消息的id属性作为分区键partitionCount: 3  # 分区数量input-channel:destination: partitionedMessagesgroup: partitionedGroupconsumer:partitioned: true  # 启用分区消费instance-index: ${INSTANCE_INDEX}  # 实例索引,通常从环境变量获取instance-count: 3  # 实例总数

七、函数式编程模型

Spring Cloud Stream 3.x引入了基于Spring Cloud Function的函数式编程模型,这是一种更现代化、更灵活的消息处理方式。开发者可以定义消息处理函数,如Supplier(生产消息)、Consumer(消费消息)和Function(处理消息),而Spring Cloud Stream会自动将这些函数与消息通道绑定。这种方法减少了样板代码,提高了代码的可读性和可测试性。函数式模型与传统的注解驱动模型可以共存,使开发者能够逐步迁移现有应用。

@Configuration
@EnableAutoConfiguration
public class FunctionalStreamConfig {// 定义消息生产者函数@Beanpublic Supplier<Message<OrderCreatedEvent>> orderEventSupplier() {return () -> {// 创建订单事件OrderCreatedEvent event = new OrderCreatedEvent(UUID.randomUUID().toString(),"客户" + new Random().nextInt(100),new Date());// 构建并返回消息return MessageBuilder.withPayload(event).setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON).build();};}// 定义消息处理函数@Beanpublic Function<Message<OrderCreatedEvent>, Message<OrderProcessedEvent>> processOrder() {return message -> {OrderCreatedEvent input = message.getPayload();// 处理订单事件OrderProcessedEvent output = new OrderProcessedEvent(input.getOrderId(),input.getCustomerId(),"已处理",new Date());// 返回处理后的消息return MessageBuilder.withPayload(output).copyHeadersIfAbsent(message.getHeaders()).build();};}// 定义消息消费者函数@Beanpublic Consumer<Message<OrderProcessedEvent>> handleProcessedOrder() {return message -> {OrderProcessedEvent event = message.getPayload();System.out.println("订单已处理: " + event.getOrderId() + ", 状态: " + event.getStatus());};}
}

八、错误处理与重试机制

在分布式系统中,错误处理是确保系统稳定性的关键部分。Spring Cloud Stream提供了全面的错误处理机制,包括重试策略、死信队列和错误通道。当消息处理失败时,系统可以根据配置进行多次重试,使用指数退避算法增加重试间隔。如果重试耗尽,消息可以被路由到死信目的地或错误通道进行进一步处理。这种机制确保了消息不会在系统故障时丢失,并提供了灵活的恢复策略。

// 错误处理配置
spring:cloud:stream:bindings:input-channel:destination: orderEventsgroup: orderProcessingGroupconsumer:maxAttempts: 3  # 最大重试次数rabbit:bindings:input-channel:consumer:autoBindDlq: true  # 自动创建死信队列dlqTtl: 5000  # 死信队列中消息的存活时间(毫秒)dlqDeadLetterExchange:  # 死信交换机dlqDeadLetterRoutingKey:  # 死信路由键// 在代码中处理错误
@StreamListener(MessageChannels.INPUT)
public void processOrder(Message<OrderEvent> message) {try {// 业务处理逻辑OrderEvent event = message.getPayload();orderService.processOrder(event);} catch (Exception e) {// 错误处理逻辑errorHandler.handleError(message, e);// 可以决定是否重新抛出异常触发重试机制throw e;}
}// 配置错误通道监听器
@ServiceActivator(inputChannel = "input-channel.orderProcessingGroup.errors")
public void handleError(ErrorMessage errorMessage) {Throwable error = errorMessage.getPayload();Message<?> originalMessage = (Message<?>) errorMessage.getHeaders().get(AmqpHeaders.ORIGINAL_MESSAGE);// 记录错误信息log.error("处理消息时发生错误", error);// 执行错误恢复或补偿操作recoveryService.recoverFromError(originalMessage, error);
}

九、测试与监控

测试和监控对于确保消息驱动应用的可靠性至关重要。Spring Cloud Stream提供了专门的测试支持,允许开发者使用测试绑定器模拟消息流,而不需要启动实际的消息中间件。通过这种方式,可以编写单元测试和集成测试,验证消息处理逻辑的正确性。对于生产环境,Spring Cloud Stream可以与Spring Boot Actuator集成,提供丰富的监控端点和指标,帮助开发运维团队了解应用状态、消息流量和处理性能。

// 测试消息生产者
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MessageProducerTest {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic void testSendMessage() {// 准备测试数据String message = "{\"orderId\":\"12345\",\"customer\":\"test\"}";// 发送HTTP请求触发消息发送ResponseEntity<String> response = restTemplate.postForEntity("/messages", message, String.class);// 验证响应assertEquals(HttpStatus.OK, response.getStatusCode());assertTrue(response.getBody().contains("消息已发送"));}
}// 测试消息消费者
@RunWith(SpringRunner.class)
@SpringBootTest
public class MessageConsumerTest {@Autowiredprivate MessageChannels channels;@Autowiredprivate MessageConsumerService consumerService;@Testpublic void testReceiveMessage() {// 准备测试消息String payload = "{\"orderId\":\"12345\",\"customer\":\"test\"}";Message<String> message = MessageBuilder.withPayload(payload).setHeader("contentType", "application/json").build();// 直接调用消费者方法consumerService.receiveMessage(message);// 验证结果(根据具体实现检查日志或数据库等)}
}// 监控配置
management:endpoints:web:exposure:include: health,info,bindings,channelsendpoint:health:show-details: always

总结

Spring Cloud Stream为构建消息驱动的微服务提供了一个强大而灵活的框架。通过抽象底层消息中间件的复杂性,开发者可以专注于业务逻辑的实现,而不必深入了解特定消息技术的细节。本文介绍了Spring Cloud Stream的核心概念、架构组件、消息生产者和消费者的实现方式,以及重要的功能特性如消息分组、分区、函数式编程模型和错误处理机制。这些特性共同构成了一个完整的消息处理解决方案,适用于各种复杂的分布式系统场景。在微服务架构日益普及的今天,掌握Spring Cloud Stream可以帮助开发团队构建更加松耦合、可扩展和弹性的系统。通过本文提供的实践示例和最佳实践,开发者可以快速上手并充分利用这一强大工具,为企业级应用带来更高的灵活性和可维护性。

相关文章:

SpringCloud Stream:消息驱动的微服务架构设计

文章目录 引言一、Spring Cloud Stream基础概念二、核心组件和架构三、消息生产者实现四、消息消费者实现五、消息分组与持久化六、消息分区与扩展七、函数式编程模型八、错误处理与重试机制九、测试与监控总结 引言 在当今复杂的分布式系统环境中&#xff0c;微服务架构已经成…...

进程通信(进程池的模拟实现) read write函数复习 Linux ─── 第23课

目录 进程池(process pool) 第一步: 创建并初始化processpool 第二步:主进程对子进程派发任务 补充: 第三步: 子进程执行完退出进程池 回收子进程 进程池的实现 Channel.hpp ProcessPool.hpp Task.hpp main.cc makefile 匿名管道的应用: 进程池 进程池(process po…...

Docker技术全景解析

一、Docker是什么 1.1 定义 Docker是一种容器化技术平台&#xff0c;它通过操作系统级别的虚拟化&#xff0c;将应用程序及其依赖打包成标准化的可移植单元&#xff08;容器&#xff09;。这种技术实现了&#xff1a; 环境一致性&#xff1a;消除“在我机器上能跑”的问题进…...

23种设计模式-状态(State)设计模式

状态设计模式 &#x1f6a9;什么是状态设计模式&#xff1f;&#x1f6a9;状态设计模式的特点&#x1f6a9;状态设计模式的结构&#x1f6a9;状态设计模式的优缺点&#x1f6a9;状态设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是状态设计模式…...

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议&#xff1a;TCP 和 UDP1. TCP&#xff1a;面向连接的可靠传输协议2. UDP&#xff1a;无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...

C# 多标签浏览器 谷歌内核Csharp

采用框架 &#xff1a;FBrowserCEF3lib 视频演示&#xff1a;点我直达 成品下载&#xff1a; https://wwms.lanzouo.com/iYOd42rl8vje...

分布式锁实战:Redis与Redisson的深度解析

一、分布式锁的必要性 在分布式系统中&#xff0c;当多个节点需要对共享资源进行读写操作时&#xff0c;传统的本地锁&#xff08;如Java的synchronized或ReentrantLock&#xff09;无法跨节点生效。此时&#xff0c;必须引入分布式锁来保证操作的原子性和一致性。分布式锁需满…...

【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 5.zabbix监控HCL模拟网络设备 在保证zabbix-server与HCL网络相通的情况下进行如下操作。 5.1创建主机群 配置-主机群-创建主机群 图 19 取名&#xff0c;添加。 图 20 5.2 创建监控…...

如何在 Windows 上安装并使用 Postman?

Postman 是一个功能强大的API测试工具&#xff0c;它可以帮助程序员更轻松地测试和调试 API。在本文中&#xff0c;我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程&#xff1f;...

Zabbix监控K8s集群

虽然 Prometheus 被认为是 监控的Kubernetes最合适的工具 &#xff0c;但其配置复杂、存储成本高以及告警管理繁琐等问题&#xff0c;使得一些传统运维团队更倾向于使用 Zabbix 这样的成熟监控方案。Zabbix 凭借其强大的数据采集、灵活的告警机制和直观的图形化界面&#xff0c…...

基于硅基流动平台API构建定制化AI服务的实践指南

在人工智能技术快速迭代的今天&#xff0c;硅基流动平台&#xff08;SiliconFlow&#xff09;凭借其高效的计算资源调度能力和开放的API接口&#xff0c;成为开发者快速实现AI服务落地的利器。本文将深入探讨如何通过硅基流动平台的API构建一个轻量级AI服务接口&#xff0c;并提…...

自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析

在自动驾驶系统的车辆动力学建模中,自行车模型(Bicycle Model)和更复杂的汽车模型(如双轨模型或多体动力学模型)各有其适用场景和优缺点。以下是两者的详细对比及选择原因解析: 1. 模型定义与核心差异 特性自行车模型复杂汽车模型(如双轨模型)简化假设将四轮车辆简化为…...

element-ui messageBox 组件源码分享

messageBox 弹框组件源码分享&#xff0c;主要从以下两个方面&#xff1a; 1、messageBox 组件页面结构。 2、messageBox 组件属性。 一、组件页面结构。 二、组件属性。 2.1 title 标题&#xff0c;类型为 string&#xff0c;无默认值。 2.2 message 消息正文内容&#xf…...

洛谷题单1-B2025 输出字符菱形-python-流程图重构

题目描述 用 * 构造一个对角线长 5 5 5 个字符&#xff0c;倾斜放置的菱形。 输入格式 没有输入要求。 输出格式 如样例所示。用 * 构成的菱形。 输入输出样例 #1 输入 #1 输出 #1 **** *********方式-前半区推导&#xff0c;后半区逆序 代码 class Solution:static…...

23中设计模式-迭代器(Iterator)设计模式

迭代器设计模式 &#x1f6a9;什么是迭代器设计模式&#xff1f;&#x1f6a9;迭代器设计模式的特点&#x1f6a9;迭代器设计模式的结构&#x1f6a9;迭代器设计模式的优缺点&#x1f6a9;迭代器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...

第十三章:优化内存管理_《C++性能优化指南》_notes

优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例&#xff1a;智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案&#xff08;第1题&#xff09; 一、内存管理基础概念 重点知识 动态内存分配开销…...

requestAnimationFrame和requestIdleCallback分别是什么,是用在什么场景下

深入解析 requestAnimationFrame 和 requestIdleCallback requestAnimationFrame (rAF) 和 requestIdleCallback (rIC) 都是浏览器提供的 异步调度 API&#xff0c;但它们的执行时机和用途完全不同。 API主要用途何时执行是否保证执行适合场景requestAnimationFrame高优先级 U…...

SAP-ABAP:SAP BW模块架构与实战应用详解

SAP BW模块架构与实战应用详解 目录导航 核心架构分层设计数据建模关键技术典型行业应用场景BW/4HANA革新特性实施路线图常见问题解决方案学习资源推荐一、核心架构分层设计 1. 数据仓库层(Data Warehousing Layer) 组件功能说明典型对象🔄 ETL引擎数据抽取、转换、加载Da…...

准确--配置服务器文件数

某些系统可能在 /etc/security/limits.d/ 目录下有额外配置覆盖全局设置。检查是否存在冲突文件&#xff1a; ls /etc/security/limits.d/如果有文件&#xff08;如 90-nproc.conf 或 90-nofile.conf&#xff09;&#xff0c;需编辑或删除这些文件中的冲突配置。 确保系统启用…...

揭秘大数据 | 12、大数据的五大问题 之 大数据管理与大数据分析

书接上文&#xff0c;老夫讲到规划大数据战略、构建大数据的解决方案与体系架构、解决大数据问题及大数据发展历程中通常会依次涉及到大数据存储、大数据管理、大数据分析、数据科学、大数据应用这五大问题。上篇内容主要围绕的是大数据存储&#xff0c;今天主要聊一下大数据管…...

Java操作RabbitMQ

文章目录 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交换机Fanout交换机Direct交换机Topic交换机 5.声明式队列和交换机基于API声明基于注解声明 6.消息转换器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高级消…...

【MySQL】实战篇—项目需求分析:ER图的绘制与关系模型设计

在软件开发中&#xff0c;数据库是信息系统的核心部分&#xff0c;合理的数据库设计能够显著提高系统的性能和可维护性。 ER图&#xff08;实体-关系图&#xff09;是数据库设计的重要工具&#xff0c;它通过图形化的方式描述了数据实体及其相互关系&#xff0c;帮助开发者和设…...

Apache Shiro 统一化实现多端登录(PC端移动端)

Apache Shiro 是一个强大且易用的Java安全框架&#xff0c;提供了身份验证、授权、密码学和会话管理等功能。它被广泛用于保护各种类型的应用程序&#xff0c;包括Web应用、桌面应用、RESTful服务、移动端应用和大型企业级应用。 需求背景 在当今数字化浪潮的推动下&#xff…...

es新增运算符

?? ( 空值合并运算符) ?. (可选链式运算符) ?? (空值合并赋值操作符) // ?? ( 空值合并运算符)&#xff1a;这个运算符主要是左侧为null和undefined&#xff0c;直接返回右侧值 let result value ?? 默认值;. ??&#xff08;空值合并运算符&#xff09; ✅ 用于…...

数据库三级填空+应用(2)

sysadmin、dbcreator 数据是面向主题的&#xff08;2&#xff09;、集成的、非易失的、随时间不断变化的数据集合&#xff0c; 数据字典 【答案】完整性约束 数据模型成分 33【解析】顺序图主要用于描述系统内对象之间的消息发送和接收序列。 34如果把舍弃的元组也保存在结果关…...

贪心算法经典应用:最优答疑调度策略详解与Python实现

目录 引言&#xff1a;从现实场景到算法设计 一、问题背景与数学建模 1.1 现实场景抽象 1.2 时间线分析 二、贪心策略的数学证明与选择依据 2.1 贪心选择性质 2.2 证明过程 三、算法实现与代码解析 3.1 算法步骤分解 3.2 代码亮点解析 四、测试案例与结果验证 4.1 …...

把手搭建vue前后端管理系统-TAB标签通过pinia来进行管理(二十六)

目标&#xff1a;通过pinia的store来进行组件状态的统一管理&#xff0c;这样大家都可以共用到这个组件的状态信息&#xff0c;就可以实现组件的联动 一、添加侧边栏菜单的点击事件&#xff1a; 1、CommonAside.vue里面添加click的事件 <el-menu-itemv-for"item in …...

Python与数据库

目录 一、数据库 1、数据库的概念 2、数据库的表 3、字段详解 二、SQL数据库语句 1、了解SQL命令 2、CREATE命令 3、INSERT命令 三、数据库和SQL命令 四、数据库的查询与修改 1、SELECT命令 2、UPDATE命令 3、DELETE命令 4、DROP TABLE 5、SQL的注意事项 五、处…...

MyBatis中mapper.xml 的sql映射规则

一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素&#xff08;按定义顺序&#xff09;&#xff1a; cache&#xff1a;命名空间的缓存配置。cache-ref&#xff1a;引用其他命名空间的缓存。resultMap&#xff1a;自定义结果集映射。sql&#xff1a;可重用的 SQL 片段。i…...

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply...

Jenkins 配置python项目和allure

Jenkins新建项目 新建ry-api-auto-test。 添加项目描述&#xff0c;选择gitee令牌。 源码管理&#xff0c;设置仓库地址和凭证。参考我上一篇文章的链接&#xff1a;配置gitee私人令牌和凭证 构建步骤&#xff0c;因为我Jenkins部署在Windows&#xff0c;因此选择batch。…...

keda基于postgresql伸缩dify-api服务

1 概述 dify-api使用postgresql来存储数据&#xff0c;在dify控制台每新建一个聊天机器的聊天框&#xff0c;就会在conversations表里新插入一条记录&#xff0c;并且不断地更新字段updated_at&#xff0c;示例如下&#xff1a; dify# select * from conversations limit 1; …...

蓝桥杯 拼正方形

问题描述 小蓝正在玩拼图游戏。他有&#xff1a; 7385137888721 个 22 的方块10470245 个 11 的方块 他需要从中挑出一些方块来拼出一个正方形。 例如&#xff1a; 用 3 个 22 和 4 个 11 方块可以拼出一个 44 的正方形&#xff1b;用 9 个 22 方块可以拼出一个 66 的正方…...

failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析

当你满心欢喜地双击 Steam 图标&#xff0c;准备进入游戏世界时&#xff0c;屏幕上突然弹出 “failed to load steamui.dll” 的刺眼提示——这是全球数百万 Steam 用户最不愿见到的错误之一。作为 Steam 客户端的核心界面动态链接库文件&#xff0c;steamui.dll 的缺失或损坏会…...

Django之旅:第六节--mysql数据库操作增删改查(二)

前提条件(models.py已经设置好&#xff09;&#xff1a; from django.db import mmodelsclass UserInfo(models.Model):namemodels.CharFIeld(max_length32)passwordmodels.CharFIeld(max_length64)#agemodels.IntegerFIeld()操作数据语法&#xff08;在views.py文件&#xff0…...

6. 使用VUE实现前端页面的分级嵌套

1. 说明 在UI设计中&#xff0c;页面中有些部分的占用空间位置是固定不动&#xff0c;有些部分的区域是根据情况进行动态切换的。比如&#xff0c;一个网页的菜单栏和主题内容展示&#xff0c;往往菜单栏区域的导航按钮占用的空间是固定不动的&#xff0c;当用户点击不同按钮时…...

(UI自动化测试web端)第三篇:元素的常用操作方法_浏览器操作

模拟浏览器的常见操作。 1、最大化浏览器窗口 driver.maximize_window()2、浏览器后退、前进、刷新、关闭、退出 # 调用浏览器的后退 driver.back() # 调用浏览器的前进 driver.forward() # 刷新页面 driver.refresh() # 关闭当前窗口 driver.close() # 退出浏览器 driver.q…...

Ubuntu软件包离线下载安装

1、下载软件包tcpd&#xff0c;并在/var/cache/apt/archives目录中查看。 rooteducoder:~# apt-get install -d tcpd Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed:tcpd …...

第十节 MATLAB逻辑运算

MATLAB逻辑运算都是针对元素的操作&#xff0c;运算结果是特殊的逻辑数组&#xff1b;在逻辑分析时&#xff0c;逻辑&#xff08;真&#xff09;用1表示&#xff0c;逻辑假用0表示&#xff0c;逻辑运算中所有的非零元素作为1处理。 注意&#xff1a; 使用MATLAB逻辑运算时的语…...

初识哈希表

一、题意 给定一个整数数组 nums 和一个目标值 target&#xff0c;要求你在数组中找出和为目标值的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 示例&#xff1a; 给定 nums [2, 7, …...

Ajax与Axios,以及Apifox的入门使用

Ajax与Axios&#xff0c;以及Apifox的入门使用 作者&#xff1a;blue 时间&#xff1a;2025.3.20 文章目录 Ajax与Axios&#xff0c;以及Apifox的入门使用1.Ajax2.Axios3.Apifox的基本使用内容Path 参数定义语法用途 Query 参数定义语法用途 1.Ajax 概念&#xff1a;Asynchr…...

jmm-java内存模型

java内存模型----底层原理 底层原理 从Java代码到最终执行的CPU指令的流程&#xff1a; 最开始&#xff0c;我们编写的Java代码&#xff0c;是*.java文件在编译&#xff08;javac命令&#xff09;后&#xff0c;从刚才的*.java文件会变出一个新的Java字节码文件&#xff08;…...

机器学习——KNN数据均一化

在KNN&#xff08;K-近邻&#xff09;算法中&#xff0c;数据均一化&#xff08;归一化&#xff09;是预处理的关键步骤&#xff0c;用于消除不同特征量纲差异对距离计算的影响。以下是两种常用的归一化操作及其核心要点&#xff1a; 质押 一 、主要思想 1. 最值归一化&#…...

页面元素内容太长,给元素添加title

一、需求 页面元素内容太长&#xff0c;给元素添加title 二、实现 1、直接使用title属性 <div target"_blank" class"text-overflow" title"叉车司机">叉车司机</div> 2、使用tdesign的Popup 弹出层 <t-popup>触发元素&…...

【Git多分支使用教程】

Git多分支使用教程 Git多分支使用手册目录多分支只拉取一个多分支拉取指定几个步骤 1&#xff1a;克隆第一个分支步骤 2&#xff1a;获取其他分支 常见问题与解决方法1. 错误&#xff1a;origin/分支名 is not a commit2. 分支名称冲突3. --single-branch 限制 总结 Git多分支使…...

【408--复习笔记】数据结构

【408--复习笔记】数据结构 1.绪论数据结构基本概念• 请简述数据结构的定义。• 数据结构中数据、数据元素、数据项、数据对象的区别是什么&#xff1f; 算法相关• 什么是算法&#xff1f;算法的五个重要特性是什么&#xff1f;• 如何理解算法的时间复杂度和空间复杂度&…...

使用 Vite 提升前端开发体验:入门与配置指南

在现代前端开发中&#xff0c;构建工具的选择对开发效率和项目性能有着至关重要的影响。Vite 是一个新兴的前端构建工具&#xff0c;由 Vue.js 的作者尤雨溪开发&#xff0c;旨在通过利用现代浏览器的原生 ES 模块特性&#xff0c;提供更快的开发服务器启动速度和更高效的热更新…...

WPS JS宏编程教程(从基础到进阶)--第二部分:WPS对象模型与核心操作

第二部分&#xff1a;WPS对象模型与核心操作 WPS对象的属性、方法、集合 工作簿对象常用表达方式工作表对象常用表达方式单元格对象常用表达方式 单元格操作实战 单元格复制与重定位单元格偏移与尺寸调整 颜色设置专题 索引颜色与RGB颜色按条件动态设置单元格颜色 第二部分&…...

瑞数信息《BOTS自动化威胁报告》正式发布

在数字化时代&#xff0c;BOTS自动化攻击如同一场无声的风暴&#xff0c;正以前所未有的态势席卷全球网络空间。为了让各行业更好地应对自动化威胁挑战&#xff0c;瑞数信息作为BOTS自动化攻击防护领域的专业厂商&#xff0c;多年来持续输出BOTS自动化威胁报告&#xff0c;为各…...

【NUUO 摄像头】(弱口令登录漏洞)

漏洞简介&#xff1a;NUUO 是NUUO公司的一款小型网络硬盘录像机设备。 NUUO NVRMini2 3.0.8及之前版本中存在后门调试文件。远程攻击者可通过向后门文件handle_site_config.php发送特定的请求利用该漏洞执行任意命令。 1.Fofa搜索语句&#xff1a; 在Fofa网站&#xff0c;搜索&…...