Kafka高频面试题整理

文章目录

  • 1、什么是Kafka?
  • 2、kafka基本概念
  • 3、工作流程
  • 4、Kafka的数据模型与消息存储机制
      • 1)索引文件
      • 2)数据文件
  • 5、ACKS 机制
  • 6、生产者重试机制:
  • 7、kafka是pull还是push
  • 8、kafka高性能高吞吐的原因
    • 1)磁盘顺序读写:保证了消息的堆积
    • 2)零拷贝机制
    • 3)分区分段+索引
    • 4)批量压缩
    • 5)直接操作pagecache
  • 9、kafka的rebalance是什么
    • 1) Rebalance 的触发条件
    • 2)Rebalance 过程
    • 3)分区分配策略
    • 4)Rebalance 的影响
    • 5)Rebalance 的优化
  • 10、kafka能保证消息的顺序消费吗
  • 11、kafka消息如何保证不被重复消费
  • 12、kafka如何保证消息不丢失
    • 1)生产者端保证
    • 2)Broker端保证
    • 3)消费者端保证
    • 4)事务保证
  • 13、简述kafka副本同步机制

1、什么是Kafka?

Kafka 是一个分布式流处理平台,最初由Linkedln开发并开源,后来成为Apache软件基金会的一个顶级项目。它被设计用于高吞吐量、持久性、分布式的数据流处理。

2、kafka基本概念

  • Producer - 消息生产者,就是向kafka broker发消息的客户端
  • Consumer - 消息消费者,是消息的使用方,负责消费Kafka服务器上的消息。
  • Topic - 主题,由用户定义并配置在Kafka服务器,用于建立Producer和Consumer之间的订关系。生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。
  • Partition - 消息分区,一个topic可以分为多个 partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id (offset)
  • Broker - 一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
  • Consumer Group - 消费者分组,用于归组同类消费者。每个consumer属于一个特定的consumer group,多个消费者可以共同消息一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有同一个分组名称,通常也被称为消费者集群。
  • Offset - 消息在partition中的偏移量。每一条消息在partition都有唯一的偏移量,消息者可以指定偏移量来指定要消费的消息。

3、工作流程

在这里插入图片描述

  • producer先从zookeeper的"/brokers/…/state"节点找到该partition的leader
  • producer将消息发送给该leader
  • leader将消息写入本地log
  • followers从leader pull消息
  • 写入本地log后向leader发送ACK
  • leader收到所有SR中的replication的ACK后,增加HW (high watermark.最后commit 的offset)并向producer发送ACK

tips:Kafka 中消息是以topic 进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。topic 是逻辑上的概念,而partition 是物理上的概念,每个partition 对应一个log 文件,该log 文件中存储的就是producer 生产的数据。Producer 生产的数据会被不断追加到该log 文件未端,且每条数据都有自己的offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

4、Kafka的数据模型与消息存储机制

消息存储机制:
在这里插入图片描述
Kafka 有Topic 和 Partition 两个概念,一个 Topic 可以有多个 Partition。在实际存储的时候,Topic + Partition 对应一个文件夹,这个文件夹对应的是这个 Partition 的数据。在 Kafka 的数据文件目录下,一个 Partition 对应一个唯一的文件夹。如果有 4个 Topic,每个 Topic 有 5个Partition,那么一共会有 4*5 =20 个文件夹。而在 文件夹下,Kafka 消息是采用 Segment File 的存储方式进行存储的。
Segment File 的大概意思是: 将大文件拆分成小文件来存储,这样一个大文件就变成了一段一段 (Segment 段)。这样的好处是 10 加载速度快,不会有很长的10 加载时间。Kafka 的消息存储就采用了这种方式。
在这里插入图片描述
如上图所示,在一个文件夹下的数据会根据 Kafka 的配置拆分成多个小文件。拆分规则可以根据文件大小拆分,也可以根据消息条数拆分,这个是 Kafka 的一个配置,这里不细说。

在 Kafka 的数据文件夹下,分为两种类型的文件: 索引文件 (index File)和数据文件(Data File) 。索引文件存的是消息的索引信息,帮助快速定位到某条消息。数据文件存储的是具体的消息内容。

1)索引文件

索引文件的命名统一为数字格式,其名称表示 Kafka 消息的偏移量
索引文件存储的是简单地索引数据,其格式为: [N,Position]。其中 N 表示索引文件里的第几条消息,而 Position则表示该条消息在数据文件(Log File) 中的物理偏移地址。例如下图中的13.497,表示:索引文件里的第 3 条消息(即 offset 368772 的消息,368772 =368769+3),其在数据文件中的物理偏移地址为 497。
在这里插入图片描述

2)数据文件

数据文件就是所有消息的一个列表,而每条消息都有一个固定的格式,如下图所示。
在这里插入图片描述
从上图可以看到 Kafka 消息的物理结构,其包含了 Kafka 消息的 ofset 信息、Kafka 消息的大小信息、版本号等等。有了这些信息之后,我们就可以正确地读取到 Kafka 消息的实际内容。

5、ACKS 机制

在 Kafka 中,消息的 ACK (Acknowledgment,确认)机制与生产者的 acks 配置有关。acks 配置表示生产者在接收到消息后等待副本同步确认的方式,具体取值有:

  • acks=0:
    意义: 生产者在成功将消息发送给 Kafka 服务端后不等待任何确认
    结果: 生产者无法知道消息是否成功到达 Kafka 服务器,可能会导致消息的丢失。这种配置下,生产者不会收0到任何 ACK。
  • acks=1:
    意义: 生产者在成功将消息发送给 Kafka 服务端后,等待该分区的首领节点 (leader)确认
    结果: 生产者会收到分区首领节点的 ACK。这意味着只要分区首领节点成功接收到消息,生产者就会得到确o认,而不需要等待其他副本。
  • acks=all 或 acks=-1:
    意义: 生产者在成功将消息发送给 Kafka 服务端后,等待所有分区副本确认
    结果:生产者会等待分区的所有副本都成功接收到消息并确认。这是最安全的配置,因为只有当所有副本都确o认接收到消息后,才认为消息被成功提交。

6、生产者重试机制:

Kafka 生产者在发送消息后,如果设置了等待服务器的确认(通过 acks 参数配置),会等待一定时间来收到来自服务器的确认 (ack)。这个等待时间由 timeout.ms 参数控制,默认是 10000 毫秒 (10秒),如果在等待时间内没有收到服务器的确认,生产者可以选择重试发送或者处理发送失败的逻辑。这取决于生产者的配置。通常,生产者会根据配置的重试次数重试间隔来进行重试,以确保消息最终被成功发送。
在 Kafka 的生产者配置中,你可以找到以下与重试相关的配置项:

  • retries: 定义了生产者在发送消息时的最大重试次数.
  • retry.backoff.ms: 定义了两次重试之间的等待时间间隔。

7、kafka是pull还是push

在 Kafka 中,消费者以 pull 模式工作。

  • 优势:消费者通过定期向 Kafka Broker 发送请求来拉取消息。消费者可以根据自己的处理能力和需求来控制拉取的频率和每次拉取的消息量。可以批量拉取也可以单条拉取。
  • 缺点:如果Kafka没有数据,会导致consumer空循环,消耗资源,可以通过参数设置,consumer拉取为空或者没有达到一定数量时阻塞(释放cpu)。

8、kafka高性能高吞吐的原因

1)磁盘顺序读写:保证了消息的堆积

  • 磁盘顺序读写:
    Kafka 消息以日志的形式顺序写入磁盘,利用现代操作系统的页面缓存和顺序磁盘写入的高效性,极大地提高了写入性能。磁盘预读,预读即在读取的起始地址连续读取多个页面。
  • 分区(Partitioning):
    主题被划分为多个分区,每个分区在物理上是一个单独的日志文件,允许并行写入和读取。这种设计可以将负载分摊到多个服务器上,提高整体吞吐量。

Kafka 消息不是放在内存,也不依赖堆内存,而是放在页面缓存

2)零拷贝机制

Kafka 利用操作系统的零拷贝机制来减少 CPU 资源的消耗。通过直接将数据从文件系统缓存发送到网络缓冲区,避免了从用户空间到内核空间的多次数据拷贝,从而提高了数据传输效率。

LINUX操作系统本身实现了零拷贝技术,Kafka利用了这个优势

传统的数据复制:为了安全等问题,用户线程不能直接操作磁盘网卡等,需要由切换成内核态,由内核线程去操作,步骤如下:

  • 读取磁盘文件数据到内核缓冲区
  • 将内核缓冲区的数据copy到用户缓冲区
  • 将用户缓冲区的数据copy到socket的发送缓冲区
  • 将socket的发送缓冲区中的数据发送到网卡、进行传输
    在这里插入图片描述
    而零拷贝技术只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中:
    在这里插入图片描述

3)分区分段+索引

  • 分段日志:
    每个分区的日志文件被分成多个段(segment),并且每个段都有自己的索引文件。这种设计不仅有助于快速查找消息,还可以方便地管理日志文件的大小和过期策略。
  • 批处理(Batching):
    消息在写入时被批处理,通过将多条消息放在同一个请求中,减少了网络往返次数,提高了网络利用率和吞吐量。

4)批量压缩

  • 高效的数据压缩:Kafka 支持多种压缩格式(如 gzip、snappy、lz4 和 zstd),生产者可以在发送消息之前对数据进行压缩。压缩不仅减少了存储空间,还减少了网络带宽的消耗,提高了整体吞吐量。

  • 异步写入:
    生产者可以以异步方式将消息发送到 Kafka,这样生产者无需等待消息被完全写入,立即返回并继续处理其他任务。

  • 批量发送:
    生产者可以批量发送消息,合并多个消息到一个请求中,减少网络交互次数,提升发送效率。

5)直接操作pagecache

直接操作pagecache,而不是JVM,避免GC耗时和创建对象耗时,且读写速度更高,进程重启,数据也不会丢失

9、kafka的rebalance是什么

Kafka 的 Rebalance(重新平衡)机制是消费者组动态调整分区分配的重要机制。它确保消费者组成员数量变化(加入或离开)或分区数量变化时,分区能被重新合理地分配到消费者上,以维持负载均衡。

1) Rebalance 的触发条件

Rebalance 机制会在以下情况下被触发:

  • 消费者加入消费者组:新的消费者加入消费者组时,需要重新分配分区。
  • 消费者离开消费者组:现有消费者离开(故障或主动关闭)时,必须重新分配分区给其他消费者。
  • 订阅主题的分区数量变化:如果一个主题增加或减少分区,也需要触发重新平衡。
  • 消费者心跳超时:消费者没有在规定时间内发送心跳(heartbeat),会被认为已离开消费者组,触发重新平衡。

2)Rebalance 过程

  • 消费者协调者(Consumer Coordinator):
    Kafka Broker 中有一个特定的组件称为消费者协调者,负责管理消费者组的成员和分配分区。
  • 消费者加入组(Join Group):
    每个消费者在启动时会向协调者发送 JoinGroup 请求,表明自己要加入某个消费者组。
    协调者收到所有消费者的 JoinGroup 请求后,选举一个消费者作为组领导(Group Leader)。
  • 组领导分配分区:
    组领导根据分区分配策略(如 Range, RoundRobin, Sticky 等)生成新的分区分配方案,并将该方案提交给协调者。
    协调者将分配方案发送给所有消费者。
  • 消费者同步(Sync Group):
    消费者收到新的分配方案后,会发送 SyncGroup 请求给协调者,表明自己已准备好接收新的分区。
    当所有消费者都发送 SyncGroup 请求后,协调者完成重新平衡。

3)分区分配策略

Kafka 提供了几种分区分配策略:

  • RangeAssignor:
    默认分配策略。按分区顺序平均分配给消费者。适合主题数较少、每个主题分区数多的情况。
  • RoundRobinAssignor:
    按轮询方式分配分区。适合主题数较多、每个主题分区数较少的情况。
  • StickyAssignor:
    尽量保持之前的分配结果,仅在需要时才重新分配分区,以减少分区重新分配的次数,减少消费者重平衡的开销。

4)Rebalance 的影响

Rebalance 是一个昂贵的操作,会导致以下影响:

  • 消息消费中断:在重新平衡过程中,所有消费者会停止消费,直到重新分配完成。
  • 负载增加:重新平衡会导致分区的重新分配和消息的重新拉取,增加系统负载。
  • 潜在数据重复消费:由于消费者可能在重新平衡前后重复拉取同一分区的消息,可能会导致数据重复消费。

5)Rebalance 的优化

为了减少 Rebalance 带来的影响,可以采取以下措施:

  • 调整 session.timeout.ms 和 heartbeat.interval.ms 参数,确保消费者故障能快速被检测到,但也要避免频繁的心跳超时触发重新平衡。
  • 消费者预分配策略:
    使用 StickyAssignor 分配策略减少分区重新分配的频率和范围。
  • 尽量减少消费者组的变动:
    避免频繁启动或停止消费者,保持消费者组的稳定性。

10、kafka能保证消息的顺序消费吗

Kafka 提供了分区内顺序保证,但不保证全局顺序。

1)分区内顺序保证

分区内消息顺序:Kafka 保证同一分区内的消息是按发送顺序存储的。因此,对于同一分区内的消息,消费者会按照它们被生产者发送的顺序来消费。

2)保证消息顺序的策略
如果需要保证某些消息的顺序性,可以采用以下策略:

  • 将所有消息放入一个分区:
    通过使用单个分区,可以保证消息的全局顺序性。然而,这样做会限制并行处理能力和吞吐量,因为单个分区只能由一个消费者线程处理。
  • 使用相同的键:
    对于需要顺序处理的消息,使用相同的键将这些消息发送到同一个分区。这种方式可以在多分区的情况下部分保证顺序性。

3)应用层排序:

如果消息需要全局顺序,消费者可以在应用层进行排序。
例如,消费者在接收到消息后,可以根据消息的时间戳或其他顺序字段进行排序处理。

11、kafka消息如何保证不被重复消费

Kafka 提供了多种机制和策略来减少消息重复消费的可能性,包括手动提交偏移量幂等性生产者事务性生产者,以及在应用层实现幂等性。通过合理配置和使用这些机制,可以在很大程度上避免消息的重复消费,并确保消息处理的准确性和可靠性。

1)手动提交(enable.auto.commit=false)允许消费者在处理完消息后手动提交偏移量。

2)Kafka 生产者从 0.11.0.0 版本开始支持幂等性。启用幂等性后,Kafka 保证相同的消息不会被多次写入,即使由于网络分区或生产者重试。

配置幂等性生产者:
设置 enable.idempotence=true

3)Kafka 还支持事务性生产者,允许将多个消息发送到多个分区作为单个原子操作,以实现端到端的消息传递保证。

配置事务性生产者:
设置 transactional.id 和 enable.idempotence=true

4)消费者幂等性
虽然 Kafka 本身并不保证消费者的幂等性,但消费者可以通过在应用层实现幂等性来避免重复处理消息。常见的策略包括:

  • 使用唯一标识符:每个消息携带唯一标识符,处理消息时检查是否已处理过该标识符。
  • 数据库去重:在数据库中保存已处理消息的偏移量或唯一标识符,确保同一个消息不会被处理多次。

12、kafka如何保证消息不丢失

Kafka 通过在生产者、Broker 和消费者端的多层机制来确保消息不丢失。合理配置和使用这些机制可以在极大程度上保证消息的可靠性和系统的稳定性。以下是一些重要的配置总结:

  • 生产者:acks=all、enable.idempotence=true、retries 和事务性生产者。
  • Broker:多副本、min.insync.replicas、日志持久化和保留策略。
  • 消费者:手动提交偏移量、再平衡监听器和事务性消费者。

1)生产者端保证

  • a. 设置 acks 参数
    acks=all:确保消息被所有同步副本确认后才返回成功。这个配置保证了即使一个副本失败,消息也不会丢失。
  • b. 重试机制
    retries:设置重试次数,当发送消息失败时自动重试,避免临时的网络问题或其他临时故障导致消息丢失。
  • c. 幂等性生产者
    enable.idempotence:开启幂等性,确保即使重试,消息也不会被重复写入。

2)Broker端保证

  • a. 副本机制
    多副本:Kafka 的每个分区都有一个主副本和多个备份副本,确保数据冗余。
    最小同步副本(min.insync.replicas):确保至少有 min.insync.replicas 副本是同步的,消息才能被写入。
  • b. 数据持久化
    日志文件持久化:Kafka 将消息持久化到磁盘,配置 log.dirs 设置日志存储目录,确保数据写入磁盘。
  • c. 数据清理策略
    日志保留策略:配置 retention.ms 和 retention.bytes 保证数据不会被过早清理,log.retention.ms 控制日志保留时间。

3)消费者端保证

  • a. 手动提交偏移量
    手动提交:消费者处理完消息后手动提交偏移量,确保在成功处理消息后才更新偏移量,防止消息处理失败导致的消息丢失。
  • b. 再平衡监听器
    再平衡监听器:实现 ConsumerRebalanceListener 接口,在分区再平衡前后提交偏移量,确保不会丢失消息。

4)事务保证

事务性生产者:确保多个消息和分区的原子写入,避免部分消息成功写入导致的数据不一致。

13、简述kafka副本同步机制

ISR详情参考:Kafka之ISR机制的理解
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java分布式计算】控制反转和依赖注入(DI IOC AOP)

考试要求:了解控制反转的基本模式,用依赖注入编写程序 目录 控制反转(Inversion of Control, IOC): 依赖注入(Dependency Injection, DI): 依赖注入的三种实现方式 具体的例子 …

LoadBalance客户端负载均衡

1. 前言Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0…

Intel平台,13600KF+3060Ti,虚拟机安装macOS 14(2024年6月)

距离上次装macOS虚拟机已经有一段时间了,macOS系统现在大版本升级的速度也是越来越快了,由于Office只支持最新三个版本的macOS,所以现在保底也得安装macOS 12了,我这次是用macOS 14做实验,13和12的安装方式和macOS 14一…

QuickLook最强大的C#开源文件预览神器

功能特点: 快速预览:用户只需选中文件并按下空格键,即可立即查看文件内容,无需打开特定应用程序或软件。 多格式支持:QuickLook支持预览几乎所有常见的文件类型,包括但不限于: 图像&#xff1…

Flink作业执行之 2.算子 StreamOperator

Flink作业执行之 2.算子 StreamOperator 前文介绍了Transformation创建过程,大多数情况下通过UDF完成DataStream转换中,生成的Transformation实例中,核心逻辑是封装了SimpleOperatorFactory实例。 UDF场景下,DataStream到Transf…

转让中字头控股集团公司步骤和条件

随着中国经济的不断发展,越来越多的企业开始积极寻求并购和收购机会。其中,国家总局中字头控股集团公司也是一个备受关注的对象。本篇文章将为您详细介绍国家总局中字头控股集团公司的收购流程及要求。详情致电咨询我或者来公司面谈。 中字头公司转让需满…

CSS实现前端小组件随笔

一.CSSJS实现打字机效果 1.1实现效果 1.2HTML部分 <span class"bottom-text"></span> 1.3CSS部分 .bottom-text {font-fanmily: "fangsong";display:inline-block;position:relative;font-size:20px;height:20px;inline-height:20px;color…

定个小目标之刷LeetCode热题(21)

这是道技巧题&#xff0c;利用了 &#xff08;num - 1&#xff09;% n 计算下标的形式来将数组元素与数组索引产生映射关系&#xff0c;代码如下&#xff0c;可以看下注释 class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n nums.lengt…

pdf格式转成jpg图片,pdf格式如何转jpg

pdf转图片的方法&#xff0c;对于许多人来说可能是一个稍显陌生的操作。然而&#xff0c;在日常生活和工作中&#xff0c;我们有时确实需要将pdf文件转换为图片格式&#xff0c;以便于在特定的场合或平台上进行分享、展示或编辑。以下&#xff0c;我们将详细介绍一个pdf转成图片…

父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱

Fathers Day 母爱如水&#xff0c;父爱如山。 相对于母爱的温柔&#xff0c;父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲&#xff0c;我们就会明白&#xff0c;到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾&#xff0c; 多给父亲一些爱的表示&a…

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…

使用Java Spring Boot生成二维码与条形码

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

牛客 第二十届西南科技大学ACM程序设计竞赛(同步赛):祖玛

题目描述 wzy 在玩一种很新的祖玛。 给定一个仅包含 小写字母 的字符串 sss , sss 由 mmm 个不同的小写字母组成&#xff0c;每个字母代表一种小球&#xff0c;在消去时会获得 相应 的分数&#xff1a; 两个及以上 相同的小球相碰就会消失&#xff08;在发射小球前因为无相碰&…

ffmpeg解封装rtsp并录制视频-(2)使用VLC模拟一个rtsp服务器并用ffmpeg解封装该rtsp流

VCL模拟服务器并打开播放该视频文件&#xff1a; - 准备好一个mp4文件&#xff0c;打开vlc软件 - 选择“媒体”》“流” - 添加一个mp4文件 - 点击下方按钮选择“串流” - 下一步目标选择rtsp 点击“添加” - 端口默认8554 - 路径设置 /test - 用…

SinNerf理解和效果

文章目录 SinNerf 解决的问题方法和结构自己训练的效果 SinNerf 解决的问题 该方法主要解决的问题是&#xff1a; 现有都使用多张照片来进行nerf 表示的学习&#xff0c;这篇文章的话&#xff0c;主要是想使用一张单视角的照片来Nerf表示的学习。通过从单张照片中得到的伪标签…

【SpringBoot集成Spring Security】

一、前言 Spring Security 和 Apache Shiro 都是安全框架&#xff0c;为Java应用程序提供身份认证和授权。 二者区别 Spring Security&#xff1a;重量级安全框架Apache Shiro&#xff1a;轻量级安全框架 关于shiro的权限认证与授权可参考小编的另外一篇文章 &#xff1a; …

IDEA模版快速生成Java方法体

新建模版组myLive 在模版组下新建模版finit 在模版text内输入以下脚本 LOGGER.info("$className$.$methodName$>$parmas1$", $parmas2$); try {} catch (Exception e) {LOGGER.error("$className$.$methodName$>error:", e); }LOGGER.info("$c…

win10没有Hyper-v的解决方法

win10没有Hyper-v的解决方法 问题&#xff1a;最近想装下docker&#xff0c;但是在控制面板-程序-启用或关闭Windows功能下找不到Hyper-v节点。 废话不多说&#xff0c;直接上实操教程 1.将下面命令复制到文本文档中&#xff0c;并将文档重命名Hyper.cmd pushd "%~dp0&q…

Spring Boot实战:图书信息网站

实战概述&#xff1a;Spring Boot图书信息网站开发 项目背景 随着数字化时代的到来&#xff0c;图书信息网站为用户提供了一个便捷的在线浏览和购买图书的平台。本实战项目旨在通过Spring Boot框架开发一个图书信息网站&#xff0c;实现图书展示、用户登录和管理等功能。 项…

Android 自定义View

我们所有的试图都是起源于自定义View&#xff0c;包括ViewGroup也是继承于它&#xff0c;可以说它是视图组件之父。 我们可以从它的大致流程来分为四个部分&#xff1a; 构造方法&#xff0c;onMeasure&#xff0c;onLayout&#xff0c;onDraw 构造方法&#xff1a; 它主要有…