Zookeeper使用详解

在这里插入图片描述

介绍

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

ZooKeeper的每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。其应用场景包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

在这里插入图片描述

在这里插入图片描述

使用场景

ZooKeeper的使用场景非常广泛,主要包括以下几个方面:

  1. 配置中心 :ZooKeeper可以用来存储和管理配置信息,例如集群中的机器配置、服务地址配置等。通过Zookeeper,可以将配置信息统一管理,同时实现动态加载和更新。
  2. 统一命名服务 :Zookeeper可以用来实现命名服务,例如将集群中的机器名称和IP地址进行映射,或者将服务的唯一标识和实际地址进行映射。这样,客户端可以通过名称或标识来访问服务,而不需要知道服务的实际地址。
  3. 分布式锁 :Zookeeper可以用来实现分布式锁,通过创建一个特殊的节点,各个节点可以竞争同一个锁,从而保证分布式系统中的一致性。
  4. 分布式队列 :Zookeeper可以用来实现分布式队列,通过创建一个特殊的节点,各个节点可以加入或离开队列,同时队列中的节点可以按照一定的顺序进行排序。
  5. 数据发布订阅 :通过发布者将数据信息存储到ZooKeeper的节点上,订阅者对数据进行订阅,达到动态获取数据的一个效果。
  6. 集群管理 :Zookeeper可以用于监测集群中的机器退出和加入、选举master等。

在这里插入图片描述

主要特点

Zookeeper是一个开源的分布式协调服务,它主要用于分布式系统中的服务发现、配置管理和分布式同步等。

  • Zookeeper的优点:
  1. 简单易用:Zookeeper提供了简洁的API和数据模型,使得开发人员可以轻松地使用它来协调和管理分布式系统中的服务和节点。
  2. 高性能:Zookeeper具有高可用性、高性能和低延迟的特点,能够处理大量的请求和数据。
  3. 稳定可靠:Zookeeper具有稳定可靠的特点,能够在分布式环境中提供一致、可靠的服务。
  4. 可扩展性:Zookeeper可以轻松地扩展到数千个节点的规模,并且可以保证系统的可扩展性和可靠性。
  5. 数据一致性:Zookeeper提供了强一致性的数据模型,保证了在分布式系统中的数据一致性。
  • Zookeeper也有一些缺点:
  1. 依赖网络:Zookeeper的性能和可靠性高度依赖于网络通信的质量。如果网络出现故障或延迟,Zookeeper可能会受到影响。
  2. 不适合存储大量数据:Zookeeper主要是为了协调和管理分布式系统中的配置信息和服务状态而设计的,不适合用于存储大量数据。如果需要存储大量数据,可能需要考虑其他解决方案。
  3. 不适合实时应用:Zookeeper的响应时间可能会影响到实时应用的性能和稳定性。因此,对于实时性要求高的应用,可能需要寻找其他更适合的解决方案。

在这里插入图片描述

工作原理

ZooKeeper的工作原理基于原子广播机制,该机制保证了各个Server之间的同步。这个机制由Zab协议实现,Zab协议有两种模式:恢复模式(选主)和广播模式(同步)。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式。当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

ZooKeeper采用了递增的事务id号(zxid)来标识事务,所有的提议(proposal)都在被提出的时候加上了zxid,从而保证了事务的顺序一致性。

在这里插入图片描述

架构模式

ZooKeeper的架构模式包括以下几种:

  1. 领导者(Leader)模式:在这种模式下,ZooKeeper集群中只有一个领导者节点,负责处理所有的写请求,并将这些请求广播给其他从节点。所有的读请求可以直接从领导者节点或者从节点中获取。
  2. 分布式(Distributed)模式:在这种模式下,ZooKeeper集群中的每个节点都可以处理读写请求。每个节点都会复制一份数据,并且通过互相监视来保持数据的一致性。
  3. 集群(Cluster)模式:在这种模式下,ZooKeeper集群中的每个节点都是对等的,每个节点都可以处理读写请求。通过互相监视和同步,来保持数据的一致性。

在这里插入图片描述

节点角色划分

ZooKeeper的节点角色划分主要分为三种:领导者(Leader)、跟随者(Follower)和观察者(Observer)。

领导者(Leader):负责协调集群中的其他节点,处理所有的写请求,并将这些请求广播给其他节点。同时,领导者也负责维护数据的一致性。

跟随者(Follower):为客户端提供读服务,参与Leader选举过程。

观察者(Observer):为客户端提供读服务,不参与Leader选举过程。

在这里插入图片描述

Leader选举机制

ZooKeeper的Leader选举机制基于Zab协议,该协议有两种模式:恢复模式(选主)和广播模式(同步)。

在初始化集群分布式的时候会进行Leader选举,或者在运行期间Leader出现故障也会进行选举。当ZooKeeper集群中的节点启动时,它们都会默认认为自己是Leader,然后通过投票机制来确定Leader。

投票机制基于(myid, ZXID)来表示,每个节点都会将自己认为的Leader信息(包括myid和ZXID)发送给集群中的其他节点。每个节点都会统计投票信息,判断是否已经有过半的节点接受了相同的投票信息。如果有,那么这个节点就被认为是被选举为Leader。

一旦确定了Leader,每个节点就会更新自己的状态。如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。

在这里插入图片描述

数据一致性保证

ZooKeeper通过Zab协议来保证数据一致性。Zab协议是一种原子广播协议,支持崩溃恢复,实现分布式数据一致性。Zab协议包括两种基本的模式:崩溃恢复和消息广播。

在消息广播模式下,Leader节点的写入是一个两步操作,第一步是广播事务操作,第二步是广播提交操作。过半数指的是反馈的节点数 >=N/2+1。如果收到超过半数的Follower的反馈,Leader就会提交事务。

在崩溃恢复模式下,如果发生故障导致Leader节点宕机,会进行新一轮的Leader选举。当与过半的机器同步完成后,就退出恢复模式,然后进入消息广播模式。

ZooKeeper还通过保证数据的一致性来保证数据的安全性。ZooKeeper中的每个节点都有一个唯一的路径,并且每个节点都有一个与之关联的数据。当数据发生变化时,ZooKeeper会保证这个变化对所有节点都是一致的。

此外,ZooKeeper还提供了事务日志来保证数据的持久性和可靠性。事务日志记录了所有对数据的修改操作,如果发生故障导致数据损坏,可以通过事务日志来恢复数据。

ZooKeeper通过Zab协议、保证数据一致性和提供事务日志等方式来保证数据的安全性和可靠性。

在这里插入图片描述

数据冗余性保证

ZooKeeper通过数据复制来保证数据冗余性。为了提高数据可靠性和可用性,ZooKeeper将数据放在内存中,并支持数据的复制。每个ZNode(节点)都有一个与之关联的Data攥取句柄,可以获取该节点的数据。同时,ZooKeeper支持对节点的子节点进行监视,当子节点发生变化时,会收到通知。

在数据复制方面,ZooKeeper支持同步和异步两种复制方式。在同步复制方式下,当主节点发生写操作时,需要等待从节点完成写操作后再返回结果,这种方式可以保证数据的一致性,但是可能会影响性能。在异步复制方式下,主节点只需要将写操作结果发送给从节点,不需要等待从节点完成写操作,这种方式可以提高性能,但是可能会牺牲一些数据一致性。

ZooKeeper还支持节点的事务性保证,即每个事务都有一个唯一的事务ID(zxid),并且每个事务在执行过程中都按照严格的顺序执行,从而保证了数据的一致性和操作的原子性。

ZooKeeper通过数据复制、同步和异步复制方式以及事务性保证等方式来保证数据冗余性和可用性。

在这里插入图片描述

集群模式中的数据查询与更新机制

ZooKeeper集群中的数据查询与更新机制基于Zab协议,主要包括以下步骤:

  • 数据查询:
  1. 当客户端向ZooKeeper集群发送数据查询请求时,该请求首先会被路由到一个领导者节点上。
  2. 领导者节点会查询自己的内存中的数据,如果数据存在,则直接返回给客户端。
  3. 如果领导者节点中不存在该数据,则会向其他节点发送查询请求,并将查询结果返回给客户端。
  • 数据更新:
  1. 当客户端向ZooKeeper集群发送数据更新请求时,该请求首先会被路由到一个领导者节点上。
  2. 领导者节点会记录下要更新的数据项以及更新操作,然后将其广播给其他节点。
  3. 其他节点在收到广播消息后,会执行相应的更新操作,并将更新结果发送给领导者节点。
  4. 领导者节点在收到所有节点的更新结果后,会进行汇总,然后将汇总结果返回给客户端。

在数据查询与更新过程中,ZooKeeper集群通过领导者选举和数据同步机制来保证数据的一致性和可用性。当领导者节点出现故障时,其他节点会重新选举一个领导者节点,并保证数据的一致性。同时,ZooKeeper集群中的每个节点都会定期与其他节点进行数据同步,以保证数据的实时性和一致性。


CAP理论在Zookeeper中的应用

CAP理论在Zookeeper中的应用主要体现在其数据一致性、可用性和分区容错性方面。

首先,Zookeeper遵循一致性原则(Consistency)。在分布式系统中,Zookeeper保证所有节点在同一时刻具有完全相同的数据备份。这意味着在Zookeeper中,每个节点都可以提供一个一致的数据视图。

其次,Zookeeper在可用性方面(Availability)有所牺牲。Zookeeper不能保证每次服务请求的可用性。例如,在极端环境下,Zookeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果。

最后,Zookeeper具有分区容错性(Partition Tolerance)。Zookeeper能够容忍节点之间的网络通信故障,也就是说,即使集群因为网络或者机器故障等原因分成几个区域(分区),Zookeeper集群也能保持其功能性。

根据CAP理论,一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能同时满足其中的两项。由于分区容错性是必须的,因此Zookeeper选择了CP原则,即选择了一致性和分区容错性,而牺牲了可用性。

在这里插入图片描述

安装部署

单节点安装部署

Zookeeper单节点安装部署可以按照以下步骤进行:

  1. 下载Zookeeper:访问Zookeeper官网,下载对应版本的Zookeeper压缩包。
  2. 解压缩:将压缩包解压缩到目标目录,例如“/usr/local/zookeeper”。
  3. 配置文件:进入解压缩后的目录,找到“conf”文件夹,修改“zoo_sample.cfg”文件为“zoo.cfg”,配置Zookeeper的相关参数。
  4. 启动Zookeeper:在终端中输入“bin/zkServer.sh start”命令,启动Zookeeper服务。
  5. 创建数据目录和日志目录:进入“/usr/local/zookeeper-3.4.6”目录,创建“data”和“logs”文件夹。
  6. 创建myid文件:在“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前机器的IP地址。
  7. 配置防火墙:如果需要在防火墙中开放Zookeeper的端口,需要配置防火墙规则。
  8. 测试Zookeeper:通过Zookeeper客户端连接Zookeeper服务,测试是否能够正常连接和使用。

以上是Zookeeper单节点安装部署的基本步骤,按照步骤进行操作即可完成安装部署。


集群安装部署

Zookeeper集群安装部署可以按照以下步骤进行:

  1. 准备节点:准备多个Zookeeper节点,确保每个节点都有足够的内存和磁盘空间。
  2. 安装Zookeeper:在每个节点上安装Zookeeper,具体步骤与单节点安装部署相同。
  3. 配置文件:修改每个节点的“zoo.cfg”文件,配置集群的相关参数,例如集群节点地址、端口号等。
  4. 创建数据目录和日志目录:在每个节点的指定目录下创建“data”和“logs”文件夹。
  5. 创建myid文件:在每个节点的“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前机器的IP地址。
  6. 启动Zookeeper:在每个节点上启动Zookeeper服务,使用“bin/zkServer.sh start”命令。
  7. 测试集群:通过Zookeeper客户端连接集群,测试是否能够正常连接和使用。

以上是Zookeeper集群安装部署的基本步骤,需要注意的是,在配置文件时需要确保每个节点的配置文件中的端口号不冲突,并且每个节点的IP地址和端口号需要正确配置。同时,在启动Zookeeper服务时,需要按照指定的顺序启动节点,以确保集群的正常运行。


常用配置参数

Zookeeper常用配置参数包括:

  1. tickTime:这是Zookeeper的基本时间单位,用于表示心跳时间间隔。
  2. dataDir:指定存储数据的目录。
  3. clientPort:指定客户端连接的端口号。
  4. initLimit:该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower在initLimit时间内完成这个工作。
  5. syncLimit:集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数。

此外,Zookeeper还有许多其他参数,可以根据实际需求进行配置。具体参数可以参考Zookeeper的官方文档或配置文件中的说明。


Java使用Zookeeper示例

以下是一个简单的Java使用Zookeeper的示例,演示了如何使用Zookeeper创建一个简单的分布式锁:

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;

public class DistributedLock {
    private ZooKeeper zooKeeper;
    private String lockPath;

    public DistributedLock(String host, int port) throws Exception {
        zooKeeper = new ZooKeeper(host, port, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 处理事件
            }
        });
        lockPath = "/lock";
    }

    public boolean lock() throws Exception {
        String createdPath = zooKeeper.create(lockPath, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        return createdPath.equals(lockPath);
    }

    public boolean unlock() throws Exception {
        return zooKeeper.delete(lockPath, -1);
    }
}

这个示例中,我们创建了一个DistributedLock类,它通过Zookeeper实现了分布式锁的功能。在构造函数中,我们连接到Zookeeper服务器,并指定了锁的路径。lock()方法尝试在Zookeeper中创建一个临时节点作为锁,如果成功则返回true,表示获得锁。unlock()方法删除锁节点,表示释放锁。在Watcher中,我们可以处理Zookeeper事件,例如节点变化、会话断开等。


Spring Boot集成Zookeeper

要在Spring Boot应用程序中集成Zookeeper,您需要执行以下步骤:

  1. 添加依赖项

在您的pom.xml文件中添加Spring Boot Starter Curator依赖项。这将包含Spring Boot对Zookeeper的集成。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-curator</artifactId>
</dependency>
  1. 配置Zookeeper连接信息

application.propertiesapplication.yml文件中配置Zookeeper的连接信息,例如主机名和端口号。

spring.curator.connect-string=localhost:2181
spring.curator.namespace=myapp
  1. 创建Zookeeper客户端

创建一个CuratorFramework的Bean实例,该实例将用于与Zookeeper进行交互。您可以在Spring Boot应用程序的配置类中添加以下代码:

@Configuration
public class ZookeeperConfig {
    @Bean
    public CuratorFramework curatorFramework() throws Exception {
        return CuratorFrameworkFactory.newClient(
            environment.getProperty("spring.curator.connect-string"), 
            new ExponentialBackoffRetry(1000, 3));
    }
}
  1. 使用Zookeeper客户端进行操作

现在您可以使用创建的CuratorFramework客户端进行各种操作,例如创建节点、获取子节点数、设置节点数据等。以下是一些常见操作的示例:

@Autowired
private CuratorFramework curatorFramework;

public void createNode(String path) throws Exception {
    if (curatorFramework.exists().forPath(path) == null) {
        curatorFramework.create().creatingParentsIfNeeded().forPath(path);
    }
}

public int getChildrenCount(String path) throws Exception {
    return curatorFramework.getChildren().forPath(path).size();
}

public void setNodeData(String path, String data) throws Exception {
    if (curatorFramework.exists().forPath(path) != null) {
        curatorFramework.setData().forPath(path, data.getBytes());
    } else {
        curatorFramework.create().forPath(path, data.getBytes());
    }
}

拓展

Zab协议协议介绍

Zab协议(Zookeeper Atomic Broadcast)是一种为分布式协调服务Zookeeper专门设计的支持崩溃恢复的原子广播协议,是Zookeeper保证数据一致性的核心算法。

Zab协议借鉴了Paxos算法,但又不完全相同。Zab协议主要应用于Zookeeper系统,通过该协议,Zookeeper集群中的每个节点可以保持数据的一致性。Zab协议有两个主要的工作模式:广播模式和恢复模式。在广播模式下,当集群正常运行时,一个节点作为领导者(Leader)负责协调事务,将服务器数据的状态变更以事务提议(proposal)的形式广播到所有的副本(Follower)进程上去。在恢复模式下,当集群启动或领导者崩溃时,系统进入恢复模式,选举新的领导者并将集群中各节点的数据同步到最新状态。

Zab协议通过确保那些已经在领导者(Leader)服务器上提交(Commit)的事务最终被所有的服务器提交,以及丢弃那些只在领导者(Leader)上被提出而没有被提交的事务,来保证数据的一致性。同时,Zab协议还保证了全局的变更序列被顺序引用,即保证了事务的顺序一致性。


Paxos算法

Paxos算法是一种基于消息传递的一致性算法,旨在解决分布式系统中的一致性问题。它由莱斯利·兰伯特于1990年提出,被认为是解决这类问题的最有效算法之一。

Paxos算法通过一系列的提案和投票过程来达成一致,节点在分布式系统中分为三种角色:Proposer(提议者)、Acceptor(接受者)和Learner(学习者)。

Proposer负责提出提案,Acceptor负责对提案进行投票,Learner则从Acceptor处获取已确定的提案内容。在一个集群中,会有多个提议者提出不同的提案,而一个提案会有多个接受者。

Paxos算法通过以下过程达成一致:

  1. Prepare阶段:Proposer向所有Acceptor发送Prepare请求,请求中包含一个提案编号。Acceptor收到请求后,如果该提案编号大于其之前接收到的最大提案编号,则接受该提案,否则拒绝。
  2. Promise阶段:如果Acceptor接受了提案,则向Proposer发送Promise响应,同时将该提案编号记录下来。如果其他Acceptor已经接受了该提案,则将该Acceptor的编号记录下来。
  3. Accept阶段:如果Proposer收到了足够多的Promise响应(超过半数),则认为该提案被选定,并向所有Acceptor发送Accept请求。Acceptor收到请求后,如果该提案编号等于其之前接收到的最大提案编号,则接受该提案。
  4. Learning阶段:当一个提案被选定后,Learner会从已接受该提案的Acceptor处获取提案内容。

Paxos算法通过这种机制确保了在分布式系统中的一致性,即使在节点故障或网络分区的情况下也能保证系统的可用性和可靠性。然而,Paxos算法的实现难度较大,需要解决诸如选举领导者、处理故障恢复等问题。

Apriori算法

Apriori算法是一种关联规则挖掘算法,用于在大型数据库中找出频繁项集,从而生成关联规则。该算法主要用于市场篮子分析、用户购买习惯分析、推荐系统等领域。

Apriori算法的基本思想是利用频繁项集的子集必须也是频繁的特性,采用逐层搜索的方法找出数据库中的频繁项集。具体而言,Apriori算法通过扫描一次数据库,对每个候选项集计数,然后删除不满足最小支持度阈值的项集,接着对剩下的项集重复上述过程,直到所有候选项集都满足最小支持度阈值或无法再生成新的候选项集为止。

Apriori算法的时间复杂度较高,因此需要进行优化以提高效率。优化方法包括使用哈希树、使用垂直数据格式等。同时,Apriori算法也面临一些挑战,例如如何选择合适的最小支持度阈值和置信度阈值、如何处理大规模数据集等。

总体来说,Apriori算法是一种非常实用的关联规则挖掘算法,可以应用于多种领域。它通过对数据库的深度扫描和对候选项集的计数,可以有效地找出频繁项集并生成关联规则,为数据分析和商业决策提供有力支持。

Paxos算法和Apriori算法的区别

Paxos算法和Apriori算法是两种完全不同的算法,它们被用于解决不同的问题。

Paxos算法是一种基于消息传递的一致性算法,旨在解决分布式系统中的一致性问题。它通过一系列的提案和投票过程来达成一致,确保在分布式系统中的多个节点能够就某个决议达成一致。

Apriori算法则是一种关联规则挖掘算法,用于发现数据库中项集的关系,以形成规则。它采用一种基于搜索的迭代方法,通过不断合并项集来生成更大的项集,直到找到所有频繁项集。

因此,Paxos算法和Apriori算法的主要区别在于它们的用途和实现方式。Paxos算法用于解决分布式系统中的一致性问题,而Apriori算法用于关联规则挖掘。同时,Paxos算法基于消息传递,通过提案和投票过程达成一致,而Apriori算法则采用基于搜索的迭代方法来发现频繁项集。

在这里插入图片描述

Zookeeper官网

zookeeper服务端和客户端的启动与停止

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城-缓存使用分布式锁SpringCache(5天)

缓存使用 1.1.1 哪些数据适合放入缓存 即时性、 数据一致性要求不高的 访问量大且更新频率不高的数据&#xff08;读多&#xff0c; 写少&#xff09; 例如&#xff1a;电商类应用&#xff0c; 商品分类&#xff0c; 商品列表等适合缓存 本地缓存 使用Map进行本地缓存 本地缓存…

【Redis】AOF 源码

在上篇, 我们已经从使用 / 机制 / AOF 过程中涉及的辅助功能等方面简单了解了 Redis AOF。 这篇将从源码的形式, 进行深入的了解。 1 Redis 整个 AOF 主要功能 Redis 的 AOF 功能概括起来就 2 个功能 AOF 同步: 将客户端发送的变更命令, 保存到 AOF 文件中AOF 重写: 随着 Red…

MySQL数据库软件详解二

MySQL的配置文件 my.ini 概述&#xff1a;MySQL 的配置文件 参数名称说明port表示 MySQL 服务器的端口号basedir表示 MySQL 的安装路径datadir表示 MySQL 数据文件的存储位置&#xff0c;也是数据表的存放位置default-character-set表示服务器端默认的字符集default-storage…

系统性学习vue-组件及脚手架

书接上文 Vue组件及脚手架 初始化脚手架说明步骤 分析脚手架结构render函数修改默认配置ref属性props配置mixin 混入/混合定义混合局部混合全局混合 插件scoped样式安装less-loader 浏览器的本地存储 webStoragelocalStroage 本地存储sessionStorage 会话存储 组件自定义事件绑…

SQLServer 为角色开视图SELECT权限,报错提示需要开基础表权限

问题&#xff1a; 创建了个视图V&#xff0c;里面包含V库的a表&#xff0c;和T库的b表 为角色开启视图V的SELECT权限&#xff0c;提示T库的b表无SELECT权限&#xff0c;报错如下 解决方案&#xff1a; ①在T库建个视图TV&#xff0c;里面包含b表&#xff08;注意是在b表的对…

【Qt 学习之路】关于C++ Vlc视频播放

文章目录 1、简介2、效果2.1、视频2.2、动态图 3、核心代码3.1、判断视频3.2、视频核心类调用3.3、视频核心类3.3.1、头文件3.3.2、源文件 1、简介 最近有童鞋咨询VLC相关的问题&#xff0c;公布一个 5年前 编写的 VLC示例 代码供参考学习。包括正常对视频各种常用的操作&…

微信小程序快速入门03

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、生命周期生…

【Java数据结构】04-图(Prim,Kruskal,Dijkstra,topo)

5 图 推荐辅助理解 【视频讲解】bilibili Dijkstra Prim 【手动可视化】Algorithm Visualizer &#xff08;https://algorithm-visualizer.org/&#xff09; 【手动可视化】Data Structure Visualizations (https://www.cs.usfca.edu/~galles/visualization/Algorithms.ht…

基于k8s Deployment的弹性扩缩容及滚动发布机制详解

k8s第一个重要设计思想&#xff1a;控制器模式。k8s里第一个控制器模式的完整实现&#xff1a;Deployment。它实现了k8s一大重要功能&#xff1a;Pod的“水平扩展/收缩”&#xff08;horizontal scaling out/in&#xff09;。该功能从PaaS时代开始就是一个平台级项目必备编排能…

cookie和session的工作过程和作用:弥补http无状态的不足

cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时&#xff0c;服务端可以把状态数据以key-value的形式写入到cookie中&#xff0c;存储到浏览器。浏览器下次去服务服务端时&#xff0c;就可以把这些状态数据携带给服务器端&#xff0c;服务器端可以根…

OceanBase架构概览

了解一个系统或软件&#xff0c;比较好的一种方式是了解其架构&#xff0c;下图是官网上的架构图&#xff0c;基于V 4.2.1版本 OceanBase 使用通用服务器硬件&#xff0c;依赖本地存储&#xff0c;分布式部署在多个服务器上&#xff0c;每个服务器都是对等的&#xff0c;数据库…

如何画出优秀的系统架构图-架构师系列-学习总结

--- 后之视今&#xff0c;亦犹今之视昔&#xff01; 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…

Keepalived 双机热备

本章主要内容&#xff1a; Keepalived 双机热备基础知识学会构建双机热备系统学会构建LVSHA 高可用群集 简介 在这个高度信息化的IT时代&#xff0c;企业的生产系统&#xff0c;业务运营&#xff0c;销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机和服务&#…

class_1:qt的安装及基本使用方式

一、选择组件&#xff1a; 1、windows编译工具&#xff1a;MinGW 7.30 32-bit MinGW 7.30 64-bit 2、QT源代码&#xff1a;sources 3、QT的绘图模块&#xff1a;QT charts 4、QT虚拟键盘&#xff1a;QT Virtual Keyboard 5、QT Creational 4.12.2 GDB 二、新建QT项目 文…

【MATLAB】 HANTS滤波算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 HANTS滤波算法是一种时间序列谐波分析方法&#xff0c;它综合了平滑和滤波两种方法&#xff0c;能够充分利用遥感图像存在时间性和空间性的特点&#xff0c;将其空间上的分布规律和时间上的变化规律联系起来…

构建 Maven 项目时可能遇到的问题

文章目录 构建 Maven 项目时可能遇到的问题1. Maven 自动下载依赖后&#xff0c;在本地仓库中找不到2. 运行时报错如下&#xff1a;Error: java 不支持发行版本 53. 创建 Maven 项目后 pom.xml 文件为空4. 在 Settings 中 Update 了阿里云远程仓库&#xff0c;导致整个项目不能…

美国智库发布《用人工智能展望网络未来》的解析

文章目录 前言一、人工智能未来可能改善网络安全的方式二、人工智能可能损害网络安全的方式三、人工智能使用的七条建议四、人工智能的应用和有效使用AI五、安全有效地使用人工智能制定具体建议六、展望网络未来的人工智能&#xff08;一&#xff09;提高防御者的效率&#xff…

数据结构学习 jz29 顺时针打印矩阵

关键词&#xff1a;模拟 题目&#xff1a;螺旋遍历二维数组 简单题做了超过40分钟 调了很久 不好 方法一&#xff1a; 我自己做的。 思路&#xff1a; xy_t&#xff1a; 记录xy的方向&#xff0c;往右走&#xff0c;往下走&#xff0c;往左走&#xff0c;往上走 t控制方…

算法第十八天-打家劫舍Ⅱ

打家劫舍Ⅱ 题目要求 解题思路 [打家劫舍Ⅱ]是说两个相邻的房间不能同时偷&#xff0c;并且首尾两个房间是相邻的&#xff08;不能同时偷首尾房间&#xff09;明显是基于[打家劫舍Ⅰ]做的升级。[打家劫舍Ⅰ]也是说两个相邻的房间不能同时偷&#xff0c;但是首尾房间不是相邻的…

Java多线程基础:虚拟线程与平台线程解析

在这篇文章中&#xff0c;主要总结一些关于线程的概念&#xff0c;以及更近期的名为虚拟线程的特性。将了解平台线程和虚拟线程在性质上的区别&#xff0c;以及它们如何促进应用程序性能的改进 经典线程背景&#xff1a; 让我们以调用外部API或某些数据库交互的场景为例&…