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

Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理

目录

引入 ——为什么分布式系统需要用第三方软件?

JMS 

对比 

组件

架构推演——备份实现安全可靠 ,

Zookeeper 

controller的选举

 controller和broker底层通信原理

BROKER内部组件 

​编辑 topic创建


引入 ——为什么分布式系统需要用第三方软件?

 这里会讨论线程与线程之间的通信以及进程与进程之间的通信。

  • 1.线程与线程之间通信,每个线程都有自己的栈空间,共享堆完全可以,通过共享内存来实现消息共享,如下图。

存在的问题:但是如果一个线程t1给堆内存发布数据比较快,接收数据的t2线程接收比较慢,就会导致每秒20条数据被积压来不及处理,积压数据就会导致内存不够用(对吞吐量造成影响,导致系统不稳定,严重情况会导致系统不可用),内存溢出,然后引入磁盘文件,虽然磁盘文件存储的数据比内存多,但也有上限。

  • 2.进程和进程之间通过socket(网络数据流)来通信 ,两个不同的进程申请到的内存是不一样的,所以不能像线程那样去共用内存,

存在问题:第一个进程用于生产数据,第二个进程和第三个进程用来接收数据,如果进程1的数据要同时发给进程二和进程3,那进程1就要同时发送两份数据.如果是进程一发送不同的数据给进程2和进程3,就会增加进程1的逻辑处理难度,会增加系统响应的时间,消耗更多的系统资源,耦合性也高·。如果数据重复发送,也会对系统吞吐量造成影响,最根本还是系统资源不太够。这里谈到的问题也就是进程之间直接交互造成的问题,即耦合性高。

所以就引入中间缓冲区——第三方软件,又称为消息中间件,缓冲区的目的就是中转和临时存储,从而降低系统之间的耦合性。解耦合,负载均衡,削峰填谷。

JMS 

kafka没有完全遵循jms思想,但是借鉴了jms思想。

JMS(Java Message Service)是Java平台上用于消息传递的API标准。它定义了一种用于创建、发送、接收和读取消息的方式,使得不同应用程序之间可以通过消息进行通信。JMS的核心思想包括以下几个方面:

  1. 消息模型:JMS定义了两种基本消息模型,即点对点模型(Point-to-Point)和 发布/订阅模型(Publish/Subscribe)。点对点模型中,消息被发送到特定的队列,只有一个消费者可以接收并处理消息。发布/订阅模型中,消息被发送到主题(Topic),多个消费者可以订阅主题并接收消息。

  2. 消息生产者:负责创建并发送消息到消息中间件。消息生产者将消息发送到指定的队列或主题,并且可能会设置消息的属性、头信息等。

  3. 消息消费者:负责从消息中间件接收并处理消息。消息消费者可以根据需要从特定队列或主题中订阅消息,并在消息到达时进行处理。

  4. 消息中间件:提供消息传递的基础设施,负责存储、路由和传递消息。消息中间件通常是一个独立的服务器,它提供了可靠的消息传递机制,以及高效的消息路由和处理能力。暂时存储和中转。

Kafka借鉴了JMS的一些思想,比如消息模型中的发布/订阅模型,以及消息的生产者和消费者模式。但Kafka与JMS也有一些不同之处,比如Kafka更加注重持久化和水平扩展等方面的设计。因此,虽然Kafka没有完全遵循JMS的思想,但在某些方面受到了JMS的启发和借鉴。

各类消息中间件对比 

 

 在 单机吞吐量 方面,activemq,rabbitmq要比rocketmq,kafka第一个数量级,rocketmq和Kafka都是十万级吞吐量,支持高吞吐。

在 消息可靠性 方面,rocketmq和Kafka可以通过参数优化配置,做到0丢失。rabbitmq基本不丢失,activemq有较低的概率丢失数据。

在 时效性 方面,rabbitmq可以达到微秒级别,其他都是毫秒级别。

在 topic主题分区数量对吞吐量的影响 方面上,对于rocketmq,topic数量可以达到几百/几千量级,但是对于Kafka,topic数量可以达到几百,如果再多的话,吞吐量会大幅度下降。

在 可用性 方面,rocketmq和Kafka的可用性非常高,支持分布式架构,rabbitmq和activemq的可用性高,支持分布式架构,

 功能支持 方面以及其他方面。

rocketmq是阿里开发,社区活跃度不高,mq功能较为完整,分布式,扩展性好。

Kafka是开源的,社区活跃度极高,高吞吐量,只是借鉴了jms规范,并没有完全的遵守,所以只支持简单的mq功能,在大数据领域应用广泛。、

rabbitmq开源稳定,社区活跃度高,并发能力强,延时低,性能极好。

通过上面各种消息中间件的对比,大概可以了解,在大数据场景中我们主要采用 kafka 作为消息中间件,而在JaveEE开发中我们主要采用 ActiveMQ、RabbitMQ、RocketMQ作为消息中间件。如果将 JavaEE和大数据在项目中进行融合的话,那么 Kafka 其实是一个不错的选择。

组件

消息队列就是内存模型,为了数据存储更加可靠,就不能只存储在内存中,引入磁盘文件。这样既保证了数据的高效,也保证了安全可靠。为了不仅仅能存储数据,并且保证数据的顺序不会被打乱,引入了偏移量,方便数据的有序访问,就可以按照某个标记或者某种标记的顺序进行访问,

以下是 Kafka 的一些主要组件:将JMS中的message换成record。

  1. Broker:Kafka 集群中的每个节点都是一个 Kafka Broker。Broker 负责存储和管理数据,以及处理来自生产者和消费者的请求。

  2. Topic:在 Kafka 中,消息被发布到特定的主题(Topic)。每个主题都是一个逻辑的数据流,可以有一个或多个生产者向其发布消息,并且可以有一个或多个消费者从中读取消息。每个主题可以有多个分区,从而实现消息的水平扩展和并行处理。

  3. Producer:生产者是将消息发布到 Kafka 主题的应用程序。生产者负责将消息发送到 Kafka Broker。

  4. Consumer:消费者是从 Kafka 主题中读取消息的应用程序。消费者订阅一个或多个主题,并从中拉取消息。

  5. Consumer Group:消费者组是一组消费者的集合,它们共同消费一个或多个主题中的消息。Kafka 使用消费者组来实现消息的负载均衡和水平扩展。

  6. ZooKeeper:ZooKeeper 是 Kafka 集群的协调服务。它用于管理和协调 Kafka Broker 的状态、主题配置和消费者组的信息。

  7. Partition:每个主题可以分成多个分区,每个分区在物理上由一个或多个 Broker 托管。分区使得主题能够水平扩展,允许 Kafka 处理大规模数据流。

  8. Replication:Kafka 使用副本来提供容错性和高可用性。每个分区都有一个或多个副本,这些副本被分布在不同的 Broker 上,以防止数据丢失。

这些组件共同构成了 Kafka 的核心架构,使其成为一个高效、可靠的流处理平台。

bin/kafka-topics.sh --create --topic <topic_name> --bootstrap-server <bootstrap_server_address> --partitions <num_partitions> --replication-factor <replication_factor>

<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.6.1</version>
</dependency>
</dependencies>

架构推演发展历程——备份实现安全可靠 

🤔1. 分析下图架构存在的问题:

当只有一个节点broker,当他宕机了,其他consumer就发从.log磁盘文件中获取数据了,甚至有可能数据还没存到文件中就丢失了。所以不行。引入横向扩展(增加集群)或者纵向扩展(增加系统资源配置,采用io效率更好的固态硬盘)。这里纵向扩展是解决不了问题的,采用横向扩展增加多个broker。这种可以在一定程度缓解io热点问题但不能解决,如下图:其实并没有解决,因为从同一个topic中进行获取。

🤔2.  所以引入对topic进行分区partition,并用不同的标记进行区分。此时consumer就可以订阅到相关主题中的所有数据如图1.2,

1.2
🤔3.    但是观察1.2图,相当于consumer发送了更多的请求,那这个还是不行呀,于是kafka 将多个消费者当作一个整体对主题进行消费,

🤔4.  当partition-1宕机,可以发现即使数据保存在文件中也不是完全可靠安全的,

所以进行交叉备份,kafka称之为副本,多个副本中只有一个可以进行读写,其他都是用来备份,

小结:

1.多个节点broker形成集群;

2.分区(编号);

3. 副本leader和follower

不能因为某个节点由于网络或者某些问题宕掉 而导致整个集群不可用,所以一般在所有broker中会选择一个管理者

在Kafka中,每个主题被分成一个或多个分区,每个分区可以有多个副本(leader,follower)。这些副本分布在不同的Kafka节点上,确保了数据的冗余和容错性。当主题中的消息被发布到一个分区时,这些消息会被复制到该分区的所有副本中。这意味着即使某个节点发生故障,仍然可以从其他节点的副本中获取数据,确保了系统的高可用性和持久性。

因此,在Kafka中,副本的概念实际上是一种备份机制,它确保了数据的可靠性和可恢复性。每个副本都可以提供数据的读写操作,这样就实现了数据的高可用性和负载均衡。

kafka中的broker(节点)相当于一台服务器,用于存储和管理生产者发送的消息以及消费者获取的消息。每个Broker都有一个唯一的ID,并且可以在集群中进行扩展和复制,以提供高可用性和容错性。存储处理负载均衡

 controller控制整个集群,某个节点出现问题对集群影响不大,但是如果controller出现问题就会影响很大,所以1.管理者备份,   2让节点都可能做管理者,zookeeper选举

Zookeeper ,Znode

 每个Kafka 的broker都会在Zookeeper中注册一个节点znode,用于存储broker的元数据信息,znode包含了broker的id信息,主机号,端口号,znode还扮演着协调集群的各种操作,如领导选举,分区分配,副本管理,Kafka集群中的broker们通过与ZooKeeper交互,可以实时感知集群的状态以及变化,从而协同工作并保持整个集群的稳定性和可靠性。

  1. 集群协调: Zookeeper 管理 Kafka 集群中的 broker 节点,并协调它们的工作。它负责选举 leader,维护集群的元数据以及监控 broker 的健康状态。

  2. Leader 选举: 在 Kafka 中,每个分区都有一个 leader broker 负责处理读写请求,而其他副本(replica)只是用来备份数据。Zookeeper 负责协调 leader 的选举过程,确保在 leader 失效时能够快速选举出新的 leader。

  3. 元数据管理: Kafka 集群的元数据包括 topic、partition、replica 等信息。Zookeeper 负责存储和维护这些元数据,以及通知 broker 有关元数据变更的消息。

  4. 消费者组管理: Zookeeper 也负责管理 Kafka 消费者组的状态。它跟踪每个消费者的偏移量(offset),确保每个消费者从正确的位置开始消费消息。

  5. 心跳检测: Zookeeper 监控 Kafka 集群中各个节点的健康状态,包括 broker 和消费者。它定期发送心跳消息,以确保集群中的各个节点都处于正常运行状态。

 kafka连接Zookeeper就会创建节点,kafka就可以进行数据的存储和访问,但是创建节点只能创建一次,持久性节点:kafka切断和zookepper之间的连接,节点自动被删除就是临时(黄色)节点,否则就是持久化节点。

znode节点有自动监听功能,连接超时数据变化,回调,从而对集群管理

controller的选举

,broker是kafka集群当中有很多broker,每个broker都有自己的id,对于broker启动zookeeper的时候就会出现一个黄色字体的controller_broker id=1,临时节点,关闭连接就会消失。多个集群节点的kafka会选择一个管理者,管理者作为controller,

当1挂掉,2,3都在对它建立连接请求,

对于kafka实现节点管理还用到zookeeper这样的软件,以后会根据kafka自身的算法实现集群管理从而提高性能降低耦合性。

 controller和broker底层通信原理

在 Apache Kafka 中,Controller 和 Broker 的通信是 Kafka 集群管理的核心部分。Kafka 集群由多个 brokers 组成,其中一个 broker 会被选举为 Controller。Controller 负责管理集群的元数据和各种关键的管理任务,如负载均衡、broker 故障处理、topic 分区的分配和复制等。

集群中有很多broker节点,第一个被创建的节点会被选举成为controller,

监听controller和brokers/ids不同。后者是监听子节点的变化。

 底层实现:

一部分是broker和zookeeper之间的通信,broker内部会有zookepper的客户端工具

controller与broker之间是进程之间的通信,

BROKER内部组件 

replication  Manager 副本管理器

Kafkacontroller

kafak接受数据的处理是由kafka的apis处理的 ,应用处理接口

所以我们来想一想broker到底有什么用吧!

  • 是kafka集群中的每个节点,节点就是服务器,可以用来处理生产者和消费者的请求, 存储分区 副本
  • 每个 Broker 可以存储一个或多个分区的副本,当生产者发送消息时,消息会被写入对应分区的 Leader 副本,然后通过副本同步机制复制到其他副本。
  • 生产者和消费者通过与 Broker 进行通信来发送和接收消息,Broker 之间也会进行数据的同步和复制,以保持数据的一致性和可用性。同步和复制就是副本同步机制,防止单个节点故障,提高整个机群的容错能力。

 topic创建

默认情况下,topic自动创建好,修改参数auto.create.topics.enaable,

  NewTopic newTopic = new NewTopic("my_topic", 1, (short) 1);

主题名称:._字母英文构成;

分区数量:int类型

副本因子·replicationcount:short类型 

相关文章:

Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理

目录 引入 ——为什么分布式系统需要用第三方软件&#xff1f; JMS 对比 组件 架构推演——备份实现安全可靠 &#xff0c; Zookeeper controller的选举 controller和broker底层通信原理 BROKER内部组件 ​编辑 topic创建 引入 ——为什么分布式系统需要用第三方软件&#…...

14、顺时针打印矩阵

题目&#xff1a; 顺时针打印矩阵 描述&#xff1a; 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字&#xff0c; 例如&#xff0c; 如果输入如下矩阵&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字&#xff1a;1,2,3,4,8,1…...

毅速丨金属3D打印是制造业转型升级的重要技术

随着科技的进步&#xff0c;金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势&#xff0c;正引领着制造业迈向新的未来。 金属3D打印技术的突破&#xff1a; 设计自由。金属3D打印能制造任意形状和结构的零件&#xff0c;为设计师提供了无限的创意空间。 快速制…...

uni-app uni-data-picker级联选择器无法使用和清除选中的值

出现问题&#xff1a; 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法&#xff1a; 在uni-app uni-data-picker使用中&#xff0c;要添加v-model&#xff0c;v-model在官网的示例中没有体现&#xff0c;但若不加则无法清除。 <uni-data-picker v-m…...

构造函数的小白理解

一、实例 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;//定义一个名为Question的类&#xff0c;用于存储问题及相关信息 [Serializable] public class Question {public string questionText;//存储题目文本字段public str…...

招聘,短信与您:招聘人员完整指南

招聘人员面临的最大挑战之一就是沟通和联系候选人。为何?我们可以从以下原因开始&#xff1a;候选人通常被太多的招聘人员包围&#xff0c;试图联系他们&#xff0c;这使得你很难吸引他们的注意。在招聘过程的不同阶段&#xff0c;根据不同的工作量&#xff0c;让申请人保持最…...

JAVA-矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 找到0的位置&#xff0c;把0出现的数组的其他值夜置为0 需要额外空间方法&#xff1a; 1、定义两个布尔数组标记二维数组中行和列…...

[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器

前言 不是学电子出身的&#xff0c;这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为&#xff1a; H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc​1​ 这是因为一阶低通滤波器的设计目标是允许低频信…...

Mac环境 aab包转apks,并安装apks

一、下载下载bundletool工具 Releases google/bundletool GitHub 二、将下载bundletool.jar包、aab、keystore文件全部放到同一个目录下 例如我全部放到download目录下 转换命令行&#xff1a; java -jar bundletool-all-1.16.0.jar build-apks --modeuniversal --bundle…...

银河麒麟V10 SP1.1操作系统 离线安装 nginx1.21.5、redis 服务

银河麒麟官网地址&#xff1a;国产操作系统、麒麟操作系统——麒麟软件官方网站 一、查看系统版本 命令&#xff1a;nkvers 我的是 release V10 (SP1)&#xff0c;根据这个版本去官网找对应的rpm包 银河麒麟操作系统的rpm包必须从官方找&#xff0c; 要是随便找个Centos的rp…...

ios swift5 视频播放 播放视频失败 无法播放HEVC (H.265) 格式的视频 H.264格式的可以播放

文章目录 1.问题2.原因&#xff1a;iOS swift AVPlayerViewController无法播放HEVC (H.265) 格式的视频3.解决方法用第三方框架MobileVLCKit来播放4.用MobileVLCKit写的播放器4.1 两个oc版本的4.2 两个swiftUI版本的5.苹果是支持HEVC (H.265) 格式的视频&#xff0c;是硬件那边…...

网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休

01 上海吾索信息科技有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1&#xff09;具备网络系统运维服务经验以及数据库实施经验&#xff0c;具备网络系统认证相关资质或证书&#xff1b; 2&#xff09;掌握常用各设备的运维巡检…...

【Qt】QMessageBox 各种对话框的默认显示效果

1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…...

一文弄懂线性回归模型

1、引言 今天&#xff0c;我们将深入探讨机器学习中的三个关键概念&#xff1a;线性回归、代价函数和梯度下降。这些概念构成了许多机器学习算法的基础。起初&#xff0c;我决定不写一篇关于这些主题的文章&#xff0c;因为它们已经被广泛涉及。不过&#xff0c;我改变了主意&…...

uniApp获取实时定位

通过你获取的key放到项目manifest.json里面&#xff0c;对应填写你所需要的key值&#xff0c;还有高德用户名 用户名&#xff1a; key值的位置&#xff1a; 代码&#xff1a; html: <view class"intList pdNone"><view class"label">详细地…...

linux的source命令

用法 source file 也可以用.空格file来代替 . file 作用 在当前bash环境下读取并执行FileName中的命令. source(或点)令通常用于重新执行刚修改的初始化文档&#xff0c;如 .bash_profile 和 .profile等配置文件. 简单的说就是: source命令会把file里的命令在当前shell里一…...

特种作业操作证(焊接与热切割作业)2024年理论考试题库。

1.关于隐弧排烟罩下列说法正确的是&#xff08;&#xff09;。 A.这类排烟罩适用于焊接大而长的焊件时排除电焊烟尘和有毒气体 B.这类排烟罩对焊接区实行密闭&#xff0c;能最大限度地减少臭氧等有毒气体的弥散 C.利用压缩空气从主管中高速喷出时&#xff0c;在副管形成负压…...

免交互和嵌入执行模式

目录 概念 语法格式 统计行数 赋值变量 修改密码​编辑往文件里添加内容 ​编辑​编辑引入变量 整体赋值​编辑 加引号不赋值变量 expect实现免交互 免交互设置密码 免交互切换用户 嵌入执行模式 添加用户并免交互设置密码 免交互登录 传参实现ssh 练习 概念 …...

Hadoop版本演变、分布式集群搭建

Hadoop版本演变历史 Hadoop发行版非常的多&#xff0c;有华为发行版、Intel发行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP)&#xff0c;这些发行版都是基于Apache Hadoop衍生出来的。 目前Hadoop经历了三个大的版本。 hadoop1.x&#xff1a;HDFSMapReduce hadoop2.x…...

【Qt C++实现绘制仪表盘】

要在Qt C中绘制仪表盘&#xff0c;您可以使用QChart、QSeries、QBarSeries、QPointSeries等类。以下是一个简单的示例&#xff0c;演示如何使用这些类创建一个绘图仪表盘&#xff1a; #include <QApplication> #include <QChart> #include <QChartView> #in…...

一文看懂LLaMA 2:大型多模态模型的新里程碑

一文看懂LLaMA 2&#xff1a;大型多模态模型的新里程碑 LLaMA 2是OpenAI继GPT-3之后推出的又一重磅模型&#xff0c;它不仅在文本生成方面有所突破&#xff0c;而且在图像处理和语音识别等领域也展现出了令人印象深刻的能力。本文将全面介绍LLaMA 2的背景、技术细节、应用场景…...

基于Spring Boot构建淘客返利平台

基于Spring Boot构建淘客返利平台 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论如何基于Spring Boot构建一个淘客返利平台。 淘客返利平台通过…...

Qt—贪吃蛇项目(由0到1实现贪吃蛇项目)

用Qt实现一个贪吃蛇项目 一、项目介绍二、游戏大厅界面实现2.1完成游戏大厅的背景图。2.2创建一个按钮&#xff0c;给它设置样式&#xff0c;并且可以跳转到别的页面 三、难度选择界面实现四、 游戏界面实现五、在文件中写入历史战绩5.1 从文件里提取分数5.2 把贪吃蛇的长度存入…...

Java导出Excel并邮件发送

一、导出Excel 添加maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.10-FINAL</version></dependency><dependency><groupId>org.apache.poi</groupI…...

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用一节中&#xff0c;我们已经了解YOLO的使用方法&#xff0c;使用过程非常简单&#xff0c;训练时只需要三行代码&#xff1a;引入YOLO&#xff0c;构建模型&#xff0c;训练模型&#xff1b;预测…...

保护隐私,释放智能:使用LangChain和Presidio构建安全的AI问答系统

保护隐私&#xff0c;释放智能&#xff1a;使用LangChain和Presidio构建安全的AI问答系统 在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;AI问答系统已经成为企业与客户互动的重要工具。然而&#xff0c;随之而来的个人数据隐私问题也日益凸显。如何在不泄露…...

【高考志愿】自动化

目录 一、专业概述 二、课程设计 三、就业前景与方向 四、志愿填报 五、自动化专业排名 一、专业概述 高考志愿自动化专业选择&#xff0c;无疑是迈向现代化工业与科技发展的一把金钥匙。自动化专业&#xff0c;作为现代工程领域的重要支柱&#xff0c;融合了计算机、电子…...

技巧类题目

目录 技巧类题目 136 只出现一次的数字 191 位1的个数 231. 2 的幂 169 多数元素 75 颜色分类 &#xff08;双指针&#xff09; 287. 寻找重复数 136 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均…...

Vue3自定义指令参数修饰符值(3)

自定义指令参数修饰符值 在vue3中我们如何获取自定义的参数的内容&#xff0c;并根据业务来修改展示的内容呢,需要依靠mounted方法中的bindings参数来获取。 参考实例 directives/unit.js文件 export default function directiveUnit(app){app.directive("unit",{…...

HTML(23)——垂直对齐方式

垂直对齐方式 属性名&#xff1a;vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块&#xff0c;行内标签都按文字处理&#xff0c;默认基线对齐 导致图片看起来会偏上&#xff0c;文字偏下。 示例&#…...

wordpress知名博客主体/苏州seo公司

打开excel工作表的时候需要输入密码&#xff0c;这是对excel进行了加密&#xff0c;没有正确密码没办法打开文件&#xff0c;如果忘记了密码或者不知道密码&#xff0c;该如何打开文件呢&#xff1f;我们以奥凯丰 EXCEL解密大师为例&#xff0c;解决一下excel文件打开密码问题。…...

wordpress优化公司/网站软文代写

DNS 是Domain Name System (域名系统) 的缩写&#xff0c;是一种按域层次结构组织计算机和网络的命名系统。DNS应用于TCP/IP构建的网络&#xff0c;主要用于Internet。在Internet上&#xff0c;用户记忆由数字组成的IP地址比较困难&#xff0c;所以引入了域名的概念。域名与IP地…...

西安做网站程序/搜索引擎排名查询

Django模型Django 对各种数据库提供了很好的支持&#xff0c;包括&#xff1a;PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。 MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例…...

做邀请函的网站/网站推广的平台

为什么要使用构建器(Buildle模式) 静态工厂和构造方法都有共同的局限性&#xff1a;不能很好的扩展到大量的可选参数。 模拟一个场景: 一个Person对象,它有2个必要的参数(name,age),2个可选参数(sex,address)&#xff0c;我们来获取它的实例。 1、静态工厂方法实现 - 重叠构造方…...

免费做优化的网站建设/如何做品牌推广方案

前言 2020年是转折的一年&#xff0c;上半年疫情原因&#xff0c;很多学android开发的小伙伴失业了&#xff0c;虽找到了一份工作&#xff0c;但高不成低不就&#xff0c;下半年金九银十有想法更换一份工作&#xff0c;很多需要大厂面试经验和大厂面试真题的小伙伴&#xff0c…...

五莲网站建设公司/山东免费网络推广工具

2019独角兽企业重金招聘Python工程师标准>>> 1、在index.php添加调试的配置为true&#xff0c;否则配置修改后不能立即生效 define (APP_DEBUG, true ); 2、通用的配置文件放在 Application/Common/Conf下面 3、修改config.php,配置数据库类型&#xff0c;否则报错:…...