分布式协调系统ZooKeeper实践与原理剖析

news/2024/5/18 20:43:27/文章来源:https://blog.csdn.net/luoyepiaoxue2014/article/details/128017156

基础的一些知识,高阶知识后续看看补充

第一章 ZooKeeper概述

1.1 介绍

  What is ZooKeeper?  Apache ZooKeeper is an effort to develop and maintain an  open-source server which enables highly reliable distributed coordination   ZooKeeper is a centralized service for maintaining configuration  information, naming, providing distributed synchronization, and providing  group services. All of these kinds of services are used in some form or  another by distributed applications. Each time they are implemented there is  a lot of work that goes into fixing the bugs and race conditions that are  inevitable. Because of the difficulty of implementing these kinds of  services, applications initially usually skimp on them ,which make them  brittle in the presence of change and difficult to manage. Even when done  correctly, different implementations of these services lead to management  complexity when the applications are deployed  

​ ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比 如分布式同步,配置管理,集群管理,命名管理,队列管理。它被设计为易于编程,使用文 件系统目录树作为数据模型。服务端跑在 java 上,提供 java 和 C 的客户端 API

​ 众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于 竞态以至于出现死锁。我们设计 ZooKeeper 的目的是为了减轻分布式应用程序所承担的协 调任务

​ ZooKeeper 是集群的管理者,监视着集群中各节点的状态,根据节点提交的反馈进行下 一步合理的操作。最终,将简单易用的接口和功能稳定,性能高效的系统提供给用户。

官网地址:http://ZooKeeper.apache.org/

官网快速开始地址:http://ZooKeeper.apache.org/doc/trunk/ZooKeeperStarted.html

官网 API 地址:http://ZooKeeper.apache.org/doc/r3.4.10/api/index.html

1.2 特点/设计目的

ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的各服务节点进行数据的复制和同步

数据复制的好处:

1、容错:一个节点出错,不至于让整个集群无法提供服务。

2、扩展性:通过增加服务器节点能提高 ZooKeeper 系统的负载能力,把负载分布到多个节点上。

3、高性能:客户端可访问本地 ZooKeeper 节点或者访问就近的节点,依次提高用户的访问速度。

特点:

1、 最终一致性:client 不论连接到哪个 Server,展示给它都是同一个视图,这是 ZooKeeper 最重要的性能。

2、 可靠性:具有简单、健壮、良好的性能,如果消息 m 被到一台服务器接受,那么它将被所有的服务器接受。

3、 实时性:ZooKeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者 服务器失效的信息。但由于网络延时等原因,ZooKeeper 不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync()接口。

4、 等待无关(wait-free):慢的或者失效的 client 不得干预快速的 client 的请求,使得每个 client 都能有效的等待

5、 原子性:更新只能成功或者失败,没有中间状态。

6、 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布;偏序是指如果一个消息 b 在 消息 a 后被同一个发送者发布,a 必将排在 b 前面。

1.3 结构

1.3.1 文件系统

​ ZooKeeper 的命名空间就是 ZooKeeper 应用的文件系统,它和 linux 的文件系统很像,也是树 状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。与 linux文件系统不同的是,linux文件系统有目录和文件的区别,而ZooKeeper统一叫做znode, 一个 znode 节点可以包含子 znode,同时也可以包含数据。

​ 所以总结说来,znode 即是文件夹又是文件的概念,所以在 ZooKeeper 这里面就不叫文件也不叫文件夹,叫znode,每个znode有唯一的路径标识,既能存储数据,也能创建子znode。 但是 znode 只适合存储非常小量的数据,不能超过 1M,最好小于 1K。

在这里插入图片描述

​ 下面是关于 Znode 的介绍(非常重要):

1、Znode 有两种类型:

短暂(ephemeral)/临时节点

持久(persistent)

2、Znode 有四种形式的目录节点(默认是 persistent )

PERSISTENT 、PERSISTENT_SEQUENTIAL 、EPHEMERAL 、EPHEMERAL_SEQUENTIAL

create /hadoop "hello"
create -s /hadoop "hello"

3、创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过 顺序号推断事件的顺序。

5、EPHEMERAL 类型的节点不能有子节点。

6、客户端可以在 znode 上设置监听器。

1.3.2 监听机制

​ 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序

​ 监听器的工作机制,其实是在客户端会专门创建一个监听线程,在本机的一个端口上等待 Zookeeper集群发送过来事件
在这里插入图片描述

1.3.3 监听工作原理

​ ZooKeeper 的 Watcher 机制主要包括客户端线程、客户端 WatcherManager、Zookeeper 服务器三部分。客户端在向 ZooKeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。

在这里插入图片描述

1.4 ZooKeeper典型应用场景

1.4.1 命名服务

​ 命名服务是分布式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集 群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体、服务地址和提供者的信息。Zookeeper 也可帮助应用系统通过资源引用的方式来实现对资源的定位和使用,广义上的命名服务的资源定位都不是真正意义上的实体资源,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。Zookeeper 可以实现一套分布式全局唯一 ID 的分配机制。

在这里插入图片描述

1.4.2 配置管理

​ 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到 ZooKeeper 上去,保存在 ZooKeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 ZooKeeper 的通知,然后从 ZooKeeper 获取新的配置信息应用到系统中就好
在这里插入图片描述

1.4.3 集群管理

​ 所谓集群管理无在乎两点:是否有机器退出和加入、选举 leader

1.4.4 分布式锁

有了 ZooKeeper 的一致性文件系统,锁的问题变得容易。

锁服务可以分为以下三类

一个是写锁,对写加锁,保持独占,或者叫做排它锁,独占锁

一个是读锁,对读加锁,可共享访问,释放锁之后才可进行事务操作,也叫共享锁

一个是控制时序,叫时序锁

1.4.5 队列管理

两种类型的队列:

1、同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。

2、先进先出队列:队列按照 FIFO 方式进行入队和出队操作。

第二章 ZooKeeper安装

只需要在hadoop0上面安装即可,后面直接复制到其他的节点上面

注意:根据自己的配置修改成自己的主机名即可,文档中主机名仅供参考。

已经单独在前面的集群文档中提供了。下面再次罗列一遍。

zookeeper-3.4.10.tar.gz版本安装

2.1 上传解压重命名

将zookeeper解压后文件夹重命名为zk

mv zookeeper-3.4.10.tar.gz /softwaretar -zxvf zookeeper-3.4.10.tar.gzmv zookeeper-3.4.10 zk

在这里插入图片描述

2.2 配置环境变量

配置/etc/profile,将$ZOOKEEPER_HOME/bin加入PATH环境变量

export ZOOKEEPER_HOME=/software/zk
vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export ZOOKEEPER_HOME=/software/zk
export PATH=.:$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
source /etc/profile

实际配置文件如下

 export JAVA_HOME=/software/jdkexport PATH=.:$PATH:$JAVA_HOME/binexport ZOOKEEPER_HOME=/software/zkexport PATH=.:$PATH:$ZOOKEEPER_HOME/bin  

在这里插入图片描述

2.3 修改配置文件

配置重命名conf/zoo_sample.cfg为conf/zoo.cfg,并配置

cd /software/zk/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg

注意修改之前最好先备份一份

在这里插入图片描述

dataDir=/software/zk/data

在最后添加上以下内容,其中2888是通讯端口,3888是选举端口

server.0=hadoop0:2888:3888server.1=hadoop1:2888:3888server.2=hadoop2:2888:3888

2.4 创建zookeeper的数据存放目录

配置myid

mkdir zk/data

cd zk/data

vi myid

写入0

在这里插入图片描述

2.5 复制到其他节点上

1、拷背zookeeper

scp -r /software/zk hadoop1:/software/

scp -r /software/zk hadoop2:/software/

2、修改zk/data/myid为各自相应的id值

Hadoop0对应的是0,hadoop1对应的是1,hadoop2对应的2,保证每个节点对应的是唯一的即可。

cd zk/data/

vi myid

2.6 环境变量的复制

注意将环境变量从hadoop0复制到hadoop1和hadoop2上面,或者直接配置环境变量也可以。

这里是直接配置的

  vi /etc/profileexport JAVA_HOME=/software/jdkexport PATH=.:$PATH:$JAVA_HOME/binexport ZOOKEEPER_HOME=/software/zkexport PATH=.:$PATH:$ZOOKEEPER_HOME/bin  source /etc/profile

2.7 启动测试

分别在三台服务器启动zookeeper

在zk的bin目录下面启动

在这里插入图片描述

zkServer.sh start

也可以通过zkServer.sh status 查看各服务器的角色状态

有leader 有follower 角色

leader不一定是在第一个节点上面,是由zookeeper内部的选举机制产生的。

几个注意点:

注意一:启动之前关闭防火墙或者配置安全组策略

systemctl status firewalld.service停止防火墙命令systemctl stop firewalld开机禁止启动命令
systemctl disable firewalld

注意二:集群中的selinux 关闭

getenforce:  disabled : 已经关闭  
setenforce 0 临时关闭  
vim /etc/selinux/config  改为disabled 

在这里插入图片描述

查看状态:

在这里插入图片描述

apache-zookeeper-3.7.0-bin.tar.gz版本安装

2.1 上传解压重命名

将zookeeper解压后文件夹重命名为zk

[root@hadoop10 software]# tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
[root@hadoop10 software]# mv apache-zookeeper-3.7.0-bin zk

在这里插入图片描述

2.2 配置环境变量

配置/etc/profile,将$ZOOKEEPER_HOME/bin加入PATH环境变量

vim /etc/profile
 export JAVA_HOME=/software/jdkexport PATH=.:$PATH:$JAVA_HOME/binexport ZOOKEEPER_HOME=/software/zkexport PATH=.:$PATH:$ZOOKEEPER_HOME/bin  

在这里插入图片描述

结束记得source /etc/profile

2.3 修改配置文件

配置重命名conf/zoo_sample.cfg为conf/zoo.cfg,并配置

cd /software/zk/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg

注意修改之前最好先备份一份

在这里插入图片描述

dataDir=/software/zk/data

在最后添加上以下内容,其中2888是通讯端口,3888是选举端口

server.0=hadoop10:2888:3888
server.1=hadoop11:2888:3888
server.2=hadoop12:2888:3888

2.4 创建zookeeper的数据存放目录

配置myid

mkdir zk/data

cd zk/data

vi myid

写入0

在这里插入图片描述

2.5 复制到其他节点上

1、拷背zookeeper

scp -r /software/zk hadoop11:/software/
scp -r /software/zk hadoop12:/software/

2、修改zk/data/myid为各自相应的id值

Hadoop0对应的是0,hadoop1对应的是1,hadoop2对应的2,保证每个节点对应的是唯一的即可。

cd zk/data/

vi myid

2.6 环境变量的复制

注意将环境变量从hadoop10复制到hadoop11和hadoop12上面,或者直接配置环境变量也可以。

这里是直接配置的

vi /etc/profileexport JAVA_HOME=/software/jdk
export PATH=.:$PATH:$JAVA_HOME/bin
export ZOOKEEPER_HOME=/software/zk
export PATH=.:$PATH:$ZOOKEEPER_HOME/bin  source /etc/profile

2.7 启动测试

分别在三台服务器启动zookeeper

在zk的bin目录下面启动

在这里插入图片描述

zkServer.sh start

也可以通过zkServer.sh status 查看各服务器的角色状态

有leader 有follower 角色

leader不一定是在第一个节点上面,是由zookeeper内部的选举机制产生的。

查看状态:

在这里插入图片描述

第三章 ZooKeeper的命令行操作

​ 首先,我们可以是用命令 bin/zkCli.sh 进入 ZooKeeper 的命令行客户端,这种是直接连接本机的 ZooKeeper 服务器,还有一种方式,可以连接其他的 ZooKeeper 服务器,只需要我们在命令后面接一个参数-server 就可以了。例如:zkCli.sh -server hadoop01:2181

进入命令行之后,键入 help 可以查看简易的命令帮助文档,如下图

在这里插入图片描述

查看 znode 子节点内容 
ls / 
ls /ZooKeeper创建 znode 节点 
create /zk "myData获取 znode 数据 
get /ZooKeeper 
get /ZooKeeper/node1设置 znode 数据 
set /zk "myData1"监听 znode 事件 
ls /ZooKeeper watch      ## 就对一个节点的子节点变化事件注册了监听 
get /ZooKeeper watch     ## 就对一个节点的数据内容变化事件注册了监听创建临时 znode 节点 
create -e /zk "myData创建顺序 znode 节点 
create -s /zk "myData"删除 znode 节点 
delete /zk         ## 只能删除没有子 znode 的 znode 
rmr /zk           ## 不管里头有多少 znode,统统删除

第四章 ZooKeeper的API操作

create(path, data, flags): 
创建一个 znode, path 是其路径,data 是存储在该 ZNode 上的数据, flags 常用的有: PERSISTEN, PERSISTENT_SEQUENTAIL, EPHEMERAL, EPHEMERAL_SEQUENTAILdelete(path, version): 
删除一个 ZNode,可以通过 version 删除指定的版本, 如果 version 是-1 的话,表示删除所有的版本exists(path, watch): 
判断指定 ZNode 是否存在,并设置是否 Watch 这个 ZNode。这里如果要 设置 Watcher 的话,Watcher 是在创建 ZooKeeper 实例时 指定的,如果要设置特定的 Watcher 的话,可以调用另一个重载版本的 exists(path, watcher)。
以下几个带 watch 参数的 API 也都类似getData(path, watch): 
读取指定 ZNode 上的数据,并设置是否 watch 这个 ZNodesetData(path, watch): 
更新指定 ZNode 的数据,并设置是否 Watch 这个 ZNodegetChildren(path, watch): 
获取指定 ZNode 的所有子 ZNode 的名字,并设置是否 Watch 这个 ZNodesync(path): 
把所有在 sync 之前的更新操作都进行同步,达到每个请求都在半数以上的 ZooKeeper Server 上生效。
path 参数目前没有用setAcl(path, acl): 
设置指定 ZNode 的 Acl 信息getAcl(path): 
获取指定 ZNode 的 Acl 信息

具体的代码上课后分发。

第五章 ZooKeeper原理

5.1 集群角色描述

在这里插入图片描述

在这里插入图片描述

5.2 集群选主

5.2.1 ZooKeeper的全新集群选主

​ 以一个简单的例子来说明整个选举的过程:假设有五台服务器组成的 zookeeper 集群,它们 的 serverid 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点 上,都是一样的。假设这些服务器依序启动,来看看会发生什么

1、服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是 LOOKING 状态

2、服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持 LOOKING 状态

3、服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1,2,3 中的老大,而与上面不同的是,此时有三台服务器(超过半数)选举了它,所以它成为了这次选举的 leader

4、服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1,2,3,4 中最大的,但是 由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命了

5、服务器 5 启动,同 4 一样,当小弟

总结:zookeeper server 的三种工作状态

LOOKING:当前 Server 不知道 leader 是谁,正在搜寻,正在选举

LEADING:当前 Server 即为选举出来的 leader,负责协调事务

FOLLOWING:leader 已经选举出来,当前 Server 与之同步,服从 leader 的命令

5.2.2 ZooKeeper的非全新集群选主

​ 那么,初始化的时候,是按照上述的说明进行选举的,但是当 zookeeper 运行了一段时间之 后,有机器 down 掉,重新选举时,选举过程就相对复杂了。

需要加入数据 version、serverid 和逻辑时钟。

数据 version:数据新的 version 就大,数据每次更新都会更新 version

server id:就是我们配置的 myid 中的值,每个机器一个

逻辑时钟:这个值从 0 开始递增,每次选举对应一个值,也就是说:如果在同一次选举中, 那么这个值应该是一致的;逻辑时钟值越大,说明这一次选举 leader 的进程更新,也就是 每次选举拥有一个 zxid,投票结果只取 zxid 最新的

选举的标准就变成:

1、逻辑时钟小的选举结果被忽略,重新投票

2、统一逻辑时钟后,数据 version 大的胜出

3、数据 version 相同的情况下,server id 大的胜出

根据这个规则选出 leader。

5.3 数据同步

选完 leader 以后,zk 就进入状态同步过程

1、leader 等待 server 连接;

2、follower 连接 leader,将最大的 zxid 发送给 leader;

3、leader 根据 follower 的 zxid 确定同步点;

4、完成同步后通知 follower 已经成为 uptodate 状态;

5、follower 收到 uptodate 消息后,又可以重新接受 client 的请求进行服务了。

以下是流程图:

在这里插入图片描述

5.4 工作流程

5.4.1 Leader工作流程

Leader 主要有三个功能:

1、恢复数据

2、维持与 Learner 的心跳,接收 Learner 请求并判断 Learner 的请求消息类型

​ Learner 的消息类型主要:

​ PING 消息:Learner 的心跳信息

​ REQUEST 消息:Follower 发送的提议信息,包括读写请求

​ ACK消息:Follower对提议的回复,超过半数 Follower 通过,则commit 该提议

​ REVALIDATE 消息:用来延长 SESSION 有效时间

3、根据不同的消息类型,进行不同的处理

5.4.2 Follower工作流程

Follower 主要有四个功能:

1、向 Leader 发送请求(PING 消息、REQUEST 消息、ACK 消息、REVALIDATE 消息)

2、接收 Leader 消息并进行处理

3、接收 Client 的请求,如果为写请求,则转发给 Leader

4、返回 Client 结果

Follower 的消息循环处理如下几种来自 Leader 的消息:

1、PING 消息: 心跳消息

2、PROPOSAL 消息:Leader 发起的提案,要求 Follower 投票

3、COMMIT 消息:服务器端最新一次提案的信息

4、UPTODATE 消息:表明同步完成

5、REVALIDATE 消息:根据 Leader 的 REVALIDATE 结果,关闭待 revalidate 的 session 还是允 许其接受消息

6、SYNC 消息:返回 SYNC 结果到客户端,这个消息最初由客户端发起,用来强制得到最新 的更新。

5.4.3 Observer工作流程

Observer 流程和 Follower 的唯一不同的地方就是 Observer 不会参加 Leader 发起的投票,也不会被选举为 Leader,所以不重复描述了。



声明:
        文章中代码为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

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

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

相关文章

大学生静态HTML网页设计--公司官网首页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#xf…

SpringIoc依赖查找-5

1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Name) JavaBeans - java.beans.beancontext.BeanContext 集合类型依赖查找 java.beans.beancontext.BeanContext 集合查找方法 层…

sqli-labs/Less-51

这一关的欢迎界面依然是以sort作为注入点 我们首先来判断一下是否为数字型注入 输入如下 sortrand() 对尝试几次 发现页面并没有发生变化 说明这道题的注入类型属于字符型 然后尝试输入以下内容 sort1 报错了 报错信息如下 我们从报错信息可以知道这道题的注入类型属于单…

期末前端web大作业——HTML+CSS+JavaScript仿京东购物商城网页制作(7页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

#边学边考 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理

答题报告 自我分析 有可能是间隔时间太长,本章节从开始学习到今天(11.24)学完,中间至少停止了1周以上,造成对基本知识记忆不牢固。对重点知识没有重点记忆,走马观花,以至于混淆。 答题解析 关…

MySQL 进阶 图文详解InnoDB储存引擎

前言 SQL 语句的最终执行者是存储引擎。存储引擎在经解析器、优化器处理后被执行器调用其接口执行优化后的执行计划。MySQL 存储引擎包括 InnoDB、Myisam、Memory、Archive、CSV 存储引擎等,其中最常用也是MySQL 默认的存储引擎是 InnoDB。 写入缓冲池(…

用DIV+CSS技术设计的水果介绍网站(web前端网页制作课作业)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

软件测试面试技巧有哪些?可以从这2个方面去进行准备

面试所有只职场人,通往工作岗位的第一道关卡,也是最重要的一道门槛。而面试中,如何回答HR提出的问题很大程度上决定了面试能不能成功。所以这些软件测试的面试技巧你可不能错过了。 首先是自我介绍 自我介绍的时间不能太短,几十秒…

(附源码)计算机毕业设计JavaJava毕设项目财务管理系统的设计与实现

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

【Flutter】shape 属性 ShapeBorder,形状

文章目录前言一、shape 是什么?二、不同的形状1.BeveledRectangleBorder2.Border3.CircleBorder圆形4.ContinuousRectangleBorder连续圆角5.StadiumBorder 体育场边界 ,药丸形状6.OutlineInputBorder外边框可以定制圆角7.UnderlineInputBorder下划线总结…

Springboot Security 前后端分离模式自由接口最小工作模型

但凡讲解Springboot Security的教程,都是根据其本身的定义,前后端整合在一起,登录采用form或者basic。我们现在的很多项目,前后端分离,form登录已经不适用了。很多程序的架构要求所有的接口都采用application/json方式…

复制集群架构设计技巧

Redis Sentinel设计技巧 Redis Sentinel基本架构 Monitoring Sentinel可以监控Redis节点的状态 Notification Sentinel可以通过API进行集群状态通知 Automatic failover Sentinel实现故障自动切换 Configuration provider Sentinel为client提供发现master节点的发现功能…

Java项目:JSP校园运动会管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含三种角色:运动员、裁判员、管理员; 运动员角色包含以下功能: 运动员登录,个人信息修改,运动成绩…

【优化求解】粒子群算法求解干扰受限无人机辅助网络优化问题【含Matlab源码 230期】

⛄一、粒子群简介 1 粒子群优化算法 粒子群优化算法( PSO)是指通过模拟鸟群觅食的协作行为,实现群体最优化。PSO是一种并行计算的智能算法,其基本模型如下: 假设群体规模为M,在D维空间中,群体中的第i个个体表示为XD ( xm1,xm2…xm D)T,速度表示为VD ( vm1,vm2…vm D)T,位置( …

一个简单的音乐网站设计与实现(HTML+CSS)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

【生成模型】Diffusion Models:概率扩散模型

---前言一、Diffusion Model 基本介绍二、生成模型对比三、直观理解Diffusion model四、形式化解析Diffusion model五、详解 Diffusion Model(数学推导)1.前向过程(扩散过程)2.逆扩散过程3.逆扩散条件概率推导4.训练损失六、训练、测试伪代码1. 训练2.测…

大一学生WEB前端静态网页——旅游网页设计与实现-张家口 6页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作| HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运…

string类(一)

目录 一、 string类对象的常见构造 二、string类对象的容量操作 2.1 size(返回字符串有效字符长度) 2.2 capacity(返回空间总大小) 2.3 reserve扩空间​编辑 2.4 resize初始化不会覆盖本来的空间​编辑 2.5 对于test_string7中每一句代码进行调试运行 三、string类对象的…

如何给PDF解密?建议收藏这些方法

我们在传输接收文件的时候,经常都是以PDF格式进行的,因为PDF格式具有很强的稳定性。那小伙伴们平时接收的时候,会不会发现有些PDF文件为了保密性会进行加密,如果我们经常需要使用它,就需要不断地输入密码,这…

ISCSLP 2022 | NPU-ASLP实验室8篇论文被录用

作为语音处理技术领域的旗舰国际会议,ISCSLP2022(International Symposium on Chinese Spoken Language Processing)将于12月11-14日在新加坡举办。 西工大音频语音与语言处理研究组(ASLPNPU)本届会议将携合作伙伴宣读论文8篇,涉…