Kafka 快速入门
目录
介绍
KafKa 相关术语
编辑 Kafka的工作流程
生产者向kafka发送数据的流程
Kafka选择分区的模式
Kafka选择分区的模式
数据消费
kafka的文件存储机制
topic、partition和segment
存储和查找message的过程
数据写入过程
数据查找过程
注意事项
kafka管理UI
概述
部署
docker compose 单机部署
Kafka主要配置详解
基本配置
内存调优
介绍
Apache Kafka 是分布式的、基于 发布/订阅 的容错消息系统。 主要特性如下:
-
高吞吐、低延迟:可以做到每秒百万级的吞吐量,并且时延极低
-
持久性、可靠性:消息被持久化到本地磁盘,支持数据备份防止数据丢失,具备以时间复杂度为 O(1) 的方式提供消息持久化能力;并且可以配置消息有效期,以便消费者可以多次消费
KafKa 相关术语
-
Broker: 一个 Kafka 实例就是一个 Broker ,每个主机有一个或多个 kafka 的实例(通常只有一个,所以认为一个 Kafka 主机就是一个 Broker );多个 Broker 可以组成一个集群(Cluster),其中集群内某个 Broker 会成为集群控制器(Cluster Controller),它负责管理、统筹集群
-
Topic:主题,用来存储不同类别的消息;存储消息时,需要指定存储在哪个主题下面,如发帖,发哪种类型的
-
Partition:分区,每个topic包含一个或多个partition,在创建topic时指定包含的partition数据(目的是为了进行分布式存储);分区可以提高负载(每个分区是不同的磁盘,所以会提高负载)
-
Replication:副本,每个partition分区可以有多个副本,分布在不同的Broker上。kafka会选出一个副本作为Leader,所有的读写请求都会通过Leader完成,Follower只负责备份数据;所有Follower会自动从Leader中复制数据,当Leader宕机后,会从Follower中选出一个新的Leader继续提供服务,实现故障自动转移
-
Message:消息,是通信数据的基本单位,每个消息都属于一个Partition,消息都是放在Partition里面的。消息也被称之为事件(Event)
-
Producer:消息的生产者,向kafka的一个topic发布消息,发布消息时,需要指定发布到哪个topic
-
Consumer:消息的消费者,订阅Topic并读取其发布的消息,可以订阅多个主题(类似订阅多个微信公众号)
-
Consumer Group:消费者组,每个Consumer属于一个特定的Consumer Group,多个Consumer可以属于同一个Consumer Group;各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组。
-
ZooKeeper/Kraft:协调Kafka的正常运行,kafka将元数据信息保存在ZooKeeper/Kraft中,但发送给Topic本身的消息数据并不存储在ZK/Kraft中,而是存储在磁盘文件中。元数据信息包括:kafka有多少个节点、有哪些主题,主题叫什么,有哪些分区的等(消息自身的数据不在ZK中,而是在磁盘上对应的分区中)
Kafka的工作流程
生产者向kafka发送数据的流程
-
生产者查询Leader:producer先从zookeeper的“/brokers/.../state”节点找到该partition的leader
-
找到Leader之后往Leader写数据:producer将消息发送给该leader
-
Leader落盘:leader将消息写入本地log
-
Leader通知Follower
-
Follower从Leader中拉取数据:replication写入到Follower的本地log后,follower向leader发送ack
-
Kafka向生产者回应ACK:leader收到所有的replication的ack之后,向producer发送ack
Kafka选择分区的模式
-
直接指定往哪个分区写
-
指定key,然后kafka根据key做hash后决定写哪个分区
-
各个分区轮询
详细说明:Kafka Partition详解
Kafka选择分区的模式
-
把数据发送给Leader就认为成功,效率最高,安全性低
-
把数据发送给Leader,等待Leader回复Ack后则认为发送成功
-
把数据发送给Leader,确保Follower从Leader拉取数据回复Ack给Leader,Leader再向生产者回复Ack才认为发送成功,安全性最高
数据消费
多个消费者可以组成一个消费者组,并用一个标签来标识这个消费者组:
-
如果所有的消费者实例都在同一个消费者组中,那么消息记录会被很好的均衡发送到每个消费者实例
-
如果所有的消费者实例都在不同的消费者组,那么每一条消息记录会被广播到每一个消费者实例
各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组
每个消费者实例可以消费多个分区,但是每一个分区最多只能被消费者组中的一个实例消费
kafka的文件存储机制
topic、partition和segment
-
在kafka文件存储中,同一个topic下有多个不同的partition:
-
每个partition就是一个目录,partition的命名规则为:topic名称+有序序号
-
第一个partition序号从0开始,序号最大值为partition数量减一
-
-
每个partition的目录下面会有多组segment文件:
-
每个partition相当于一个巨型大文件被平均分配到多个大小都相等的segment数据文件中(但每个segment file消息数量不一定相等,这种特性方便old segment file快速被删除)
-
每组segment文件包含:.index文件、.log文件、.timeindex文件(.log文件就是实际存储message的地方,.index和.timeindex文件为索引文件,用于检索消息)
-
每个partition只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定
-
这样做能快速删除无用文件,有效提高磁盘利用率
-
-
segment文件
-
segment文件由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和".log"分别表示为segment索引文件、数据文件
-
segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充
-
存储和查找message的过程
数据写入过程
每个Partition都是一个有序并且不可改变的消息记录集合(每个partition都是一个有序队列),当新的数据写入时,就被追加到partition的末尾。
在每个partition中,每条消息都会被分配一个顺序的唯一标识,这个标识被称为Offset(偏移量),用于partition唯一标识一条消息。
数据查找过程
在partition中通过offset查找message:
-
查找segment file:每一个segment文件名都包含了上一个segment最后一条消息的offset值,所以只要根据offset二分查找文件列表,就能定位到具体segment文件
-
通过segment file查找message:当定位到segment文件后,可以通过对应的.index元数据文件,在对应的.log文件中顺序查找对应的offset,然后即可拿到数据
注意事项
-
kafka只能保证在同一个partition内部消息是有序的,在不同的partition之间,并不能保证消息有序
-
为什么kafka快:因为它把对磁盘的随机读变成了顺序读
kafka管理UI
概述
kafka的管理UI,这里主要推荐三个:
-
kafka-ui:官方文档地址为https://docs.kafka-ui.provectus.io/overview/readme。相对于EFAK,功能显得极为简陋,但基本够用,最主要是他支持kraft。另外其github上的star数量也远超EFAK
-
Kafdrop: 其github地址为GitHub - obsidiandynamics/kafdrop: Kafka Web UI。是一个 Apache 2.0 许可项目,在无数的开源选项中,Kafdrop 以其简单、快速和易于使用而脱颖而出。同时,它是一个开源 Web 项目,允许查看来自 Kafka 代理的信息,如现有主题、消费者,甚至是发送的消息内容。
-
EFAK:原名为kafka-eagle,官方文档地址为https://www.kafka-eagle.org/articles/docs/documentation.html。优点是较为完备的管理功能,相当酷炫的大盘和监控看板;缺点是当前的3.0.1版本仍然不支持Kafka的kraft部署模式,虽然官方说是支持了,但并没有给出配置说明。
更多的kafka ui可以参考: Kafka ui 搭建以及使用 - 袋鼠社区-袋鼠云丨数栈丨数据中台丨数据治理丨湖仓一体丨数据开发丨基础软件
部署
docker compose 单机部署
services:kafka:image: bitnami/kafka:3.8.0container_name: kafkarestart: alwayshostname: slave02ports:- '9092:9092'- '9094:9094'environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://slave02:9092,EXTERNAL://192.168.142.155:9094- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@slave02:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- ALLOW_PLAINTEXT_LISTENER=yes- "KAFKA_HEAP_OPTS=-Xmx512m -Xms512m"volumes:- kafka-conf:/bitnami/kafka/config- kafka-data:/bitnami/kafka/data- /etc/localtime:/etc/localtime:rokafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestrestart: alwaysports:- 8080:8080environment:DYNAMIC_CONFIG_ENABLED: trueKAFKA_CLUSTERS_0_NAME: kafka-devKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092volumes:- kafkaui-app:/etc/kafkaui- /etc/localtime:/etc/localtime:ro
volumes:kafka-conf:kafka-data:kafkaui-app:
启动
docker compose up -d
通过 ip + 8080 端口访问
Kafka主要配置详解
基本配置
这里主要介绍kraft部署模式下的kafka的配置文件说明。
在KRaft模式下,配置文件位于Kafk a目录中的config/kraft/server.properties
,常用配置说明如下:
-
node.id
:节点的**id
**,一个集群中每个节点id
不能重复,需要是不小于1
的整数。类似Zookeeper的broker.id
配置。 -
controller.quorum.voters
:配置集群中Controller节点选举过程中的投票者,集群中所有的Controller节点都需要被罗列在这个配置项中,其配置格式为id1@host1:port1,id2@host2:port2,id3@host3:port3...
。所有的节点都是通过这个配置中的节点列表,来得知所有的控制器节点信息(以获取集群元数据)并得到投票候选者的,因此集群中所有节点,不论是Broker还是Controller,还是混合节点,都需要配置这一项。注意:这里只需要写所有的Controller节点和混合节点的
id
、地址和端口即可,这个配置中配置的端口当然是控制器端口。 -
listeners
:这个配置项用于指定Kafka服务器监听客户端连接的地址和端口,当 Kafka 服务器启动时,它将监听listeners
配置项中指定的地址和端口,等待客户端的连接请求。一般情况下这个配置以PLAINTEXT://
或者CONTROLLER://
开头,意义如下:-
若这个节点是Broker节点,则以
PLAINTEXT://
开头 -
若这个节点是Controller节点,则以
CONTROLLER://
开头 -
若这个节点是混合节点,则需要同时配置两者开头的地址
下面给出几个配置示例:
-
PLAINTEXT://:9092
本节点作为Broker节点,监听本机所有可用网卡的9092
端口,需要说明的是,该监听会监听在hostname上,也就是说如果使用默认监听,客户端需要能解析broker的hostname -
PLAINTEXT://127.0.0.1:9092
本节点作为Broker节点,监听本地的9092
端口,这样仅接受来自本地的请求 -
CONTROLLER://:10000
本节点作为Controller节点,监听本机所有可用网卡的10000
端口(使用10000
端口作为控制器端口) -
PLAINTEXT://:9092,CONTROLLER://:9093
本节点作为混合节点,监听本机所有可用网卡的9092
和9093
端口,其中9092
作为客户端通信端口,9093
作为控制器端口
-
-
advertised.listeners
:这个配置容易和listeners
混淆,事实上它们是有较大的区别的。该配置项指定Kafka服务器广播给客户端的地址和端口,通常配置为Kafka所在服务器的直接提供给客户端访问的地址。当客户端(生产者或消费者)尝试连接到Kafka服务器时,它首先会获取Kafka服务器广播的地址和端口,也就是advertise.listeners
配置所指定的地址和端口,然后才会使用advertise.listeners
配置所指定的地址和端口来建立与Kafka服务器的连接。这里的问题是,既然客户端要连接Kafka,那一定是已经知道了Kafka对外的地址端口了,那为什么连接的时候还需要获取一下广播的地址端口再进行连接呢?
事实上,Kafka设计这个配置是为了解决下面较为复杂的网络场景:
-
多网络接口的主机部署:在一个多网络接口的主机部署Kafka时,Kafka服务器可能会监听多个地址和端口,这些地址和端口可能与客户端实际访问的地址和端口不同,
advertise.listeners
允许服务器指定一个公开的、可访问的地址和端口,以便客户端能够正确连接 -
NAT/代理环境:在某些网络环境下,Kafka服务器位于一个私有网络中,客户端位于一个公共网络中,两者之间可能存在网络地址转换(NAT)或代理,在这种情况下,Kafka服务器的内部地址和端口对客户端来说是不可访问的。通过使用
advertise.listeners
,Kafka服务器可以将一个公共地址和端口广播给客户端,使得客户端能够通过公共网络连接到服务器 -
容器环境:例如你把Kafka放在Docker容器中运行,按照默认配置,Kafka服务端只会监听容器网络的
9092
端口,我们知道外部不能直接访问容器的网络,而是需要使用网络映射,假设你把Kafka容器的9092
端口映射至了宿主机9095
端口,也就是说外部需要通过9095
端口访问到Kafka容器的9092
端口,那么你就配置advertise.listeners
为PLAINTEXT://服务器外网地址:9095
,客户端就可以正确访问容器中的Kafka了
-
-
process.roles
这是KRaft模式下专门的配置,用于配置这个节点的类型,可以配置为下列值:-
broker
表示这个节点是Broker节点,充当消息队列的角色 -
controller
表示这个节点是Controller节点,充当元数据存放和管理的角色 -
broker,controller
表示这个节点同时担任Broker和Controller的角色,也称作混合节点
如果没有配置这个选项,则Kafka会以Zookeeper模式运行。
这里有下列注意事项:
-
如果设定节点为
controller
:-
则不能配置
advertised.listeners
,可以将其注释掉或者删掉 -
listeners
需要配置为CONTROLLER://
开头,建议配置为CONTROLLER://:9093
-
-
如果设定节点为
broker
:-
则需要配置
advertised.listeners
为服务器外网地址和端口,这和Zookeeper模式中相同 -
listeners
需要配置为PLAINTEXT://
开头,建议配置为PLAINTEXT://:9092
-
-
如果设定节点为混合节点:
-
同样需要配置
advertised.listeners
为服务器外网地址和端口 -
listeners
需要同时配置CONTROLLER://
和PLAINTEXT://
,建议配置为PLAINTEXT://:9092,CONTROLLER://:9093
-
在开发环境或者小规模集群,可以全部使用混合节点,如果是生产环境就建议设定好每个节点的类型了!并且通常需要先启动Controller节点再启动Broker节点。
事实上,我们发现Kafka的KRaft配置目录
config/kraft
下有三个配置文件,其中server.properties
是混合节点的配置模板,而broker.properties
和controller.properties
分别是Broker节点和Controller节点的配置模板,大家如果要设定节点类型,可以直接使用对应的配置文件,将对应配置文件需要修改的部分修改一下,然后将上述格式化数据目录命令和启动命令中的配置文件路径改变一下即可,这样可以省略我们设定process.roles
和listeners
或者控制器节点删除advertise.listeners
配置的操作。 -
-
socket.send.buffer.bytes
每次发送的数据包的最大大小(单位:字节) -
socket.receive.buffer.bytes
每次接收的数据包的最大大小(单位:字节) -
socket.request.max.bytes
接收的最大请求大小(单位:字节) -
num.partitions
指定创建的Topic
的默认分区数 -
auto.create.topics.enable
:当topic不存在时,是否允许自动创建,true/false -
default.replication.factor
:指定创建的topic默认的分区的副本数,默认为1 -
logs.dir
:指定kafka的数据存储路径,多个路径可以用逗号分隔,示例:
logs.dir: /data1,/data2,/data3,/data4
-
log.retention.hours=168: 设置消息过期时间(全局)
-
log.cleanup.policy=delete: 设置过期消息的处理策略,默认为delete
内存调优
Kafka 是基于 Java 开发的,因此它的内存配置需要通过 JVM 参数进行设置。在 Kafka 的启动脚本中,有一个环境变量KAFKA_HEAP_OPTS
,可以用来设置 JVM 的内存参数。例如,可以将 KAFKA_HEAP_OPTS
设置为 -Xmx4g -Xms4g
,Kafka对堆内存的占用相对不高,一般建设6-8g就够了。
Kafka 内存配置 除了 JVM 参数之外,还需要在 Kafka 的配置文件中配置内存。具体来说,需要关注以下两个参数:
-
log.retention.bytes:用于设置 Kafka 存储消息的阈值,当日志文件大小达到这个阈值时,Kafka 会删除最旧的消息。因此,这个参数应该根据存储需求和可用内存进行
-
log.segment.bytes:这个参数设置了 Kafka 日志文件的大小。如果设置得太小,会导致频繁的文件切换,增加文件系统的开销;如果设置得太大,会占用过多的内存。因此,这个参数也需要根据存储需求和可用内存进行调整
参考:Kafka两种集群详解和搭建教程-阿里云开发者社区
相关文章:

Kafka 快速入门
目录 介绍 KafKa 相关术语 编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …...

探索人们最喜爱的AI工具及其应用影响
探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代,人工智能(AI)技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么,在众多的AI工具中,哪些是人们最喜欢的…...

c语言位域详解
一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式,而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域,我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...

如何修改Spring Boot内置容器默认端口
默认情况下,Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动,并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号,可以使用以下几种方法之一: 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...

STM32自动下载电路分享及注意事项
文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启…...

【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...

把交换机的两个接口连接起来会怎么样?
当把交换机的两个接口连接起来时,可能会产生网络风暴,具体情况如下: 一、形成环路的过程 如果将交换机的两个端口直接连接,就会在网络中形成一个物理环路。例如,假设交换机有端口 A 和端口 B,用一根网线将…...

无人机陆空双模式。
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…...

14. 文档对象模型
打开网页时,浏览器会检索网页的 HTML 文本并对其进行解析,就像第 12 章中的解析器解析程序一样。浏览器会建立一个文档结构模型,并使用该模型在屏幕上绘制页面。这种文档表示法是 JavaScript 程序在沙盒中的玩具之一。它是一种可以读取或修改…...

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法
去光荣地受伤, 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…...

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】
yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这…...

k8s部署安装
k8s部署安装 一 K8s集群环境搭建1.1 k8s中容器的管理方式1.2 k8s集群部署1.2.1 k8s环境部署说明1.2.2 k8s集群环境初始化1.2.2.1 所有节点禁用swap和本地解析1.2.2.2 所有节点安装docker1.2.2.3.所有节点设定docker的资源管理模式为systemd1.2.2.4.所有阶段复制harbor仓库中的证…...

gpt为什么可以依据上下文来回答问题,依据的是什么原理
GPT 可以依据上下文回答问题,主要依据以下几个原理: Transformer 架构: 并行计算与长距离依赖处理:Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式,具有并行计算的能力。它可以同时处理…...

2023 CCPC哈尔滨 报告
比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数:3 题 三题都是队友写的。所以来补一下 B L J。 B题: B. Memory Little G used to be a participant …...

基于深度学习的手术中的增强现实导航
基于深度学习的手术中的增强现实(AR)导航技术是一种结合了先进的计算机视觉算法、深度学习模型与增强现实技术的创新应用。其主要目的是为外科手术提供实时的、精确的手术指导,帮助医生在复杂的手术过程中更好地理解患者的解剖结构࿰…...

输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张
输电线路缺陷图像检测数据集,分为导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…...

百度飞桨(paddlepaddle)安装
百度飞桨(paddlepaddle)安装 Anaconda升级 打开 Anaconda Prompt (或者 Mac 下的终端),键入: conda upgrade --all pip 安装 python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…...

≌图概念凸显有长度不同的射线
黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线,从而使数学一直有几何“常识”:任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表,…...

解决Nginx出现“Too many open files”的问题
解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间,我感到一阵莫名的恍惚。同事突然提出要看我的手机,她的目光落在了我那泛黄的手机壳上。出乎意料地,她开始细心地擦拭,从内到外,动作轻柔而专注。那一刻…...

webGL进阶(一)多重纹理效果
效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…...

flink-jdbc-driver
Flink JDBC 驱动程序是一个 Java 库,使客户端能够通过 SQL 网关将 Flink SQL 发送到 Flink 集群。 首先启动:1.flink集群,随意任何集群。 2.启动flink-sql-gateway: sql-gateway.sh start -Dsql-gateway.endpoint.rest.addresslo…...

快速的配置Prettier,让代码更整洁
快速的配置Prettier,让代码更整洁 一个人一个代码风格,先抛开语法的使用不谈,加不加空格、加不加分号也是萝卜白菜各有所爱,那怎么统一我们的代码格式呢 prettier 就是为我们解决这个问题的 1. 如何制定我们的代码风格 我们可以在…...

JavaEE: HTTPS的魅力与优势揭秘
文章目录 HTTPSHTTPS 是什么HTTPS 基本工作过程Fiddle 等抓包工具,为啥能解析 HTTPS 的数据? HTTPS HTTPS 是什么 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层. 几个核心概念: 明文: 要传输的原始数据.密文: 把明文进行加密之后得到一个让别人不能理解…...

软件设计师——系统基础开发
📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:软件设计师——信息安全🌟其他专栏🌟:C语言_秋邱 一、软件工程概述 1.1、考…...

架构设计笔记-7-系统架构设计基础知识
目录 知识要点 单选 案例分析 1.质量属性 / 管道过滤器 / 数据仓库风格 2.面向对象风格 / 控制环路风格 3.软件架构风格 / 架构风格选择 4.体系结构方案对比 5.面向对象风格 / 基于规则风格 6.解释器风格 / 管道过滤器风格 7.面向对象风格 / 解释器风格 8.软件架构复…...

跨平台应用程序本地化过程的特点
跨平台应用程序本地化不仅仅是将单词从一种语言翻译成另一种语言。这是关于调整应用程序,使其无缝融入全球用户的不同文化和语言环境,无论他们使用的是哪种设备或平台。这个过程对于跨平台应用程序来说尤其复杂,它们需要在多个操作系统和设备…...

C++面试速通宝典——9
170. 简述数组和指针的区别? 答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。 1. 修改内容上的区别 char a[] “hello”; a[0] ‘X’; char * p …...

阿里巴巴商品详情API返回值:电商行业发展的新动力
阿里巴巴的商品详情API在电商行业中扮演着至关重要的角色,它不仅为商家和消费者提供了丰富的产品信息,还推动了电商行业的进一步发展和创新。通过API接口,开发者可以获取商品的详细信息,如标题、价格、库存、评价等,进…...

php的urlencode和rawurlencode区别
urlencode和rawurlencode都是用于对URL进行编码的函数,但它们在处理方式和应用场景上存在明显的区别。以下是关于这两个函数的详细比较: 一、定义与标准 urlencode:基于rawurlencode标准,但有略微的不同,它定义在rfc…...

LeetCode讲解篇之322. 零钱兑换
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以使用动态规划解决这道题,我们首先定义一个数组,数组中第i个元素表示组成金额 i 的最少硬币个数 我们遍历数组的1 ~ amount号位置,对coins进行遍历,查找选…...