实战指南:使用 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步骤五:创建新文章步骤六:生成静态文件…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...