ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(一)

本系列文章简介:

        本系列文章将会深入探讨ZooKeeper的各个方面,从基本概念到实际应用,从架构原理到开发实践,帮助读者全面了解和掌握这个强大的注册中心。我们会通过丰富的实例和案例,帮助读者理解和应用ZooKeeper的各种能力和特性。无论是系统架构师、运维工程师还是开发人员,都能从本书中获得实用的知识和经验。欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分! 

目录

一、ZooKeeper注册中心概述

1.1 ZooKeeper简介

1.2 ZooKeeper在分布式系统中的作用

1.3 ZooKeeper注册中心的定义与重要性

二、ZooKeeper注册中心的核心功能

2.1 服务注册与发现

2.2 配置管理

2.3 分布式锁

2.4 集群管理

2.5 领导选举

三、ZooKeeper注册中心的工作原理

3.1 ZooKeeper的节点(ZNode)

3.2 数据模型和事务性

3.3 分布式一致性协议:Zab协议

3.4 Watcher机制

四、ZooKeeper注册中心的使用场景

五、ZooKeeper注册中心的部署与配置

六、ZooKeeper注册中心的优化与最佳实践

七、ZooKeeper注册中心的未来展望

八、结语


一、ZooKeeper注册中心概述

1.1 ZooKeeper简介

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,由Apache进行维护。它是Google的Chubby的一个开源实现,并被广泛应用于Hadoop和Hbase等分布式系统中。ZooKeeper的目标是为分布式应用提供一个高效且可靠的分布式协调服务,封装复杂且易出错的关键服务,提供简单易用的接口和性能高效、功能稳定的系统。

ZooKeeper通过其提供的服务,如统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等,解决了分布式系统中常见的问题,如数据一致性、服务发现和配置管理等。ZooKeeper采用了一种名为ZAB的一致性协议来确保分布式系统中的数据一致性,而不是直接使用Paxos算法。

ZooKeeper的主要特性包括顺序一致性、原子性、单一视图、可靠性和实时性。这些特性保证了ZooKeeper在处理来自客户端的事务请求时,能够按照请求的顺序进行处理,并确保所有事务请求的处理结果在整个集群中所有机器上都是一致的。此外,ZooKeeper将所有客户端看到的服务端数据模型都保持一致,并且一旦服务端成功应用了一个事务,其引起的改变会一直保留,直到被另外一个事务所更改。

ZooKeeper的设计目标包括提供一个高性能、高可用且具有严格顺序访问控制能力的分布式协调服务。它通过将数据全量存储在内存中来实现高吞吐,减少访问延迟。ZooKeeper还可以构建集群,只要集群中有半数机器能够正常工作,整个集群就可以正常提供服务。此外,ZooKeeper为来自客户端的每个更新请求分配一个全局唯一的递增ID,以反映所有事务请求的先后顺序。

ZooKeeper通过树形结构来存储数据,由一系列被称为ZNode的数据节点组成,类似于常见的文件系统。然而,与常见的文件系统不同,ZooKeeper将数据全量存储在内存中,以实现高吞吐量和减少访问延迟。每个ZNode都可以通过其路径唯一标识,并默认能够存储1MB的数据。

1.2 ZooKeeper在分布式系统中的作用

ZooKeeper在分布式系统中起着至关重要的作用,它主要提供分布式协调服务,用于管理和协调各种服务和进程。具体来说,ZooKeeper在分布式系统中的作用包括以下几个方面:

  1. 配置管理:ZooKeeper可以用来存储和管理分布式系统中的配置信息,使得各个节点可以实时获取到最新的配置数据。当配置发生变化时,ZooKeeper可以通知相关节点进行相应的更新。
  2. 服务发现:在分布式系统中,服务节点动态变化是常态。ZooKeeper可以帮助节点在系统中注册和发现其他服务,从而实现负载均衡和故障转移。
  3. 分布式锁:ZooKeeper提供了分布式锁机制,可以解决分布式系统中的资源竞争问题,保证同一时间只有一个节点能够访问共享资源。
  4. 集群管理:ZooKeeper可以监控分布式系统中各个节点的状态,实现集群成员的自动管理,包括故障检测、成员变更通知等功能。
  5. 分布式协调:ZooKeeper提供原子性广播(Atomic Broadcast)功能,可以协调分布式系统中节点间的动作,例如选举、同步等。
  6. 分布式队列:ZooKeeper可以实现分布式队列,支持先进先出(FIFO)策略,帮助系统完成任务调度和协同工作。
  7. 数据一致性:ZooKeeper保证数据的一致性,确保分布式系统中的各个节点可以访问到相同的数据。

ZooKeeper的这些功能使得它成为分布式系统中常见的基础系统,广泛应用于各种需要分布式协调的场景,如微服务架构中的服务注册与发现、分布式系统中的配置管理、分布式锁和同步控制等。ZooKeeper通过其高性能、高可用性和严格顺序访问控制能力的特性,为分布式系统提供了稳定可靠的协调机制。

1.3 ZooKeeper注册中心的定义与重要性

ZooKeeper注册中心是一个高可用、高性能的分布式协调服务,用于管理和协调分布式系统中的各种资源和服务。它可以用作分布式系统中的注册中心,帮助系统中的各个节点发现、注册和管理服务。

在分布式系统中,各个节点可能需要共享一些关键信息,如服务地址、配置信息等。ZooKeeper注册中心可以提供一个统一的位置来存储和管理这些信息。它允许节点注册自己的服务,并可提供服务发现功能,使其他节点可以轻松地找到需要的服务。

ZooKeeper注册中心的重要性可以从以下几个方面进行说明:

  1. 服务发现:ZooKeeper注册中心可以帮助系统中的节点快速发现和获取所需的服务。节点可以通过订阅ZooKeeper节点事件来获取服务的变化通知,以实现动态服务发现和负载均衡。

  2. 负载均衡:ZooKeeper注册中心可以维护服务节点的状态信息并提供负载均衡策略。它可以根据节点的负载情况,动态调整服务路由,使请求能够均匀地分布到各个节点上,提高系统的整体性能和容错能力。

  3. 配置管理:ZooKeeper注册中心可以用来存储和管理系统的配置信息。节点可以通过监听ZooKeeper的配置节点,及时获取到最新的配置,对系统进行动态调整和适应环境变化。

  4. 高可用性:ZooKeeper注册中心采用分布式架构,通过多节点的方式提供高可用性和容错能力。即使某个节点发生故障,其他节点仍然能够继续提供服务,确保系统的可用性和稳定性。

ZooKeeper注册中心在分布式系统中起到了关键的作用,可以帮助系统中的节点进行服务发现、负载均衡、配置管理等,提高系统的可用性、性能和稳定性。

二、ZooKeeper注册中心的核心功能

2.1 服务注册与发现

ZooKeeper注册中心的核心功能之一是服务注册与发现。服务注册是指将微服务的相关信息(例如IP地址、端口号、服务名称等)注册到ZooKeeper节点上,以便其他微服务或客户端可以访问和使用这些服务。服务发现是指通过查询ZooKeeper节点,可以获取已注册的微服务的信息,从而可以动态地发现和使用这些服务。

服务注册与发现的流程如下:

  1. 微服务启动时,将自己的相关信息(IP、端口、服务名等)注册到ZooKeeper节点上。可以使用ZooKeeper提供的API来实现注册功能。
  2. 当其他微服务或客户端需要访问某个服务时,首先会向ZooKeeper节点发送请求,查询是否有已注册的该服务的信息。
  3. 如果有已注册的该服务,ZooKeeper节点会返回该服务的相关信息给微服务或客户端。
  4. 微服务或客户端根据返回的服务信息,可以动态地调用该服务。

通过服务注册与发现,微服务架构可以实现以下优势:

  1. 简化微服务的管理:通过将服务注册到注册中心,可以统一管理和监控微服务的状态和健康状况。
  2. 实现负载均衡:通过服务注册与发现,可以根据负载情况动态地分配请求给不同的微服务实例,从而实现负载均衡。
  3. 支持弹性伸缩:当需要增加或减少微服务的实例时,可以通过服务注册与发现来动态地添加或删除服务实例。
  4. 提高系统的可靠性:当某个微服务实例出现故障时,注册中心可以自动剔除该实例,从而保证系统的可靠性。

2.2 配置管理

ZooKeeper注册中心的核心功能之一是配置管理。配置管理指的是将应用程序的配置信息存储和管理在ZooKeeper注册中心中。通过配置管理,应用程序可以动态地读取和修改配置信息,而无需重新部署或重启。

在ZooKeeper注册中心中,配置信息被存储为节点的值。应用程序可以通过监听节点的变化来实时获取最新的配置信息。当配置信息发生更改时,ZooKeeper会通知应用程序进行相应的更新操作。

配置管理功能可以实现以下几方面的功能:

  1. 动态配置更新:应用程序可以通过监听配置节点的变化来实时获取最新的配置信息。当配置发生更改时,应用程序可以自动获取最新的配置,而不需要重新部署或重启。
  2. 配置版本管理:ZooKeeper可以为每个配置信息维护一个版本号。当配置发生更改时,版本号会自动增加。应用程序可以根据版本号来判断配置是否发生了更改,并进行相应的更新操作。
  3. 分布式配置管理:ZooKeeper注册中心是一个分布式系统,可以实现分布式配置管理。多个应用程序可以同时读取和修改配置信息,并通过ZooKeeper进行同步和协调。
  4. 配置可靠性保证:ZooKeeper注册中心会将配置信息存储在多个节点上,以保证配置的可靠性。即使某个节点发生故障,配置信息仍然可以从其他节点上获取。

ZooKeeper注册中心的配置管理功能可以帮助应用程序实现动态配置更新、版本管理、分布式配置管理和配置可靠性保证等功能,提供了一种方便和可靠的方式来管理应用程序的配置信息。


2.3 分布式锁

ZooKeeper注册中心的核心功能之一是分布式锁。分布式锁是一种用于协调多个节点之间互斥访问共享资源的机制,可以保证在分布式环境中只有一个节点能够获取到锁,并且在释放锁之前其他节点无法获取锁。

在ZooKeeper注册中心中,分布式锁的实现通常依赖于ZooKeeper的有序临时节点(Sequential Ephemeral Node)特性。具体来说,分布式锁的实现可以按照以下步骤进行:

  1. 每个节点在ZooKeeper中创建一个有序临时节点,作为自己的锁节点。
  2. 每个节点获取所有已经存在的锁节点,并对这些节点按照序号进行排序。
  3. 如果当前节点的锁节点是序号最小的节点,表示当前节点获取到了锁。
  4. 如果当前节点的锁节点不是序号最小的节点,表示当前节点需要监听比自己序号小的节点的删除事件。
  5. 当比自己序号小的节点被删除时,当前节点会收到ZooKeeper的通知,可以重新检查自己是否成为了最小序号的节点,从而获取到锁。
  6. 当当前节点释放锁时,只需删除自己的锁节点即可。

通过以上步骤,ZooKeeper注册中心可以实现简单而可靠的分布式锁机制。分布式锁可以用于各种场景,例如限制同时只能有一个节点执行某个任务、实现并发控制等。它是构建分布式系统中常用的一种基础机制。


2.4 集群管理

ZooKeeper注册中心的核心功能之一是集群管理。ZooKeeper可以作为一个集中式的协调服务,用于管理和维护分布式系统中的节点和集群状态。

具体来说,ZooKeeper注册中心的集群管理功能包括以下几个方面:

  1. 节点注册和发现:ZooKeeper允许节点将自己注册到注册中心,并提供一个唯一的路径作为节点的标识。其他节点可以通过查询注册中心来发现和获取已注册的节点的信息。

  2. 集群成员管理:ZooKeeper可以维护一个集群成员列表,记录当前活跃的集群节点。当节点加入或离开集群时,ZooKeeper可以通知其他节点更新集群成员列表。

  3. 集群状态监控:ZooKeeper可以监控集群的状态和健康状况。它可以定期检查集群中的节点是否存活,并提供监控指标和报警机制,帮助管理员及时发现和解决问题。

  4. 集群协调与同步:ZooKeeper提供了一些分布式协调和同步的原语,如锁、信号量和队列等。这些原语可以帮助分布式系统实现复杂的协调和同步操作,保证多个节点之间的顺序和一致性。

通过以上功能,ZooKeeper注册中心可以有效地管理和维护分布式系统中的节点和集群状态,提供一致性和可靠性的服务支持。同时,它也为分布式系统的开发者提供了一种方便和可靠的方式来管理和协调分布式节点的行为和通信。


2.5 领导选举

在ZooKeeper注册中心中,领导选举是其中一个核心功能。当一个ZooKeeper集群中的服务器启动或宕机时,需要选择一个新的领导来管理整个集群的状态和协调工作。领导选举的过程如下:

  1. 服务器加入集群时:当一个服务器启动时,它会和集群中的其他服务器通信,尝试加入集群。在加入过程中,服务器会提交自己的身份信息,并与其他服务器进行通信,以了解当前集群的状态。

  2. 选举过程:当一个服务器加入集群后,它将参与到领导选举的过程中。ZooKeeper使用了一种称为“ZAB协议”的一致性算法来进行选举。这个协议保证了在一个集群中只有一个服务器成为领导。

  3. 选举算法:ZAB协议中的选举算法是基于主从模型的。在初始状态下,所有的服务器都是“投票者”,并没有一个确定的领导。当集群中的服务器发现当前没有领导时,它们会相互通信,尝试成为领导。

  4. 选举过程中的角色转换:当一个服务器发出选举请求后,其他服务器会回复一个选举结果。如果一个服务器收到了多数选票,则它将成为领导。如果多个服务器同时成为领导,则选举将失败,需要重新进行选举。

  5. 选举成功的结果:一旦选举成功,新的领导将开始承担管理集群的责任。它将负责处理客户端的请求、协调服务器之间的状态同步,并监控集群中的服务器状态。

通过领导选举,ZooKeeper注册中心可以确保在集群中只有一个有效的领导服务器,从而保证整个集群的一致性和稳定性。

三、ZooKeeper注册中心的工作原理

3.1 ZooKeeper的节点(ZNode)

ZooKeeper节点(ZNode)是ZooKeeper注册中心的关键组成部分,用于存储和管理数据。ZNode类似于文件系统中的节点,它可以表示一个目录或一个文件。

ZNode有以下几个重要的特点:

  1. 层级结构:ZNode可以以层级结构进行组织,即一个节点可以有多个子节点,形成一个树状结构。根节点是"/",子节点通过路径来标识,例如:/root/child。

  2. 数据存储:每个ZNode可以存储一小段数据,这些数据可以是任意的字节内容。ZooKeeper提供了读取和写入ZNode数据的API。

  3. 版本号:每个ZNode都有一个版本号,用于标识该节点的数据状态。每次节点的数据发生变化,版本号都会自增。

  4. 监听机制:ZooKeeper允许客户端对ZNode进行监听,当一个ZNode的数据发生变化时,客户端可以及时收到通知。这个机制可以用于实现分布式锁、配置管理等功能。

ZooKeeper的节点使用了原子操作来保证数据的一致性和可靠性,节点的创建、删除、读写等操作是原子的,保证了多个客户端之间数据的一致性。

节点的数据存储在ZooKeeper的内存中,并在内存中维护一份数据的快照和事务日志。当有客户端对节点进行数据的读写操作时,ZooKeeper会根据内存中的数据进行处理,并将结果返回给客户端。数据的更新会使用类似于分布式锁的机制来处理,以保证数据的一致性。

ZooKeeper节点(ZNode)是ZooKeeper注册中心的核心,它以层级结构存储和管理数据,通过版本号和监听机制实现数据的一致性和可靠性。


3.2 数据模型和事务性

ZooKeeper注册中心工作的基本原理是通过维护一个分布式数据模型来进行协调和管理。该数据模型是一个类似于文件系统的树状结构,由一系列的节点(节点可以是目录或者叶子节点)组成。

每个节点都有一个全局唯一的路径来标识它,并且可以存储一个小的数据负载。这个数据负载可以用来存储一些配置信息、状态信息或者其他需要共享的数据。

ZooKeeper利用这个数据模型来提供分布式协调和管理的功能。它通过提供一套简单的API,允许客户端对这些节点进行创建、删除、读取和写入等操作。同时,ZooKeeper还提供了一些监视功能,允许客户端对节点的变化进行监听。

另外,ZooKeeper还具有事务性的特性。在ZooKeeper中,一个事务由一系列操作组成,这些操作要么全部成功执行,要么全部回滚。ZooKeeper通过维护一个递增的事务ID来保证事务的顺序性。

当客户端发起一个事务请求时,ZooKeeper会将请求中的操作按照顺序进行执行,并将结果返回给客户端。如果其中的任何一步操作失败了,整个事务就会回滚,所有操作都不会生效。

通过数据模型和事务性的支持,ZooKeeper可以实现一些常见的分布式系统中的核心功能,例如分布式锁、领导者选举、配置管理等。


3.3 分布式一致性协议:Zab协议

Zab协议是ZooKeeper中使用的一种分布式一致性协议,用于确保多个ZooKeeper服务器之间的数据一致性和可靠性。

Zab协议是基于领导者-追随者模型的,在一个ZooKeeper集群中只有一个领导者和多个追随者。领导者负责处理客户端的读写请求,并将写操作广播给所有的追随者。

Zab协议主要分为两个阶段:选主和广播。

在选主阶段,ZooKeeper集群中的服务器会进行选举,选择出一个领导者。选举过程中,每个服务器会发出投票,选票包含服务器的ID和ZXID(事务ID),服务器会根据规则选择出一个ZXID最大的服务器作为领导者。

选主完成后,进入广播阶段。领导者负责接收客户端的写请求,并生成一个全局唯一的ZXID,然后将这个写请求广播给所有的追随者。追随者在接收到写请求后,会将其写入本地的日志文件,并向领导者发送ACK确认。

领导者在接收到大多数(即大部分追随者)的ACK确认后,认为写操作已经被提交,并将提交的标志通知给追随者。追随者在接收到提交标志后,会将该写操作应用到自己的数据状态中。

通过这种方式,Zab协议确保了分布式系统中的数据一致性。如果领导者发生故障,Zab会重新进行选举,选择一个新的领导者来继续处理客户端的请求。

总之,Zab协议是ZooKeeper中用于实现分布式一致性的关键协议,通过选主和广播两个阶段,确保了数据在多个服务器之间的一致性和可靠性。


3.4 Watcher机制

ZooKeeper注册中心的工作原理中,Watcher机制是一个重要的组成部分。

Watcher机制是指客户端在与ZooKeeper服务端建立连接后,可以设置对指定数据节点的监听。当这个节点的数据发生变化时,ZooKeeper会主动通知客户端,客户端就可以根据收到的通知做出相应的处理。

Watcher机制的实现是基于ZooKeeper的事件驱动模型。当一个客户端设定了一个Watcher,它就会在ZooKeeper服务端上注册这个Watcher对象,并将其与指定的数据节点关联起来。当这个数据节点的数据发生变化后,ZooKeeper服务端就会将这个变化的事件发送给所有关联的Watcher对象。

客户端通过注册Watcher机制可以实时获取数据的变化,可以很好地应用于分布式系统中的服务发现和配置管理等场景。在服务发现中,当某个服务的注册信息发生变化时,相关的客户端会收到对应的通知,从而能够获取最新的服务信息;在配置管理中,当配置文件发生变化时,客户端就可以及时更新自己的配置信息。

Watcher机制具有以下特点:

  1. 一次性触发:当Watcher被触发后,它只会被执行一次,需要客户端重新注册新的Watcher。
  2. 顺序执行:ZooKeeper保证Watcher在注册时的顺序,即先注册的Watcher先执行。
  3. 客户端与ZooKeeper之间的连接断开后,Watcher会被自动删除,不再接收任何事件通知。

由于Watcher机制是ZooKeeper的重要特性之一,合理使用Watcher可以提高分布式系统的实时性和可靠性。同时,需要注意的是,过多的Watcher会增加系统的负担,因此在使用Watcher时需要谨慎处理。

四、ZooKeeper注册中心的使用场景

详见《ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(二)

五、ZooKeeper注册中心的部署与配置

详见《ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(二)

六、ZooKeeper注册中心的优化与最佳实践

详见《ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(二)

七、ZooKeeper注册中心的未来展望

详见《ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(二)

八、结语

        ZooKeeper注册中心是一种强大的工具,可以帮助我们构建可靠、高性能的分布式系统。它在大规模分布式系统中的应用已经被广泛证明,并且得到了业界的广泛认可。无论是在云计算、大数据还是物联网等领域,ZooKeeper注册中心都是一个不可或缺的组件。通过深入理解和灵活运用ZooKeeper注册中心,我们可以为分布式系统的设计和开发带来更大的便利和可靠性。希望本文对您在使用和深入研究ZooKeeper时能够提供一些有用的指导和帮助。

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

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

相关文章

SQL面试题及答案

介绍 在快节奏的数据管理和信息技术世界中,导航和操作结构化数据的能力是一项非常重要的技能。SQL,即结构化查询语言,是关系数据库的基石,掌握这种语言的专业人员的需求量很大。SQL 面试在科技行业很常见,潜在的候选人会接受测试以展示他们的知识和解决问题的能力。为了帮…

嵌入式Linux中apt、apt-get命令用法汇总

在Linux环境开发过程中接触ubuntu虚拟机时,在安装软件或者更新软件时apt和apt-get命令使用相对较频繁,下面对这两个命令的用法进行汇总。 apt(Advanced Package Tool)和 apt-get 是用于在基于 Debian 的 Linux 发行版中进行软件包…

Echarts与后台(mongoose)交互

Echarts引入地址可参考 echarts组件引入 <template><div><div id"main" style"width: 600px;height:400px;"></div></div> </template><script setup> import { onMounted, ref } from vue; import * as echa…

协程源码 launch 流程跟踪学习

为了更深入学习协程的底层实现原理&#xff0c;了解协程线程切换的根本本质。也为了以后在工作中可以根据不同的需求场景&#xff0c;更加随心所欲的使用不同的协程。 今天通过 launch 跟踪一下协程的执行流程。 fun getData() {Trace.beginSection("getData");Log.…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

C语言——指针——第2篇——(第20篇)

坚持就是胜利 文章目录 一、指针和数组二、二级指针1、什么是 二级指针&#xff1f;2、二级指针 解引用 三、指针数组模拟二维数组 一、指针和数组 问&#xff08;1&#xff09;&#xff1a;指针和数组之间是什么关系呢&#xff1f; 答&#xff1a;指针变量就是指针变量&…

Kotlin 中注解 @JvmOverloads 的作用

JvmOverloads 注解的作用就是&#xff1a;在有默认参数值的方法加上 JvmOverloads 注解&#xff0c;则 Kotlin 就会暴露多个重载方法。 例如&#xff0c;没有加注解&#xff0c;默认参数没有起到任何作用。 fun f(a: String, b: Int 0, c: String "abc") {}那相当…

多窗口编程

六、多窗口编程 QMessageBox消息对话框&#xff08;掌握&#xff09; QMessageBox继承自QDialog&#xff0c;显示一个模态对话框。用于用户前台信息通知或询问用户问题&#xff0c;并接收问题答案。 QDialog的Qt源码中&#xff0c;派生类往往都是一些在特定场合下使用的预设好的…

物麒平台长按持续音量+-实现方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送蓝牙音频&#xff0c;DSP音频项目核心开发资料, 1 问题 目前设置为长按音量-&#xff0c;但是默认的是单步加减方式(长按一次变化一格&a…

Leetcoder Day18| 二叉树 part07

语言&#xff1a;Java/Go 今天做了一个小决定&#xff0c;如果时间不够的话&#xff0c;可以先看go去找实习&#xff0c;所以现在加上用go去刷题 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。…

模方把工程换一个电脑,可以改工程读取的数据路径吗?

答&#xff1a;目前暂时还无法修改工程读取的数据路径。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结构&#xff0c;平均…

C#_扩展方法

简述&#xff1a; 扩展方法所属类必需是静态类&#xff08;类名依据规范通常为XXXExtension&#xff0c;XXX为被扩展类&#xff09;扩展方法必需是公有的静态方法扩展方法的首个参数由this修饰&#xff0c;参数类型为被扩展类型 示例&#xff1a; static class DoubleExtens…

敏捷项目管理在现代软件开发中的应用

在现代软件开发领域&#xff0c;项目管理起着至关重要的作用。随着技术的不断进步和市场需求的快速变化&#xff0c;传统的项目管理方法已逐渐无法满足软件开发的需求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;成为许多软件开发团队的首选方法。本文将探讨敏捷项目管…

蓝桥杯刷题--python-11-前戳和,差分,二分

3956. 截断数组 - AcWing题库 n=int(input()) lis_num=list(map(int,input().split())) lis_num=[0]+lis_num for i in range (1,n+1): lis_num[i]=lis_num[i-1]+lis_num[i] if lis_num[n] % 3: print(0) else: res=0 cnt=0 for j in range (2,n): …

【深基12.例1】部分背包问题

题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N≤100) 堆金币&#xff0c;第 i i i 堆金币的总重量和总价值分别是 m i , v i ( 1 ≤ m i , v i ≤ 100 ) m_i,v_i(1\le m_i,v_i \le 100) mi​,vi​(1≤mi​,vi​≤100)。阿里巴巴…

【C++】STL中List的详细实现解析

文章目录 前言list 代码实现1. 构造函数和析构函数1.1 构造函数1.2析构函数 2.operator的重载 和 拷贝构造函数2.1 拷贝构造2.2 operator的重载 3. 迭代器的实现3.1 普通迭代器3.2 const迭代器 4. 插入和删除5. 测试代码总结 前言 在 C STL&#xff08;标准模板库&#xff09;…

【discuz x3.5】网站迁移记录

近期需要迁移一个discuz x3.5 论坛&#xff0c;记录一下迁移过程&#xff0c;以备用&#xff01; 1、在原网站后台-站长>数据库进行数据备份 2、在根目录打包网站所有文件 3、到官网下载一个跟网站版本相同的安装包 4、把新的安装包里的-install-安装文件夹覆盖到原网站…

mac命令行安装java

安装 sdkman sdkman 是java的一个版本管理的工具&#xff0c;比homebrew安装java更方便。可以安装多个版本的java sdkman 的安装命令如下 # 安装sdkman需要科学上网&#xff0c;先设置一下curl的代理&#xff0c;否则会因为网络原因安装失败 # 我用的clashX&#xff0c;代理…

在C语言中,设置Linux系统时间

C 语言中使用 mktime 函数和 stime 函数来处理时间。 处理之前&#xff0c;需要先获取当前的时间戳。并使用当前的时间戳生成struct tm&#xff0c;struct tm是C语言中用于表示日期和时间的结构体&#xff0c;通常用于在程序中操作和处理日期时间信息。它包含了以下成员变量&a…

DataDreamer:让创建自定义数据集轻松无比!还自带标注!

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ash…