ZooKeeper 和 Dubbo 的关系:技术体系与实际应用
引言
在现代微服务架构中,服务治理和协调是至关重要的环节。ZooKeeper 和 Dubbo 是两个在分布式系统中常用的技术工具,它们之间有着紧密的联系。本文将详细探讨 ZooKeeper 和 Dubbo 的关系,从基础概念、技术架构、具体实现到实际应用场景,逐步剖析它们如何共同作用于分布式系统的服务治理。随着微服务的普及,理解这两个技术如何协同工作不仅能提升系统的可维护性和可扩展性,还能大幅提高系统的响应速度和稳定性。
1. 什么是 ZooKeeper?
ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会开发。它的设计目标是提供一个简单、高性能、高可用的服务用于解决分布式系统中常见的协调问题。ZooKeeper 的主要功能包括:
-
配置管理:通过提供一个集中式的配置存储,ZooKeeper 允许配置信息在系统中所有节点之间同步更新,避免了配置的分散管理导致的混乱。
-
命名服务:在分布式环境中,为各种资源(如服务器、服务实例等)提供唯一的标识,简化了资源的发现和管理。
-
分布式同步:使用锁和队列机制,ZooKeeper 能够确保在多节点环境中对资源的互斥访问,防止数据竞争。
-
组服务:通过监控节点的状态,ZooKeeper 可以进行节点加入或退出集群的管理,支持负载均衡、主从选举等功能。
ZooKeeper 的数据模型和 API
ZooKeeper 使用树状结构来组织数据,每个节点称为 znode,可以存储数据。znodes 分为持久节点和临时节点,持久节点会在 ZooKeeper 重启后依然存在,而临时节点则会随着客户端会话的结束被删除。理解 znodes 的类型及其生命周期对于正确使用 ZooKeeper 至关重要:
- 持久节点:用于存储需要长期保留的数据,如配置信息。
- 临时节点:适合短期任务,如锁或会话管理。
- 顺序节点:在节点名称后自动附加一个递增的编号,常用于实现分布式队列或生成唯一标识。
ZooKeeper 提供了丰富的 API 以操作这些 znodes:
create
:创建 znode,并可以指定节点类型。delete
:删除 znode,需考虑节点是否有子节点。exists
:检查 znode 是否存在,并可以注册 Watcher 监听其变化。getData
/setData
:读取或更新 znode 上的数据。getChildren
:获取 znode 的子节点列表,同样可以监听子节点的变化。
2. 什么是 Dubbo?
Dubbo 是一个高性能的 Java RPC 框架,由阿里巴巴开源,主要用于提供分布式服务的调用和治理。Dubbo 的核心功能包括:
-
远程服务调用:通过 Dubbo,开发人员可以像调用本地方法一样调用远程方法,简化了服务间通信的复杂性。
-
负载均衡:Dubbo 支持多种负载均衡策略(如轮询、最少活跃连接、一致性哈希),以便在多服务提供者中高效分配请求。
-
服务注册与发现:通过注册中心,Dubbo 让服务提供者和消费者动态感知彼此的存在,实现了服务的自动化管理。
-
容错机制:提供了失败重试、失败转移等策略,确保服务调用的可靠性,即使部分服务提供者失效也能维持系统的可用性。
Dubbo 的架构
Dubbo 的架构设计包括几个关键组件:
- Provider:负责提供实际的服务实现,启动时会将服务注册到注册中心。
- Consumer:调用远程服务,启动时会从注册中心获取服务提供者的地址信息。
- Registry:作为注册中心,管理服务的注册和发现,常用 ZooKeeper 作为实现。
- Monitor:用于监控服务调用频率和性能等统计信息,帮助运维和优化服务。
3. ZooKeeper 和 Dubbo 的关系
ZooKeeper 在 Dubbo 中主要作为 注册中心(Registry) 来使用,负责管理服务的注册和发现。以下是它们的关系和交互方式:
-
服务注册:服务提供者启动时,会将自己的服务信息(包括服务名称、IP、端口等)注册到 ZooKeeper。这种注册是动态的,当服务提供者发生变化时(如节点上线或下线),ZooKeeper 会及时更新。
-
服务发现:服务消费者启动时,会向 ZooKeeper 查询可用的服务提供者列表,通过这些信息建立与服务提供者的连接,实现服务调用。Dubbo 通过 ZooKeeper 获取服务列表,支持服务的动态发现。
-
服务动态感知:利用 ZooKeeper 的 Watcher 机制,服务消费者可以实时接收到服务提供者状态的变化,实现无缝的服务切换。例如,某个服务提供者宕机,消费者可以迅速切换到其他健康节点。
如何在 Dubbo 中使用 ZooKeeper
在 Dubbo 配置中,注册中心可以是 ZooKeeper,通过简单的配置即可实现:
<!-- dubbo 配置文件示例 -->
<dubbo:application name="dubbo-provider" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.example.DemoService" ref="demoService" />
在这个配置中:
<dubbo:application>
定义应用名称,用于识别不同的服务。<dubbo:registry>
指定 ZooKeeper 作为注册中心,提供连接地址。可以通过多个 ZooKeeper 节点来提高可用性。<dubbo:protocol>
定义服务通信协议和端口。<dubbo:service>
定义要暴露的服务接口,ref
指向具体的实现。
4. 实现细节:服务注册与发现
让我们通过一个简单的示例来看如何在实际项目中使用 ZooKeeper 和 Dubbo:
服务提供者(Provider)
假设我们有一个简单的服务接口和实现:
// 定义服务接口
public interface DemoService {String sayHello(String name);
}// 实现服务接口
@Service
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}
}// Spring 配置
@Configuration
@EnableDubbo(scanBasePackages = "com.example.provider")
public class ProviderConfig {@Beanpublic RegistryConfig registryConfig() {RegistryConfig registryConfig = new RegistryConfig();registryConfig.setProtocol("zookeeper");registryConfig.setAddress("zookeeper://127.0.0.1:2181");return registryConfig;}@Beanpublic ApplicationConfig applicationConfig() {ApplicationConfig applicationConfig = new ApplicationConfig();applicationConfig.setName("dubbo-provider");return applicationConfig;}@Beanpublic ProtocolConfig protocolConfig() {ProtocolConfig protocolConfig = new ProtocolConfig();protocolConfig.setName("dubbo");protocolConfig.setPort(20880);return protocolConfig;}
}
服务消费者(Consumer)
服务消费者需要知道如何调用这个服务:
// 定义消费者配置
@Configuration
@EnableDubbo(scanBasePackages = "com.example.consumer")
public class ConsumerConfig {@Beanpublic RegistryConfig registryConfig() {RegistryConfig registryConfig = new RegistryConfig();registryConfig.setProtocol("zookeeper");registryConfig.setAddress("zookeeper://127.0.0.1:2181");return registryConfig;}@Beanpublic ApplicationConfig applicationConfig() {ApplicationConfig applicationConfig = new ApplicationConfig();applicationConfig.setName("dubbo-consumer");return applicationConfig;}@Beanpublic ReferenceConfig<DemoService> demoService() {ReferenceConfig<DemoService> reference = new ReferenceConfig<>();reference.setInterface(DemoService.class);return reference;}
}// 使用服务
@Component
public class DemoConsumer {@Referenceprivate DemoService demoService;public void doSomething() {String result = demoService.sayHello("World");System.out.println(result); // 输出 "Hello, World"}
}
在这些示例中,@EnableDubbo
注解启用了 Dubbo,@Service
和 @Reference
注解用于标记服务的提供和引用。通过 ZooKeeper,服务提供者会将自己注册到 ZooKeeper,服务消费者可以从中获取服务信息。
5. 负载均衡与容错
ZooKeeper 在 Dubbo 中不仅仅是注册中心,它还支持以下功能:
-
负载均衡:当有多个服务提供者时,Dubbo 可以根据配置的负载均衡策略(如轮询、随机、最少活跃请求等)选择合适的服务实例。负载均衡策略可以根据服务的实际调用情况和性能调整。
-
容错机制:如果一个服务实例不可用,Dubbo 可以通过 ZooKeeper 获取其他可用的实例,执行重试或失败转移策略,确保服务调用的成功率。Dubbo 的容错策略包括:
- Failover Cluster:失败自动切换到其他服务器。
- Failfast Cluster:快速失败,立即抛出异常。
- Failsafe Cluster:失败安全,忽略异常,直接返回。
- Failback Cluster:失败后记录请求,定时重发。
<dubbo:reference id="demoService" interface="com.example.DemoService" loadbalance="roundrobin" />
在这个配置中,loadbalance="roundrobin"
指定了轮询的负载均衡策略。
6. ZooKeeper 的 Watcher 机制在 Dubbo 中的应用
Dubbo 利用 ZooKeeper 的 Watcher 机制来实现服务的动态感知:
-
当服务节点发生变化时(例如,服务提供者上线或下线),ZooKeeper 会通知所有注册了 Watcher 的客户端。通过这种机制,服务消费者可以动态调整自己的服务列表。
-
服务消费者可以根据这些通知更新自己的服务列表,实现无缝的服务切换,确保在服务提供者发生故障时,消费者依然能够访问服务。
7. 实际应用场景
-
微服务架构:使用 Dubbo 构建微服务,利用 ZooKeeper 进行服务注册和发现,简化了服务之间的通信和管理。通过 Dubbo 和 ZooKeeper 的结合,微服务可以实现高效的服务治理,支持弹性伸缩。
-
分布式锁:通过 ZooKeeper 的临时节点,Dubbo 可以实现分布式锁功能,确保在分布式环境中资源访问的互斥性。这对于资源竞争的场景(如数据库更新)非常重要。
-
配置管理:利用 ZooKeeper 动态更新服务配置,Dubbo 可以实时获取最新的配置信息,避免了配置文件分散在各节点导致的不一致性。这对于频繁变更配置的环境非常有用。
-
集群管理:在 Dubbo 中,ZooKeeper 可以用于管理服务节点的加入和退出,进行主节点选举,确保集群的高可用性和稳定性。
结论
ZooKeeper 和 Dubbo 的结合是分布式系统中服务治理的典范。ZooKeeper 提供了稳定、可靠的协调服务,而 Dubbo 利用这些特性实现了高效的服务注册、发现、负载均衡和容错机制。通过深入理解它们的技术架构和实际应用,可以更好地设计和实现分布式系统中的服务治理方案,提升系统的可用性和性能。对于任何涉及微服务或分布式架构的项目,掌握这两者的使用方法都是至关重要的。
相关文章:
ZooKeeper 和 Dubbo 的关系:技术体系与实际应用
引言 在现代微服务架构中,服务治理和协调是至关重要的环节。ZooKeeper 和 Dubbo 是两个在分布式系统中常用的技术工具,它们之间有着紧密的联系。本文将详细探讨 ZooKeeper 和 Dubbo 的关系,从基础概念、技术架构、具体实现到实际应用场景&am…...
ESP32-S3模组上跑通esp32-camera(43)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(42) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException
解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 目录 解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 问题描述解决步骤解决方案结论附:MySql常用配置参数及使用场景 在使用Spring Boot连接MySQL数据库时,有时候会遇到“B…...
NCV4275CDT50RKG 车规级LDO线性电压调节器芯片——专为新能源汽车设计的高可靠性电源解决方案
产品概述: NCV4275CDT50RKG 是一款符合 AEC-Q100 车规认证的高性能LDO(低压差线性稳压器),专为新能源汽车的严苛工作环境设计。该芯片支持 输出调节为 5.0 V 或 3.3 V,最大输出电流达 450mA,具备超低静态电流…...
DeepSeek Window本地私有化部署
前言 最近大火的国产AI大模型Deepseek大家应该都不陌生。除了在手机上安装APP或通过官网在线体验,其实我们完全可以在Windows电脑上进行本地部署,从而带来更加便捷的使用体验。 之前也提到过,本地部署AI模型有很多好处,比如&…...
镜头放大倍率和像素之间的关系
相互独立的特性 镜头放大倍率:主要取决于镜头的光学设计和结构,决定了镜头对物体成像时的缩放程度,与镜头的焦距等因素密切相关。比如,微距镜头具有较高的放大倍率,能将微小物体如昆虫、花朵细节等放大成像࿰…...
【RabbitMQ重试】重试三次转入死信队列
以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案: 方案设计要点 队列定义改造(核心参数配置) Bean public Queue auditQueue() {Map<String, Object> args new HashMap<>();args.put("x-dead-letter-exchan…...
【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用
卫星轨道的六根数参数及其在终端距离、相对速度和多普勒频移计算中的应用 卫星轨道运动的描述离不开开普勒六要素(也称为六根数参数),它们完整地刻画了一颗卫星在引力场中的轨道信息。本文将介绍这六个参数的意义,并探讨如何利用…...
车载诊断框架 --- 使用CAPL脚本实现诊断测试吧(中)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
Lockdir加密忘记密码:解锁数据恢复之道
Lockdir加密忘记密码现象解析 Lockdir作为一款知名的文件夹加密软件,因其强大的加密功能和便捷的操作体验而广受用户好评。然而,当谈及Lockdir加密忘记密码这一情况时,不少用户却面露难色。Lockdir加密忘记密码,简而言之…...
SQL优化方式
避免select *:开发中禁止使用select * 。它会增加查询解析器成本,无法走索引覆盖而产生回表操作,还会增加网络消耗,浪费CPU和内存资源,应指定具体查询字段。小表驱动大表:关联查询时,用数据量小…...
java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于推荐算法的…...
java中的线程安全
线程安全的定义 线程安全:一个类或方法在多线程环境下可以被多个线程同时访问,而不会导致数据的不一致或错误。 线程不安全:一个类或方法在多线程环境下不能被多个线程同时访问,否则可能导致数据的不一致或错误。线程安全的实现 线…...
day44 QT核心机制
头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …...
字节跳动后端一面
📍1. Gzip压缩技术详解 Gzip是一种流行的无损数据压缩格式,它使用DEFLATE算法来减少文件大小,广泛应用于网络传输和文件存储中以提高效率。 🚀 使用场景: • 网站优化:通过压缩HTML、CSS、JavaScript文件来…...
WebSocket推送数据快,条数多导致前端卡顿问题解决
WebSocket推送数据快,条数多导致前端卡顿问题解决 前言方案优化消息频率使用高效的数据格式Protobuf 和 MessagePack的对比 启用压缩前端性能优化 WebSocket使用注意事项连接管理处理断开连接负载均衡监控和维护日志记录定期维护安全最佳实践限流 最后 前言 在项目…...
android动态设置是否允许应用卸载
摘要:通过广播设置全局参数控制应用是否允许卸载,全局参数在Launcher和PackageInstaller两个模块中使用到。此功能可用于MDM后台控制是否允许设备卸载应用。 1. 静态注册广播 由于系统安装和卸载的功能集中在PackageInstaller模块中,为了更…...
【C/C++】每日温度 [ 栈的应用 ] 蓝桥杯/ACM备赛
数据结构考点:栈 题目描述: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高࿰…...
开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程
----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞👍 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…...
基于SpringBoot+Vue实现航空票务管理系统
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
基于改进型灰狼优化算法(GWO)的无人机路径规划
内容: 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法,模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性,比如容易陷入局部最优,收敛速度慢等,所以改进型的GWO可能通过不同的策略来优化这些…...
高级记事本 Sublime Text 下载与使用教程:附百度网盘地址
一、引言 在编程和文本编辑领域,Sublime Text 被誉为一款功能强大的高级记事本。它以其轻量级、高效、多语言支持等特点,深受开发者和文本工作者的喜爱。本文将详细介绍 Sublime Text 的下载方法、安装步骤、使用技巧,并提供百度网盘下载地址…...
4G核心网的演变与创新:从传统到虚拟化的跨越
4G核心网 随着移动通信技术的不断发展,4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性,也为未来的5G、物联网(LOT)和边缘计算等技术的发展奠定了基础。…...
Jmeter快速实操入门
以下操作需要提前安装了JDK(JDK版本要Java8),并且配置了环境变量。 1、下载Jmeter,下载连接。选择zip版本,解压即可。 2、解压后的文件目录如下。 3、进入bin文件夹,双击ApacheJMeter,运行Jmeter。 4、在测…...
JavaScript中的防抖与节流:提升性能的关键技巧 (1)
文章目录 JavaScript 中的防抖与节流:提升性能的关键技巧一、防抖(Debounce)1.1 概念1.2 应用场景1.3 代码实现 二、节流(Throttle)2.1 概念2.2 应用场景2.3 代码实现2.3.1 时间戳方式2.3.2 定时器方式 三、防抖与节流…...
Java数据类型转换(自动转换和强制转换)
数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。 自动数据…...
【大数据技术】Spark分布式实现词频统计(hadoop+python+spark)
Spark分布式实现词频统计(hadooppythonspark) 搭建完全分布式高可用大数据集群(VMwareCentOSFinalShell) 搭建完全分布式高可用大数据集群(HadoopMapReduceYarn) 本机PyCharm远程连接CentOS虚拟机&#x…...
UMLS初探
什么是UMLS UMLS(Unified Medical Language System,统一医学语言系统),简单来说就是将不同的医学标准统一到一套体系的系统,主要为了医疗系统的统一而构建出的。 UMLS的主要组成部分 Metathesaurus:一个…...
Redis持久化机制详解
为什么需要持久化 Redis通常被作为缓存使用,但是Redis一旦宕机,内存中的数据全部丢失,可能会导致数据库崩溃。如果是从数据库中恢复这些数据就会存在频繁访问数据库和读取速度慢的问题。所以redis实现数据的持久化,是至关重要的。…...
Python 鼠标轨迹 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PB-DW-数据窗口-降级-从12.5降级到9.0
PB 数据窗口从125降级到90 供参考,有哪些属性仍然需要删除,请在评论区留言。谢谢。 如果您有更好的工具,能分享给我一份的话,就更好了,感谢。 12.5数据窗口降级9.01- release 12.5; 更改为 release 9;2- 第二行的 d…...
Logo语言的测试开发
Logo语言的测试开发 引言 随着编程教育的不断发展,学习编程的门槛逐渐降低,各种编程语言应运而生。其中,Logo语言作为一种经典的教育编程语言,在培养儿童的逻辑思维和解决问题的能力方面,发挥了重要的作用。本文将深…...
位图的深入解析:从数据结构到图像处理与C++实现
在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap)是一种用于表示图像的数据结构&…...
Faveo Helpdesk存在目录遍历漏洞(CVE-2024-37700)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
【Pytorch函数】PyTorch随机数生成全解析 | torch.rand()家族函数使用指南
🌟 PyTorch随机数生成全解析 | torch.rand()家族函数使用指南 🌟 📌 一、核心函数参数详解 PyTorch提供多种随机数生成函数(注意:无直接torch.random()函数),以下是常用函数及参数:…...
ML.NET库学习004:ML.NET基础知识复盘
文章目录 ML.NET库学习004:ML.NET基础知识复盘背景简单的 ML.NET 应用程序代码工作流机器学习模型基础进阶 ML.NET 架构构建管道训练模型使用模型 数据模型和架构模型部署 ML.NET库学习004:ML.NET基础知识复盘 学了几个小项目,发现好多方法莫…...
2. UVM的基本概念和架构
文章目录 前言1. UVM的基本概念1.1 UVM的核心组件1.2 UVM的基本架构1.3 UVM的工作流程 2. UVM的架构2.1 UVM的层次结构2.2 UVM的组件交互 3. 总结 前言 首先,得确定UVM的基本概念和架构包含哪些关键部分。我回忆起UVM的核心组件,比如uvm_component、uvm…...
算法10--哈希
哈希 原理经典例题[1. 两数之和](https://leetcode.cn/problems/two-sum/description/)[面试题 01.02. 判定是否互为字符重排](https://leetcode.cn/problems/check-permutation-lcci/description/)[217. 存在重复元素](https://editor.csdn.net/md?not_checkout1&spm1015…...
磁盘文件删除后恢复
磁盘文件删除后,文件数据并未立即消失,只是文件系统的指针被移除,标记该空间为可覆盖。要恢复文件,可以尝试以下方法: 1. 使用数据恢复软件 Recuva:适合Windows,能恢复多种文件类型。PhotoRec…...
STM32 CUBE Can调试
STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...
【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行
1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。 其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …...
Goland 内存逃逸问题
内存逃逸是什么? 在go语言中,内存分配存在两个方式:堆分配;栈分配。 栈分配:是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。 堆分配:通过 new 或者 make 函…...
我们来学人工智能 -- 本地部署DeepSeek
本地部署DeepSeek 题记思考正题结语 题记 时不待我AI会淘汰各领域一些岗位AI可以精简部门,DP白菜价的落地,2025年会更加明显会AI的淘汰不会AI的第四次工业革命将在中国爆发 全产业链多年数字化建设以DP为代表的全球领先白菜价人工智能在各行各业的普及 …...
【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )
文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...
通过脚本实现自动将标签内容复制到下一个标签文件中
只需要将下面内容运行前 修改文件夹路径(控制修改范围的文件名 不需要的话 就随便写一个不相同的文件名 就行 需要的话就是在这个文件名字之前的会被修改) import os import time # 文件夹路径 image_directory r"C:\Users\Lenovo\Desktop\新建文件夹\images" # 替…...
Elasticsearch+Kibana安装启动与操作教程
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。本文将为您详细介绍在 Windows 和 Mac 系统上安装、启动 Elasticsearch 和 Kibana 的步骤,以及常用命令和 Ki…...
CSS Overflow 属性详解:控制内容溢出的利器
在前端开发中,处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性,帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性? overflow 属性用于控制当元素的内容…...
什么是XMLHttpRequest?及其详细使用说明
XMLHttpRequest(通常缩写为XHR)是一个JavaScript对象,用于在浏览器和服务器之间进行异步通信。它允许网页在不重新加载整个页面的情况下,向服务器发送请求并接收响应。XHR是Ajax(Asynchronous JavaScript and XML&…...
Chrome浏览器原理及优化
1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...
Vue 3 + Vite + JS 项目中实现组件全局自动化注册的魔法,极致组件自动化注册方案,开发效率飙升300%。
在Vue项目开发中,你是否还在为重复的组件注册代码而烦恼?是否经历过在大型项目中手动维护数百个组件注册的痛苦?本文将揭秘一种革命性的组件自动化注册方案,结合Vite的黑魔法和Vue3的最新特性,让你的开发效率实现质的飞…...