分布式框架 - ZooKeeper
一、什么是微服务架构
1、单体架构
顾名思义一个软件系统只部署在一台服务器上。
在高并发场景中,比如电商项目,单台服务器往往难以支撑短时间内的大量请求,聪明的架构师想出了一个办法提高并发量:一台服务器不够就加一台,如果还不够就再加一台。所以衍生出了集群架构。
2、集群架构
当服务器的数量增多以后,需要一个【负载均衡】的功能来协调进来的请求,将请求分发给不同的服务器。
但是当集群中的服务器数量越来越多的时候,维护集群的成本也在攀升,不利于长期发展。
所以聪明的架构师又想到可以把单台web服务器的完整功能拆分成许多小模块,比如订单模块、商品模块,根据不同模块所承担的请求数量决定服务器的数量。
这种方式叫分布式架构。
3、分布式架构
将不同功能模块拆分,灵活部署服务器。但是这样不是很极致,一些类似权限校验的功能还没有剥离出来。
所以聪明的架构师在分布式架构的基础上提取公共系统模块,形成了微服务架构。
4、微服务架构
核心思想就是需要什么功能,就从什么系统中获取。
比如电商系统中客户想要购买一个商品,就得先创建一个订单,但是订单系统不能独立实现发货和配送,这时候就需要调用商品系统和物流系统。出现了系统之间互相调用的情况。
二、为什么要使用ZooKeeper?
前面提到,在微服务架构中出现了系统之间互相调用的情况。
那么如何实现系统之间的相互调用呢?
RPC框架可以帮助我们实现系统之间的调用。
1、RPC框架
RPC框架一般有两个选择:
Spring Cloud Netflix - Ribbon;
Apache - Dubbo;
这里我们先来认识Dubbo

以上是 Dubbo 的工作原理图,从抽象架构上分为两层:服务治理抽象控制面 和 Dubbo 数据面 。
- 服务治理控制面。服务治理控制面不是特指如注册中心类的单个具体组件,而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控策略、Dubbo Admin 控制台等,如果采用了 Service Mesh 架构则还包含 Istio 等服务网格控制面。
- Dubbo 数据面。数据面代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作。
- 服务消费者 (Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
- 服务提供者 (Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程
在上面的例子中,订单系统想要调用商品系统的时候,就需要知道商品系统的 IP+端口。但是商品系统可能是一个集群架构,如果某一个节点掉线或新增一个节点,调用方是无法获取最新消息的,也就是不知道商品系统有哪些节点可用。
这时候就需要使用注册中心统一管理RPC框架中的节点。
2、注册中心
当RPC框架中某一个集群的节点上线或掉线时,就通知注册中心。这样当订单系统需要调用商品服务的时候,就从注册中心获取提供商品服务的 IP+端口。
在Dubbo中,官方推荐使用的注册中心是ZooKeeper。
我们想构建微服务架构,可以借助RPC框架Dubbo来构建,但是Dubbo需要一个注册中心,Dubbo官方推荐的注册中心是ZooKeeper。
三、ZooKeeper介绍
1、概述
是一个分布式程序的协调服务,是Hadoop和Hbase的重要组件。提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
2、ZooKeeper集群机制
ZooKeeper是为其他程序提供服务的,所以其本身不能挂掉。ZooKeeper集群机制采用的是半数存活机制,有一半以上的节点存活才可用,所以在一般情况下集群节点最好是奇数个。
3、ZooKeeper中的角色
Leader - 主节点
唯一能处理事务请求的节点,保证集群事务处理的顺序性。
集群内部各服务的调度者。
Follower - 从节点
处理非事务请求,将接收到的事务请求转发给主节点处理。
参与事务请求Proposal的投票。
参与Leader选举投票。
Observer - 观察者
处理非事务请求,将接收到的事务请求转发给主节点处理。
不参与任何投票。
四、准备ZooKeeper集群环境
1、准备3个节点
准备3个centos 7.0 的虚拟机节点,并且安装配置好 JDK 1.8。
我使用VM Ware创建了1个虚拟机节点,是
192.168.0.1
创建快照后复制两个节点,分别修改ip地址
# 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33
192.168.0.2
192.168.0.3
2、节点关系的映射
每个节点设置相应的ip和主机名的映射关系,方便集群环境的部署。
修改hosts配置文件中的信息。
# 修改 hosts 文件 vim /etc/hosts
192.168.0.1 allwe01
192.168.0.2 allwe02
192.168.0.3 allwe03
3、免密登录配置
关于ZooKeeper集群环境的搭建,可以先在一个节点安装且配置好相关配置文件,然后再分发到其他的节点上,再到各个节点上做一些个性化配置即可。相对于给每一个节点单独安装高效一些。
但是在使用脚本分发这些配置的时候需要登录到其他的节点,这样有些繁琐,所以我们来配置一下免密登录。
① 生成公钥 & 私钥
ssh-keygen
集群服务器的每一个节点都生成自己的公钥 &私钥
② 发送公钥给目标节点
发送公钥给需要免密登录的节点。
ssh-copy-id allwe01
ssh-copy-id allwe02
ssh-copy-id allwe03
③ 创建工作目录
cd /
mkdir allwe01
在每一个节点都创建一个工作目录。
④ 测试向其他节点发送文件功能
先登录 allwe01 服务器,执行下面的命令。
scp -r a.txt allwe02:/allwe02# a.txt 目标文件
# allwe02 目标服务器
# :/allwe02 目标服务器的目标目录
再登录 allwe02 服务器,查看接收的文件。
发送成功!
4、关闭防火墙
# 查看防火墙状态
firewall -cmd --state
我的虚拟机没安装防火墙。
5、安装 JDK
java java -version
五、动手搭建ZooKeeper集群
1、安装ZooKeeper
从官网下载安装包:apache-zookeeper-3.6.4-bin.tar.gz
# 解压文件
tar -zxvf apache-zookeeper-3.6.4-bin.tar.gz
2、修改配置
① 修改zoo_sample.cfg文件名称为 zoo.cfg
# 修改文件名称
mv zoo_sample.cfg zoo.cfg
② 修改配置文件内容
tickTime=2000 # zookeeper内部最小单位时间 - 2000msinitLimit=10 # follower在启动过程中从Leader同步数据的时间syncLimit=5 # 心跳检查间隔时间 - 5sdataDir=/opt/zookeeper/data # zookeeper缓存的数据存储目录clientPort=2181 # 客户端端口号# 集群环境 - 配置相关节点信息
# 2888 - 心跳端口
# 3888 - 数据端口server.1 = allwe01:2888:3888
server.2 = allwe02:2888:3888
server.3 = allwe03:2888:3888
③ 配置myid文件
需要在zookeeper的数据存储目录创建一个myid文件,文件内容仅一行信息,表示当前节点在集群中的标识,范围是1 ~ 255,每个节点的myid数字和在zoo.cfg中配置的数字对应。
3、分发文件
配置好一个ZooKeeper节点后,就可以将这个ZooKeeper文件夹分发给其他节点服务器。分别修改myid文件即可。
scp -r zookeeper allwe02:/opt/scp -r zookeeper allwe03:/opt/
4、启动测试
sh /bin/zkServer.sh start
这里打印启动成功了。但是只启动一个节点会报错,原因是zookeeper采用半数存活机制,我们这里有3个节点,如果只有一个节点启动,报错是正常的,等半数以上的节点启动后就好了。
# 查看执行状态sh zkServer.sh status
可以看到有的是Leader,有的是Follower。
六、ZooKeeper的Leader选举策略
半数存活机制:只有超过半数的节点存活时,集群才可用。我在上面搭建了一个3节点的集群,分别命名为allwe01、allwe02、allwe03。
1、为什么要做Leader选举?
Leader的主要作用是保证分布式数据一致性,也就是分布式事务。Leader节点具有读和写的功能,但是Follower节点和Observer节点只有读的功能。
所以在ZooKeeper中必须有且只有一个Leader节点,一旦掉线,必须选一个新的Leader节点接替工作。
2、面试问题
① 服务器初始化时的选举策略?
集群中的节点在挨个启动时,当allwe02启动后,集群可用,这时如何确定哪个是Leader?
请看VCR,每个节点都投票,将票发送给其他节点,且接收其他节点的票。选出自己认为最新的节点并且投票给它,一旦超过半数票指向同一个节点,选举成功。
等allwe03启动时,已经存在Leader节点了,所以不用选举,直接成为Follower就行了。
② 集群运行期间Leader掉线后的选举策略?
集群成功启动后,当Leader节点掉线了,剩下两个节点如何确定哪个为Leader?
ZooKeeper运行期间,如果有Leader掉线,此时集群停止对外服务,开始在内部选举新的Leader。
1)变更状态。不是观察者的节点都将自己的状态修改为Looking,开始进入Leader选举。
2)和上面画的流程图一样,事务id越大的节点优先级越高。如果事务id一样就比较myid,myid越大的优先级越高。
3)选出Leader节点后集群恢复对外服务。
七、ZooKeeper的使用
1、配置ZooKeeper的环境变量
为了简化每次操作ZooKeeper,而不用进入ZooKeeper的安装目录。将ZooKeeper的bin目录配置到环境变量中。
这样可以在服务器上的任意目录使用ZooKeeper啦!
2、连接客户端
通过 /bin 目录下的 zkCli.sh 连接。
# 默认连接本机zookeeper
sh zkCli.sh # 连接其他节点
sh zkCli.sh -timeout 5000 -server allwe02:2181
连接上客户端就可以使用ZooKeeper操作数据了。
3、ZooKeeper的数据结构
ZooKeeper内部是文件目录结构,根目录是【/】,可以在根目录下创建新的目录,以此来保存数据。
4、ZooKeeper的常用命令
ZooKeeper作为Dubbo的注册中心用来保存我们各个服务的节点信息,说明ZooKeeper是支持保存数据和查询操作的。
命令 | 作用 |
---|---|
create [-s] [-e] [-c] [-t ttl] path [data] [acl] | 创建持久化节点(目录) |
-s:创建持久化节点,自动生成节点名 | |
-e:创建临时节点,客户端退出时临时节点被删除 | |
ls [-s] [-w] [-R] path | 查询某个节点下的节点信息和属性信息(加上 -s) |
get [-s] [-w] path | 查询某个节点下的数据信息和属性信息(加上 -s) |
set [-s] [-v version] path data | 给某个节点设置数据 |
delete [-v version] path | 删除没有子节点的节点 使用deleteall删除有子节点的节点 |
5、属性信息解析
属性 | 含义 |
---|---|
cZxid | 创建事务id |
ctime | 创建时间 |
mZxid | 修改事务id |
mtime | 修改时间 |
pZxid | 上级节点事务id |
cversion | 创建版本号 |
dataVersion | 数据版本号 |
aclVersion | 权限版本号 |
ephemeralOwner | 临时拥有者 0x0表示没有 |
dataLength | 数据长度 |
numChildren | 子节点个数 |
6、节点的分类
代码 | 含义 |
---|---|
PERSISTENT | 持久化节点 |
PERSISTENT_SEQUENTIAL | 持久化有序节点 |
EPHEMERAL | 临时节点 |
EPHEMERAL_SEQUENTIAL | 临时有序节点 |
1)临时节点下不允许创建任何节点。
7、ZooKeeper的事件监听
1)监听数据的改变
# 获取app1的数据,且开启对app1的监听
get -w /app1
使用allwe01客户端开启监听某个节点的数据内容变化。
但是只能触发一次监听,如果想要实现持续监听,那么需要在下次读取数据时再次使用监听命令。
allwe02客户端修改/app1节点的数据:
allwe01接收到监听动态:
2)监听子节点的改变
# 开启监听 /app1 的子节点变化
ls -w /app1
在allwe01的客户端节点开启对 /app1 的子节点的监听。
但是只能触发一次监听,如果想要实现持续监听,那么需要在下次读取节点信息时再次使用监听命令。
在allwe02的客户端修改 /app1 的子节点。
allwe01的客户端收到监听。
8、关于注册中心的使用思路
八、Java API操作ZooKeeper
package zookeeper;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.util.List;/*** zookeeper连接客户端** @Author: AllWe* @Date: 2024/09/19/19:25*/
public class Test01 {/*** 客户端地址*/private static String ip = "192.168.0.1:2181, 192.168.0.2:2181, 192.168.0.3:2181";/*** 连接超时时间*/private static int outTime = 50000;/*** zookeeper连接对象*/private static ZooKeeper zooKeeper = null;/*** 创建连接*/static {try {zooKeeper = new ZooKeeper(ip, outTime, new Watcher());System.out.println("创建连接成功!连接信息:" + zooKeeper);} catch (IOException e) {throw new RuntimeException(e);}}/*** 连接zookeeper客户端 - 测试增删改查*/@Testpublic void crud() throws Exception {// 删除目标节点zooKeeper.delete("/app1/app1.4", -1);// 判断目标节点是否存在Stat exists = zooKeeper.exists("/app1/app1.4", true);if (exists != null) {System.out.println("节点存在");} else {System.out.println("节点不存在");// 创建节点String s = zooKeeper.create("/app1/app1.4", "hello world".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(s);// 修改节点数据zooKeeper.setData("/app1/app1.4", "lalala".getBytes(), -1);}System.out.println("======================================");// 获取目标节点的子节点List<String> children = zooKeeper.getChildren("/app1", true);System.out.println(children);for (String child : children) {// 查询节点的数据byte[] data = zooKeeper.getData("/app1/" + child, false, null);if (data != null) {System.out.println(new String(data));}}}/*** 连接zookeeper客户端 - 测试子节点监听*/@Testpublic void nodeChildrenChange() throws Exception {List<String> children = zooKeeper.getChildren("/app1", new Watcher());System.out.println("children:" + children);Thread.sleep(Integer.MAX_VALUE);}/*** 连接zookeeper客户端 - 测试节点数据监听*/@Testpublic void nodeDataChange() throws Exception {byte[] data = zooKeeper.getData("/app1", new Watcher(), null);if (data != null)System.out.println("----->" + new String(data));Thread.sleep(Integer.MAX_VALUE);}
}
package zookeeper;import org.apache.zookeeper.WatchedEvent;/*** zookeeper 监听器** @Author: AllWe* @Date: 2024/09/19/19:29*/
public class Watcher implements org.apache.zookeeper.Watcher {/*** 触发监听器回调方法* @param watchedEvent*/@Overridepublic void process(WatchedEvent watchedEvent) {System.out.println("触发了监听器回调方法");System.out.println("watchedEvent.type:" + watchedEvent.getType());}
}
相关文章:

分布式框架 - ZooKeeper
一、什么是微服务架构 1、单体架构 顾名思义一个软件系统只部署在一台服务器上。 在高并发场景中,比如电商项目,单台服务器往往难以支撑短时间内的大量请求,聪明的架构师想出了一个办法提高并发量:一台服务器不够就加一台&am…...
8月份,AI图像生成领域web端产品排行榜及产品是做什么的
看全球用户量级别的Top12(WEB)。 排名 产品名 分类 8月访问量 上月对比 1 Canva AI Design Tool 711.9M 6.48% 2 Remove.bg AI Image Editor 72.79M 2.84% 3 Fotor AI Image Editor 15.62M 2.34% 4 Civitai Model Training & …...
Sqlite_Datetime列选择三月的行
In SQLite, use the strftime function to extract components from a date/time value SELECT * FROM table WHERE strftime(%m, datemonth) 03;strftime(‘%m’, datemonth): extracts the month part from the datemonth column as a string (with leading zeros for sing…...

spring里面内置的非常实用的工具
一 、请求数据记录 Spring Boot提供了一个内置的日志记录解决方案,通过 AbstractRequestLoggingFilter 可以记录请求的详细信息。 AbstractRequestLoggingFilter 有两个不同的实现类,我们常用的是 CommonsRequestLoggingFilter。 通过 CommonsRequestL…...

计算机毕业设计 基于Python内蒙古旅游景点数据分析系统 Django+Vue 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

centos7 docker部署nacos
1. 一行代码安装git yum -y install git 2. 下载最新版nacos源码: git clone https://github.com/nacos-group/nacos-docker.git 进入nacos-docker文件 cd nacos-docker 3.docker安装数据库Mysql8 按这个来就行,非常好 Docker安装mysql8-超详细、每…...

短视频矩阵源码/短视频矩阵系统搭建/源码开发知识分享
集星云推智剪获客系统,通过自主研发的高效发布模式,为企业提供稳定的接口与自动化操作,助力企业实现短视频矩阵的构建。该系统整合了十大核心功能,包括AI辅助文案撰写、视频剪辑、智能去重、内容拆分、文字转语音、文本提取、批量…...

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程
🤹♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持…...

论文 | Reframing Instructional Prompts to GPTk’s Language
作者:Swaroop Mishra, Daniel Khashabi, Chitta Baral, Yejin Choi, Hannaneh Hajishirzi 论文摘要:语言模型 (LM) 更容易遵循哪些类型的指令提示? 我们通过进行广泛的实证分析来研究这个问题,这些分析阐明了成功指令提示的重要特…...
C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验2】
前序工作 C Qt / VS2019 opencv onnxruntime 部署语义分割模型【经验】 引言 前序工作中介绍了Pytorch模型如何转为ONNX格式,以及在Python中如何使用onnx模型 介绍了如何在VA或QT中配置Onnxruntime运行库 本文重点列出全部源代码及其使用 依赖库 onnxruntime…...
代码随想录算法训练营Day9
232.用栈实现队列 Collection——List——Vector类——Stack类 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackInnew Stack();stackOutnew Stack();} public void push(int x) {stackIn.push(x);}public int pop() {no…...
2025秋招NLP算法面试真题(二十)-有监督微调基本概念
1.基本概念 1.微调方法是啥?如何微调? 微调(Fine-tuning)是一种迁移学习的方法,用于在一个预训练模型的基础上,通过在特定任务的数据上进行有监督训练,来适应该任务的要求并提高模型性能。微调利用了预训练模型在大规模通用数据上学习到的语言知识和表示能力,将其迁移…...

使用宝塔部署项目在win上
项目部署 注意: 前后端部署项目,需要两个域名(二级域名,就是主域名结尾的域名,需要在主域名下添加就可以了),前端一个,后端一个 思路:访问域名就会浏览器会加载前端的代…...

[大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作
Generation of Complex 3D Human Motion by Temporal and Spatial Composition of Diffusion Models L Mandelli, S Berretti - arXiv preprint arXiv:2409.11920, 2024 通过时间和空间组合扩散模型生成复杂的3D人物动作 摘要 本文提出了一种新的方法࿰…...
vue 引入 esri-loader 并加载地图
记录一下: npm i esri-loader 引入css 在app.vue中 <style> import url(https://js.arcgis.com/4.6/esri/css/main.css); </style> 新建js文件 在js文件中引入esri-loader 并加载其init.js文件 加载init.js 需要其中的loadScript 部分如下&…...

LobeChat:使用服务端数据库部署 - Docker+NextAuth(github)+腾讯云
总流程 Docker部署 身份验证服务-NextAuth github S3存储服务 腾讯云COS 1. 安装Docker brew install docker --cask2. 创建pgvector容器(PostgresSQL) docker run --name [myPgvector] -p 5432:5432 -e POSTGRES_PASSWORD[pwd] -d -e POSTGRES_USER[username] pgvector/…...

长列表加载性能优化
一、长列表优化概述 列表是应用开发中最常见的一类开发场景,它可以将杂乱的信息整理成有规律、易于理解和操作的形式,便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新闻列表、购物车列表、各类排行榜等。随着信息数据的累积,特…...
Vue ElemetUI table的行实现按住上下键高亮上下移动效果
1、添加初始化的方法 // 添加键盘事件监听器: mounted() {window.addEventListener(keydown, this.handleKeydown);}, // 这段代码的作用是在 Vue 组件销毁之前移除一个键盘事件监听器 // 这样做可以确保当组件不再使用时,不会留下任何未清理的事件监听…...
windows C++-指定特定的计划程序策略
通过计划程序策略,可控制计划程序在管理任务时使用的策略。 本文演示如何使用计划程序策略来增加将进度指示器打印到控制台的任务的线程优先级。 示例 以下示例并行执行两个任务。 第一个任务计算第 n 个斐波那契数。 第二个任务将进度指示器打印到控制台。 第一…...

python脚本程序怎么写更优雅?argparse模块巧妙应用
前言 命令行程序,也称CLI程序,另一个直观的名字是脚本程序,简称脚本,由于没有图形用户界面(GUI),所以脚本程序常见的交互方式有3种: 1、脚本程序中读取环境变量,比如env…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...