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() {@Overridepublic 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 {@Beanpublic 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服务端和客户端的启动与停止

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

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

相关文章

1127: 矩阵乘积

题目描述 计算两个矩阵A和B的乘积。 输入 第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b; 接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b; 最后的p行是矩…

SpringFramework实战指南(一)

SpringFramework实战指南&#xff08;一&#xff09; 一、技术体系结构1.1 总体技术体系1.2 框架概念和理解 一、技术体系结构 1.1 总体技术体系 单一架构 一个项目&#xff0c;一个工程&#xff0c;导出为一个war包&#xff0c;在一个Tomcat上运行。也叫all in one。 单一架…

Kubernetes (十二) 存储——Volumes配置管理

一. 卷的概念 官方地址&#xff1a;卷 | Kuberneteshttps://v1-24.docs.kubernetes.io/zh-cn/docs/concepts/storage/volumes/ 二. 卷的类型及使用 …

前端性能优化之数据存取,存储以及缓存技术

无论是哪种计算机语言&#xff0c;说到底它们都是对数据的存取与处理。若能在处理数据前&#xff0c;更快地读取数据&#xff0c;那么必然会对程序执行性能产生积极的作用。 一般而言&#xff0c;js的数据存取有4种方式。 直接字面量:字面量不存储在特定位置也不需要索引&…

spring基于XML方式的组件管理

基本介绍 依赖注入是一种处理对象间依赖关系的技术。在Spring中&#xff0c;依赖注入有构造方法注入和设值注入两种方式。 设值注入是将依赖作为成员变量&#xff0c;通过主调类的setter方法注入依赖。构造方法注入则是在Bean的构造方法中注入依赖。 本次我们将通过具体例子来…

CSC8021_computer network_The Transport Layer

Role of the transport layer • The transport layer is responsible for providing a reliable end-to-end connection between two application processes in a network • Abstracting away the physical subnet • Does not involve intermediate nodes • Takes a netwo…

UML-通信图和交互概览图(通信图和顺序图的区别与联系)

UML-通信图和交互概览图&#xff08;通信图和顺序图的区别与联系&#xff09; 一、通信图简介1.消息2.链接 二、通信图和[顺序图](https://blog.csdn.net/weixin_65032328/article/details/135587782)的联系与区别三、交互概览图四、顺序图转化为通信图练习 一、通信图简介 通…

2.2 物理层

2.2 物理层 2.2.1 物理层的基本概念 1、物理层主要解决在各种传输媒体上传输比特0和1的问题&#xff0c;进而给数据链路层提供透明传输比特流的服务 2、由于传输媒体的种类太多&#xff08;例如同轴电缆、光纤、无线电波等&#xff09;&#xff0c;物理连接方式也有很多例如…

libcurl开源库的编译与使用全攻略

libcurl简介 libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库&#xff0c;提供了许多用于数据传输的API&#xff0c;例如文件传输、FTP、HTTP、HTTPS、SMTP等。libcurl 的主要特点包括 支持多种协议&#xff1a;libcurl 支持多种协议&#xff0c;如 HTTP、F…

Spring集成

目录 概述1 声朋一个简单的集成流1.1 使用XML定义集成流1.2 使用Java配置集成流1.3 使用Spring lntegration 的 DSL 配置 2 Spring integration 功能概览2.1 消息通道2.2 过滤器2.3 转换器2.4 路由器2.5 切分器2.6 服务激活器2.7 网关2.8 通道适配器2.9 端点模块 概述 就像我们…

JDK8-JDK17版本升级

局部变量类型推断 switch表达式 文本块 Records 记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类&#xff0c;但代码少得多&#xff1b;大多数开发人员使用 Lombok 生成 POJO 类&#xff0c;但是有了记录&#xff0c;你就不需要使…

逸学Docker【java工程师基础】3.1安装Jenkins

1.下载镜像 docker pull jenkins/jenkins:lts 2.运行容器 docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:lts 3.要启动名为 jenkins 的 Docker 容器 docker st…

HarmonyOS-LocalStorage:页面级UI状态存储

管理应用拥有的状态概述 上一个章节中介绍的装饰器仅能在页面内&#xff0c;即一个组件树上共享状态变量。如果开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态…

OpenGauss源码分析-SQL引擎

所讨论文件大多位于src\common\backend\parser文件夹下 总流程 start_xact_command()&#xff1a;开始一个事务。pg_parse_query()&#xff1a;对查询语句进行词法和语法分析&#xff0c;生成一个或者多个初始的语法分析树。进入foreach (parsetree_item, parsetree_list)循环…

LeetCode 每日一题 Day 37-43

终于考完试了&#xff0c;寒假期间将会每天持续更新&#xff01; 447. 回旋镖的数量(Day 37) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧…

通过开源端点可见性改善网络安全响应

在当今复杂的数字环境中&#xff0c;企业内的许多不同端点&#xff08;从数据中心的服务器到咖啡店的笔记本电脑&#xff09;创建了巨大且多样化的攻击面。每个设备都存在网络安全威胁的机会&#xff0c;每个设备都有其独特的特征和复杂性。攻击者使用的多种攻击媒介不仅是一个…

正则表达式中的“回引用(回溯)”——别名引用与序号引用的差异及正则表达式中的“P”关键字

读到一段巧妙的正则表达式&#xff0c;勾起我对正则表达式欠缺知识点的探寻&#xff1a; P y t h o n Python Python正则表达式中的“回引用(回溯)”——分组别名引用与序号引用的差异及正则表达式中的“P”关键字详情。 (笔记模板由python脚本于2024年01月14日 07:49:35创建&a…

pytorch集智4-情绪分类器

1 目标 从中文文本中识别出句子里的情绪。和上一章节单车预测回归问题相比&#xff0c;这个问题是分类问题&#xff0c;不是回归问题 2 神经网络分类器 2.1 如何用神经网络分类 第二章节用torch.nn.Sequantial做的回归预测器&#xff0c;输出神经元只有一个。分类器和其区别…

QT——connect的第五个参数 Qt::ConnectionType (及qt和c++的多线程的区别)

一直对QT的多线程和c的多线程的区别有疑惑&#xff0c;直到看到文档中这一部分内容才豁然开朗 一.ConnectionType参数的类型和区别 首先是官方文档中对于该枚举值的区别介绍&#xff1a; 对于队列&#xff08;queued &#xff09;连接&#xff0c;参数必须是 Qt 元对象系统已知…

强化学习应用(四):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…