实战指南:使用 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 的一些关键概念和特性:
- Binder(绑定器):Binder 是 Spring Cloud Stream 的核心概念之一,它提供了与底层消息代理之间的连接和交互。通过 Binder,Spring Cloud Stream 能够与不同的消息代理集成,例如 Kafka、RabbitMQ 等。每个消息代理都有自己的 Binder 实现,使开发者可以在不同的消息代理之间切换而无需修改应用代码。
- 消息通道(Message Channels:Spring Cloud Stream 通过消息通道来实现消息的发送和接收。应用程序可以通过绑定到消息通道来与消息代理进行交互。消息通道可以是输入通道(用于接收消息)或输出通道(用于发送消息)。
- 消息转换(Message Conversion:Spring Cloud Stream 会自动进行消息的序列化和反序列化,将消息从 Java 对象转换为消息代理支持的格式,以及将从消息代理接收的消息转换回 Java 对象。
- 发布-订阅模式:Spring Cloud Stream 支持发布-订阅模式,可以让多个消费者订阅同一个主题(topic)的消息,实现了一对多的消息通信。
- 消息分组(Message Grouping):消息分组可以将一组消费者组织在一起,共同处理相同分组 ID 的消息。这对于实现负载均衡和消息去重非常有用。
- 函数式编程模型:Spring Cloud Stream 鼓励使用函数式编程模型,通过定义处理消息的函数来实现业务逻辑。这种方式使得编写简洁、可测试的消息处理逻辑变得更加容易。
- 实时数据处理:Spring Cloud Stream 不仅用于消息传递,还可以用于实时数据处理。您可以在消息到达之后立即对其进行处理,从而支持实时分析、转换和处理。
总体而言,Spring Cloud Stream 简化了在微服务架构中使用消息传递的复杂性,提供了一种与消息代理集成的高级抽象,让开发者能够更专注于业务逻辑的实现。它的灵活性使得您能够轻松地在不同的消息代理之间切换,同时提供了强大的工具来处理消息和事件的传递,从而使您的微服务系统更具可扩展性和弹性。
消息中间件的切换只需要 更换依赖 即可。
讲讲 Kafka
Kafka 是一个开源的分布式流数据平台,最初由 LinkedIn 开发并捐赠给 Apache 软件基金会。它被设计用于处理高吞吐量、可持久化的实时数据流。Kafka 的主要目标是提供一种高效、可扩展、持久化的消息传递系统,能够处理大规模的实时数据流,同时保证数据的可靠性和可用性。
以下是 Kafka 的一些关键特性和概念:
- 发布-订阅模式:Kafka 采用发布-订阅模式,生产者(Publisher)将消息发布到主题(Topic),而消费者(Consumer)可以订阅一个或多个主题来接收消息。这使得多个消费者能够独立地从同一个主题订阅消息,实现一对多的消息传递。
- 分区和副本:Kafka 将每个主题分为多个分区,每个分区可以在不同的服务器上进行副本复制,从而提高可用性和容错性。分区和副本的组合允许 Kafka 处理大规模的消息流并保证数据的持久性。
- 持久化:Kafka 将消息以持久化的方式存储在磁盘上,确保消息在生产者发送和消费者接收之间不会丢失。消息被保存在分区中,可以根据需要保留一段时间,甚至可以通过配置来保留特定时间段的历史消息。
- 高吞吐量:Kafka 在处理消息时具有高吞吐量的能力,它能够同时处理成千上万的消息,适用于大规模的实时数据处理场景。
- 水平扩展:Kafka 支持水平扩展,可以通过添加新的服务器节点来增加吞吐量和存储容量,从而适应不断增长的数据量。
- 消息保序性:Kafka 保证在同一分区内的消息保持顺序,这对于一些需要按照顺序处理的场景非常重要。
- 流处理:Kafka 不仅用于消息传递,还可以用于实时流数据处理。Kafka Streams 是一个用于处理和分析流数据的库,可以在 Kafka 上进行流式处理,支持流数据的转换、聚合和计算等操作。
- 社区生态系统:Kafka 拥有丰富的社区生态系统,提供了许多与 Kafka 集成的工具和库,如消费者和生产者客户端、连接器(Connectors)用于将 Kafka 与其他数据源集成、Kafka 管理工具等。
总体而言,Kafka 是一个强大的分布式消息流平台,适用于许多实时数据处理和消息传递的应用场景。它的可靠性、高性能和可扩展性使得它成为构建大规模实时数据处理系统的重要组件之一。
Spring Cloud Stream 和 Kafka 之间的联系和区别
Spring Cloud Stream 是一个用于构建基于 Spring Boot 的消息驱动微服务的框架,它提供了统一的编程模型和抽象来处理消息流,而 Kafka 是 Spring Cloud Stream 支持的消息中间件之一。下面我们来讲一下它们之间的联系和区别:
联系:
-
消息驱动架构:Spring Cloud Stream 和 Kafka 都支持消息驱动架构,通过将消息作为信息传递的核心来构建应用程序。它们都支持发布-订阅模式,允许不同的微服务之间通过消息进行通信。
-
微服务和云原生:Spring Cloud Stream 是 Spring Cloud 生态系统中的一部分,专注于帮助开发人员构建云原生的微服务应用程序。Kafka 作为 Spring Cloud Stream 的一种消息中间件实现,与 Spring Cloud Stream 一起可以支持在微服务架构中使用消息传递来解耦微服务之间的通信。
-
可插拔的消息中间件:Spring Cloud Stream 提供了一个抽象层,使得在不同的消息中间件之间进行切换变得容易。它支持多种消息中间件,包括 Kafka、RabbitMQ 等,使开发人员可以根据实际需求选择合适的消息中间件。
区别:
-
定位和用途:Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它提供了统一的编程模型和抽象来简化消息传递。而 Kafka 是一个分布式流数据平台,专注于处理高吞吐量、可持久化的实时数据流。
-
功能广度:Kafka 是一个功能丰富的消息中间件,除了消息传递外,还提供了分区、副本、持久化、高吞吐量等特性。而 Spring Cloud Stream 更加专注于在微服务架构中实现消息传递。
-
编程模型:Spring Cloud Stream 提供了更加抽象的编程模型,通过 Binder 将应用程序与消息中间件解耦。开发人员只需关注业务逻辑,而不必过多关注底层的消息传递细节。Kafka 则需要更多的配置和代码来实现消息的生产和消费。
-
生态系统: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 构建高效消息驱动微服务
实战指南:使用 Spring Cloud Stream 集成 Kafka 构建高效消息驱动微服务 视频地址: Stream为什么被引入-尚硅谷SCS-1-内容介绍-图灵诸葛 官方文档: 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中使用图片时,可以通过<image>标签将图片显示在页面上。这个标签可以指定src属性来引用图片,并且可以通过mode属性来设置图片的显示模式。除此之外,还可以利用click事件来实现图片的点击事件。在编写代码时,要注意…...
docker-compose 安装gitlab
写在前面的话:docker-compose的文件是通用的,因此可以切换任意版本的gitlab的镜像版本。 往期docker-compose部署系列如: docker-compose语法格式docker-compose部署openldapdocker-compose 安装Sonar并集成gitlab 文章目录 1. 参考文档2. 环…...
到底是前端验证还是后端验证
背景 软件应用研发中, 前端验证还是后端验证这是意识与认知问题。鉴于某些入门同学还不清楚,我们再来看下: 一. 从软件行业来自国外 Q: 前端验证和后端验证都是对同一个数据的验证,有什么区别? A: 二者的目的不同&…...
AlignBench:量身打造的中文大语言模型对齐评测
对齐(Alignment),是指大语言模型(LLM)与人类意图的一致性。换言之,就是让LLM生成的结果更加符合人类的预期,包括遵循人类的指令,理解人类的意图,进而能产生有帮助的回答等…...
asp.net core 教程
asp.net core 教程 写在前面新建项目Get和PostGETPOST MVC-模型控制视图如何通俗理解MVCMVC架构---文件夹详解Connected ServicesPropertieswwwroot依赖项ControllersModelsViews 代码实例 API模型(前后端分离)前端代码后端代码 文件配置优先级优先级顺序…...
概率论1:下象棋问题(3.5)
每日小语 时刻望着他人的眼色行事,是腾飞不了的。自己怎么想就积极地去做,这是需要胆量的。——广中平佑 题目 甲、乙二人下象棋, 每局甲胜的概率为a,乙胜的概率为b. 为简化问题,设没有和局的情况,这意味着a b1. 设想…...
LLM调研笔记
这里写目录标题 LLM调研1. 外挂知识库2. 微调数据prompting和fine-tuning的对比 3. NLP的发展4. 大语言模型的涌现能力5. 大模型的几个关键技术6. 数据预处理7. 主流架构8. 模型训练9. 大模型的微调10. 大模型的使用11. 大模型的评估 LLM调研 大模型的不足:在特定的…...
K8S----RBAC
一、角色、绑定、用户 1、 Role 与ClusterRole 1、Role 总是要在一个命名空间中设置权限,当需要创建一个Role的时候必须指定命名空间; 2、ClusterRole 是非命名空间范围的,不受命名空间局限 2 、RoleBinding 与ClusterRoleBinding 1、RoleBinding 是受命名空间限制的 2、…...
HBase 超大表迁移、备份、还原、同步演练手册:全量快照 + 实时同步(Snapshot + Replication)不停机迁移方案
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
统计直线上2个点的分布占比
直线上有6个格子,向格子里扔2个石子,共有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种两个石子是连着的,共有5个 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 …...
uniapp创建/运行/发布项目
1、产生背景----跨平台应用框架 在移动端各大App盛行的时代,App之间的竞争也更加激烈,他们执着于让一个应用可以做多个事情 所以就应运而生了小程序,微信小程序、支付宝小程序、抖音小程序等等基于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部署深度学习算法时,往往会通过opencv的Mat及算法将图像转换为固定的格式作为输入openvino图像的前后处理后边将在单独的文章中写出今晚空闲搜了一些opencv_cuda的使用方法,在此总结一下前…...
Android.bp 和 Android.mk 的对应关系
参考 Soong 构建系统 Android.mk 转为 Android.bp 没有分支、循环等流程控制的简单的 Android.mk ,可以通过 androidmk 命令转化为 Android.bp source 、lunch 之后执行即可。 androidmk Android.mk > Android.bp对应关系 Android 13 ,build/soon…...
力扣-收集足够苹果的最小花园周长[思维+组合数]
题目链接 题意: 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。 给你一个整…...
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
文章目录 📝前言🌠什么是位段?🌉 位段的内存分配🌉VS怎么开辟位段空间呢?🌉位段的跨平台问题🌠 位段的应⽤🌠位段使⽤的注意事项🚩总结 📝前言 本…...
基于Hexo+GitHub Pages 的个人博客搭建
基于HexoGitHub Pages 的个人博客搭建 步骤一:安装 Node.js 和 Git步骤二:创建Github Pages 仓库步骤二:安装 Hexo步骤三:创建 Hexo 项目步骤四:配置 Hexo步骤五:创建新文章步骤六:生成静态文件…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
