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

实战指南:使用 Spring Cloud Stream 集成 Kafka 构建高效消息驱动微服务

实战指南:使用 Spring Cloud Stream 集成 Kafka 构建高效消息驱动微服务

视频地址:

  • Stream为什么被引入-尚硅谷
  • SCS-1-内容介绍-图灵诸葛

官方文档:

  • Spring Cloud Stream

什么是 Spring Cloud Stream?

Spring Cloud Stream(SCS) 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot,提供了一种简化的方式来处理消息和事件的传递。它旨在为不同消息代理(如 Kafka、RabbitMQ、Apache Kafka 等)提供统一的编程模型,使开发者能够更轻松地在微服务架构中使用消息通信。

以下是 Spring Cloud Stream 的一些关键概念和特性:

  1. Binder(绑定器):Binder 是 Spring Cloud Stream 的核心概念之一,它提供了与底层消息代理之间的连接和交互。通过 Binder,Spring Cloud Stream 能够与不同的消息代理集成,例如 Kafka、RabbitMQ 等。每个消息代理都有自己的 Binder 实现,使开发者可以在不同的消息代理之间切换而无需修改应用代码。
  2. 消息通道(Message Channels:Spring Cloud Stream 通过消息通道来实现消息的发送和接收。应用程序可以通过绑定到消息通道来与消息代理进行交互。消息通道可以是输入通道(用于接收消息)或输出通道(用于发送消息)。
  3. 消息转换(Message Conversion:Spring Cloud Stream 会自动进行消息的序列化和反序列化,将消息从 Java 对象转换为消息代理支持的格式,以及将从消息代理接收的消息转换回 Java 对象。
  4. 发布-订阅模式:Spring Cloud Stream 支持发布-订阅模式,可以让多个消费者订阅同一个主题(topic)的消息,实现了一对多的消息通信。
  5. 消息分组(Message Grouping):消息分组可以将一组消费者组织在一起,共同处理相同分组 ID 的消息。这对于实现负载均衡和消息去重非常有用。
  6. 函数式编程模型:Spring Cloud Stream 鼓励使用函数式编程模型,通过定义处理消息的函数来实现业务逻辑。这种方式使得编写简洁、可测试的消息处理逻辑变得更加容易。
  7. 实时数据处理:Spring Cloud Stream 不仅用于消息传递,还可以用于实时数据处理。您可以在消息到达之后立即对其进行处理,从而支持实时分析、转换和处理。

总体而言,Spring Cloud Stream 简化了在微服务架构中使用消息传递的复杂性,提供了一种与消息代理集成的高级抽象,让开发者能够更专注于业务逻辑的实现。它的灵活性使得您能够轻松地在不同的消息代理之间切换,同时提供了强大的工具来处理消息和事件的传递,从而使您的微服务系统更具可扩展性和弹性。

消息中间件的切换只需要 更换依赖 即可。

讲讲 Kafka

Kafka 是一个开源的分布式流数据平台,最初由 LinkedIn 开发并捐赠给 Apache 软件基金会。它被设计用于处理高吞吐量、可持久化的实时数据流。Kafka 的主要目标是提供一种高效、可扩展、持久化的消息传递系统,能够处理大规模的实时数据流,同时保证数据的可靠性和可用性。

以下是 Kafka 的一些关键特性和概念:

  1. 发布-订阅模式:Kafka 采用发布-订阅模式,生产者(Publisher)将消息发布到主题(Topic),而消费者(Consumer)可以订阅一个或多个主题来接收消息。这使得多个消费者能够独立地从同一个主题订阅消息,实现一对多的消息传递。
  2. 分区和副本:Kafka 将每个主题分为多个分区,每个分区可以在不同的服务器上进行副本复制,从而提高可用性和容错性。分区和副本的组合允许 Kafka 处理大规模的消息流并保证数据的持久性。
  3. 持久化:Kafka 将消息以持久化的方式存储在磁盘上,确保消息在生产者发送和消费者接收之间不会丢失。消息被保存在分区中,可以根据需要保留一段时间,甚至可以通过配置来保留特定时间段的历史消息。
  4. 高吞吐量:Kafka 在处理消息时具有高吞吐量的能力,它能够同时处理成千上万的消息,适用于大规模的实时数据处理场景。
  5. 水平扩展:Kafka 支持水平扩展,可以通过添加新的服务器节点来增加吞吐量和存储容量,从而适应不断增长的数据量。
  6. 消息保序性:Kafka 保证在同一分区内的消息保持顺序,这对于一些需要按照顺序处理的场景非常重要。
  7. 流处理:Kafka 不仅用于消息传递,还可以用于实时流数据处理。Kafka Streams 是一个用于处理和分析流数据的库,可以在 Kafka 上进行流式处理,支持流数据的转换、聚合和计算等操作。
  8. 社区生态系统:Kafka 拥有丰富的社区生态系统,提供了许多与 Kafka 集成的工具和库,如消费者和生产者客户端、连接器(Connectors)用于将 Kafka 与其他数据源集成、Kafka 管理工具等。

总体而言,Kafka 是一个强大的分布式消息流平台,适用于许多实时数据处理和消息传递的应用场景。它的可靠性、高性能和可扩展性使得它成为构建大规模实时数据处理系统的重要组件之一。

Spring Cloud Stream 和 Kafka 之间的联系和区别

Spring Cloud Stream 是一个用于构建基于 Spring Boot 的消息驱动微服务的框架,它提供了统一的编程模型和抽象来处理消息流,而 Kafka 是 Spring Cloud Stream 支持的消息中间件之一。下面我们来讲一下它们之间的联系和区别:

联系:

  1. 消息驱动架构:Spring Cloud Stream 和 Kafka 都支持消息驱动架构,通过将消息作为信息传递的核心来构建应用程序。它们都支持发布-订阅模式,允许不同的微服务之间通过消息进行通信。

  2. 微服务和云原生:Spring Cloud Stream 是 Spring Cloud 生态系统中的一部分,专注于帮助开发人员构建云原生的微服务应用程序。Kafka 作为 Spring Cloud Stream 的一种消息中间件实现,与 Spring Cloud Stream 一起可以支持在微服务架构中使用消息传递来解耦微服务之间的通信。

  3. 可插拔的消息中间件:Spring Cloud Stream 提供了一个抽象层,使得在不同的消息中间件之间进行切换变得容易。它支持多种消息中间件,包括 Kafka、RabbitMQ 等,使开发人员可以根据实际需求选择合适的消息中间件。

区别:

  1. 定位和用途:Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它提供了统一的编程模型和抽象来简化消息传递。而 Kafka 是一个分布式流数据平台,专注于处理高吞吐量、可持久化的实时数据流。

  2. 功能广度:Kafka 是一个功能丰富的消息中间件,除了消息传递外,还提供了分区、副本、持久化、高吞吐量等特性。而 Spring Cloud Stream 更加专注于在微服务架构中实现消息传递。

  3. 编程模型:Spring Cloud Stream 提供了更加抽象的编程模型,通过 Binder 将应用程序与消息中间件解耦。开发人员只需关注业务逻辑,而不必过多关注底层的消息传递细节。Kafka 则需要更多的配置和代码来实现消息的生产和消费。

  4. 生态系统:Spring Cloud Stream 作为 Spring Cloud 生态系统的一部分,可以与其他 Spring Cloud 组件无缝集成,如服务发现、负载均衡等。Kafka 作为独立的消息中间件,可以在不同的技术栈中使用。

总的来说,Spring Cloud Stream 和 Kafka 都是用于处理消息的技术,但它们的定位和功能略有不同。Spring Cloud Stream 提供了更加抽象和便捷的方式来构建消息驱动的微服务,而 Kafka 提供了更丰富的特性来处理实时数据流。在使用时,开发人员可以根据项目需求和技术栈的选择来决定是否使用 Spring Cloud Stream 以及选择哪种消息中间件。

实践

集成 Kafka

引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>stream-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-binder-kafka</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
配置文件
server:port: 7888
spring:#  application:#    name: producercloud:stream:kafka:binder:brokers: ip:9092         #Kafka的消息中间件服务器zk-nodes: ip:2181        #Zookeeper的节点,如果集群,后面加,号分隔auto-create-topics: true        #如果设置为false,就不会自动创建Topic 有可能你Topic还没创建就直接调用了。bindings:output:      #这里用stream给我们提供的默认output,后面会讲到自定义outputdestination: topic #消息发往的目的地content-type: text/plain    #消息发送的格式,接收端不用指定格式,但是发送端要input:destination: topic
发送业务类

source - output

@EnableBinding(Source.class)
public class SendService {@Resourceprivate Source source;public void sendMsg(String msg) {source.output().send(MessageBuilder.withPayload(msg).build());}public void sendBody(Object object) {source.output().send(MessageBuilder.withPayload(object).build());}
}
消费者

sink - input

@EnableBinding(Sink.class)
public class RecieveService {@StreamListener(Sink.INPUT)public void recieve(Object payload){System.out.println(payload);}
}
控制器 Controller
@RestController
@RequestMapping("/send")
public class StreamController {@Resourceprivate SendService sendService;/*** 发送* localhost:7888/send/hello** @param msg 消息*/@GetMapping("/{msg}")public void send(@PathVariable("msg") String msg){sendService.sendMsg(msg);}@GetMapping("/body")public void sendFace() {// 创建一个对象Q_FACE_INPUT qFaceInput = new Q_FACE_INPUT();// set 写入数据...sendService.sendBody(qFaceInput);System.out.printf("发送 Face Data 成功");}}

自定义通道生产消息

1、创建 MyChannel 接口

/*** 自定义通道 - 模仿source接口造轮子**/
public interface MyChannel {String FACE_OUTPUT = "face_output";String HUMAN_OUTPUT = "human_output";String VEHICLE_INPUT = "vehicle_output";@Output(FACE_OUTPUT)MessageChannel faceOutput();@Output(HUMAN_OUTPUT)MessageChannel humanOutput();@Output(VEHICLE_INPUT)MessageChannel vehicleOutput();}

注意事项:

  • 一般接口上不写 @Component 注解。
  • 接口主要用于定义行为契约,而具体的实现通常由类来提供。
  • @Component 注解用于将类标识为 Spring 容器管理的组件,而不是接口。实际上,将 @Component 注解放在接口上可能会引发问题。

踩坑小记

有时候在指定类中使用 @Resource 注入的时候会报错 – 创建不了这个接口 bean,但是使用 Spring 自带的 @Autowired 注解就会没问题。(可能是因为是两个注解默认注入 bean 的方式不一样引起的)

  • Autowired 默认的注入方式为 byType(根据类型进行匹配),
  • @Resource 默认注入方式为 byName(根据名称进行匹配)

详细可参考:autowired-和-resource-的区别是什么

2、修改 application.yml 文件

server:port: 7888
spring:profiles:active: dev # 表示开发环境cloud:stream:kafka:binder:brokers: ip:9092         #Kafka的消息中间件服务器auto-create-topics: true        #如果设置为false,就不会自动创建Topic 有可能你Topic还没创建就直接调用了。bindings:# 自定义output - 生产face_output:destination: Q_FACE_INPUT_TWO_DX #消息发往的目的地human_output:destination: Q_HUMAN_INPUT_TWO_DXvehicle_output:destination: Q_VEHICLE_INPUT_TWO_DX

3、编写生产者业务类

@EnableBinding(value = {MyChannel.class})
public class SendService {@Resourceprivate MyChannel myChannel;public void sendFaceMsg(String msg) {myChannel.faceOutput().send(MessageBuilder.withPayload(msg).build());}public void sendHumanMsg(String msg) {myChannel.humanOutput().send(MessageBuilder.withPayload(msg).build());}public void sendVehicleMsg(String msg) {myChannel.vehicleOutput().send(MessageBuilder.withPayload(msg).build());}}

4、编写 Controller 控制器

@RestController
@RequestMapping("/send")
public class StreamController {@Resourceprivate SendService sendService;/*** 发送人脸数据* localhost:7888/send/face/hello** @param msg 消息*/@GetMapping("/face/{msg}")public void sendFace(@PathVariable("msg") String msg){sendService.sendFaceMsg(msg);}/*** 发送人体数据** @param msg */@GetMapping("/human/{msg}")public void sendHuman(@PathVariable("msg") String msg){sendService.sendHumanMsg(msg);}/*** 发送车辆数据标准** @param msg */@GetMapping("/veh/{msg}")public void sendVehicle(@PathVariable("msg") String msg){sendService.sendVehicleMsg(msg);}}

自定义订阅频道

1、创建一个订阅通道注解

@Component
public interface MySubscribableChannel {String INPUT1 = "input1";String INPUT2 = "input2";String INPUT3 = "input3";@Input(INPUT1)SubscribableChannel input1();@Input(INPUT2)SubscribableChannel input2();}

2、application.yml 文件配置对应的主题信息

spring:profiles:active: dev # 表示开发环境cloud:stream:kafka:binder:brokers: ip:9092         #Kafka的消息中间件服务器auto-create-topics: true        #如果设置为false,就不会自动创建Topic 有可能你Topic还没创建就直接调用了。bindings:# 自定义output - 生产output1:destination: topic1 #消息发往的目的地output2:destination: topic2# input订阅消息input1:destination: topic1input2:destination: topic2

3、监听消息

    @StreamListener(INPUT1)public void subChannel (String msg){System.out.println(msg);}@StreamListener(INPUT2)public void subChannel2 (String msg){System.out.println(msg);}

其他写法参考

注意配置文件中 input-in-0 的写法

  • https://blog.csdn.net/qq_42221396/article/details/128409521
  • Spring Cloud Stream 3.1以后的使用方法_org.springframework.cloud.stream.annotation.enable

学习参考

  • Spring Cloud 系列之 Spring Cloud Stream - 风的姿态 - 博客园 (cnblogs.com)

  • Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收 - 东北小狐狸 - 博客园 (cnblogs.com)

  • Spring Cloud Stream中文指导手册_书上有云的博客-CSDN博客

  • 官方文档中文版!Spring Cloud Stream 快速入门

  • Springcloud Stream详解及整合kafka - 简书 (jianshu.com)

相关文章:

实战指南:使用 Spring Cloud Stream 集成 Kafka 构建高效消息驱动微服务

实战指南&#xff1a;使用 Spring Cloud Stream 集成 Kafka 构建高效消息驱动微服务 视频地址&#xff1a; Stream为什么被引入-尚硅谷SCS-1-内容介绍-图灵诸葛 官方文档&#xff1a; Spring Cloud Stream 什么是 Spring Cloud Stream? Spring Cloud Stream(SCS) 是一个用于构…...

线性代数基础【3】向量

第一节 向量的概念与运算 一、基本概念 ①向量 ②向量的模(长度) ③向量的单位化 ④向量的三则运算 ⑤向量的内积 二、向量运算的性质 (一)向量三则运算的性质 α β β αα (β γ) (α β) γk (α β) kα kβ(k l) α kα lα (二)向量内积运…...

Spring Boot + MinIO 实现文件切片极速上传技术

文章目录 1. 引言2. 文件切片上传简介3. 技术选型3.1 Spring Boot3.2 MinIO 4. 搭建Spring Boot项目5. 集成MinIO5.1 配置MinIO连接信息5.2 MinIO配置类 6. 文件切片上传实现6.1 控制器层6.2 服务层6.3 文件切片上传逻辑 7. 文件合并逻辑8. 页面展示9. 性能优化与拓展9.1 性能优…...

uniapp中如何使用image图片

当在UniApp中使用图片时&#xff0c;可以通过<image>标签将图片显示在页面上。这个标签可以指定src属性来引用图片&#xff0c;并且可以通过mode属性来设置图片的显示模式。除此之外&#xff0c;还可以利用click事件来实现图片的点击事件。在编写代码时&#xff0c;要注意…...

docker-compose 安装gitlab

写在前面的话&#xff1a;docker-compose的文件是通用的&#xff0c;因此可以切换任意版本的gitlab的镜像版本。 往期docker-compose部署系列如&#xff1a; docker-compose语法格式docker-compose部署openldapdocker-compose 安装Sonar并集成gitlab 文章目录 1. 参考文档2. 环…...

到底是前端验证还是后端验证

背景 软件应用研发中&#xff0c; 前端验证还是后端验证这是意识与认知问题。鉴于某些入门同学还不清楚&#xff0c;我们再来看下&#xff1a; 一. 从软件行业来自国外 Q: 前端验证和后端验证都是对同一个数据的验证&#xff0c;有什么区别&#xff1f; A: 二者的目的不同&…...

AlignBench:量身打造的中文大语言模型对齐评测

对齐&#xff08;Alignment&#xff09;&#xff0c;是指大语言模型&#xff08;LLM&#xff09;与人类意图的一致性。换言之&#xff0c;就是让LLM生成的结果更加符合人类的预期&#xff0c;包括遵循人类的指令&#xff0c;理解人类的意图&#xff0c;进而能产生有帮助的回答等…...

asp.net core 教程

asp.net core 教程 写在前面新建项目Get和PostGETPOST MVC-模型控制视图如何通俗理解MVCMVC架构---文件夹详解Connected ServicesPropertieswwwroot依赖项ControllersModelsViews 代码实例 API模型&#xff08;前后端分离&#xff09;前端代码后端代码 文件配置优先级优先级顺序…...

概率论1:下象棋问题(3.5)

每日小语 时刻望着他人的眼色行事&#xff0c;是腾飞不了的。自己怎么想就积极地去做&#xff0c;这是需要胆量的。——广中平佑 题目 甲、乙二人下象棋&#xff0c; 每局甲胜的概率为a,乙胜的概率为b. 为简化问题&#xff0c;设没有和局的情况&#xff0c;这意味着a b1. 设想…...

LLM调研笔记

这里写目录标题 LLM调研1. 外挂知识库2. 微调数据prompting和fine-tuning的对比 3. NLP的发展4. 大语言模型的涌现能力5. 大模型的几个关键技术6. 数据预处理7. 主流架构8. 模型训练9. 大模型的微调10. 大模型的使用11. 大模型的评估 LLM调研 大模型的不足&#xff1a;在特定的…...

K8S----RBAC

一、角色、绑定、用户 1、 Role 与ClusterRole 1、Role 总是要在一个命名空间中设置权限,当需要创建一个Role的时候必须指定命名空间; 2、ClusterRole 是非命名空间范围的,不受命名空间局限 2 、RoleBinding 与ClusterRoleBinding 1、RoleBinding 是受命名空间限制的 2、…...

HBase 超大表迁移、备份、还原、同步演练手册:全量快照 + 实时同步(Snapshot + Replication)不停机迁移方案

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…...

统计直线上2个点的分布占比

直线上有6个格子&#xff0c;向格子里扔2个石子&#xff0c;共有5种可能。 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 第1种两个石子是连着的&#xff0c;共有5个 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 …...

uniapp创建/运行/发布项目

1、产生背景----跨平台应用框架 在移动端各大App盛行的时代&#xff0c;App之间的竞争也更加激烈&#xff0c;他们执着于让一个应用可以做多个事情 所以就应运而生了小程序&#xff0c;微信小程序、支付宝小程序、抖音小程序等等基于App本身的内嵌类程序。 但是各大App他不可…...

洛谷 P2367 语文成绩 刷题笔记

P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 差分 令a[i]为b[i]数组的前缀和 a[n]b[1]b[2]b[3].....b[n]; a[n-1]b[1]b[2]b[3].....b[n-1]; 构造差分数组 b[i]a[i]-a[i-1]; 有什么好处 当我们想对a[l]--a[r]范围内所有数据加上一个数x 不必循环 for(i…...

Opencv_CUDA实现推理图像前处理与后处理

Opencv_CUDA实现推理图像前处理与后处理 通过trt 或者 openvino部署深度学习算法时&#xff0c;往往会通过opencv的Mat及算法将图像转换为固定的格式作为输入openvino图像的前后处理后边将在单独的文章中写出今晚空闲搜了一些opencv_cuda的使用方法&#xff0c;在此总结一下前…...

Android.bp 和 Android.mk 的对应关系

参考 Soong 构建系统 Android.mk 转为 Android.bp 没有分支、循环等流程控制的简单的 Android.mk &#xff0c;可以通过 androidmk 命令转化为 Android.bp source 、lunch 之后执行即可。 androidmk Android.mk > Android.bp对应关系 Android 13 &#xff0c;build/soon…...

力扣-收集足够苹果的最小花园周长[思维+组合数]

题目链接 题意&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整…...

【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇

文章目录 &#x1f4dd;前言&#x1f320;什么是位段&#xff1f;&#x1f309; 位段的内存分配&#x1f309;VS怎么开辟位段空间呢&#xff1f;&#x1f309;位段的跨平台问题&#x1f320; 位段的应⽤&#x1f320;位段使⽤的注意事项&#x1f6a9;总结 &#x1f4dd;前言 本…...

基于Hexo+GitHub Pages 的个人博客搭建

基于HexoGitHub Pages 的个人博客搭建 步骤一&#xff1a;安装 Node.js 和 Git步骤二&#xff1a;创建Github Pages 仓库步骤二&#xff1a;安装 Hexo步骤三&#xff1a;创建 Hexo 项目步骤四&#xff1a;配置 Hexo步骤五&#xff1a;创建新文章步骤六&#xff1a;生成静态文件…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...