ZooKeeper 的典型应用场景:从概念到实践
引言
在分布式系统的生态中,ZooKeeper 作为一个协调服务框架,扮演着至关重要的角色。它的设计目的是提供一个简单高效的解决方案来处理分布式系统中常见的协调问题。本文将详细探讨 ZooKeeper 的典型应用场景,包括但不限于配置管理、命名服务、分布式锁、主从节点选举、集群管理以及分布式队列。通过结合实际代码示例,我们将深入分析这些场景如何利用 ZooKeeper 的特性来提高系统的可靠性、一致性和可扩展性。
1. 配置管理
配置管理 是 ZooKeeper 最常见的应用之一。它提供了一个集中式的配置信息存储库,确保所有应用程序实例能够即时获取到最新的配置信息。
场景描述:
- 在分布式环境中,配置信息往往需要跨多个节点进行同步。直接在每个节点上维护配置会导致管理复杂和配置不一致。
- ZooKeeper 通过提供一个中央存储点,应用程序可以从中读取配置,并在配置变化时收到通知。
实现方式:
- 配置节点:配置信息存储在 ZooKeeper 的节点(znode)中,这些节点通常是持久节点。
- Watcher 机制:客户端可以注册 Watcher 来监听配置节点的变化,当配置更新时,ZooKeeper 会通知所有注册了 Watcher 的客户端。
代码示例:
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;public class ConfigWatcher implements Watcher {private static final String CONFIG_PATH = "/app/config";public void process(WatchedEvent event) {if (event.getType() == Event.EventType.NodeDataChanged) {try {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, this);byte[] data = zk.getData(CONFIG_PATH, this, null);String config = new String(data);System.out.println("配置更新为: " + config);} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, new ConfigWatcher());byte[] data = zk.getData(CONFIG_PATH, true, null);System.out.println("当前配置: " + new String(data));// 保持连接以等待配置更新Thread.sleep(Long.MAX_VALUE);} catch (Exception e) {e.printStackTrace();}}
}
在这个示例中,客户端会在配置节点发生变化时被通知,并重新获取配置信息。
2. 命名服务
命名服务 为分布式系统中的资源提供唯一、可识别的命名,类似于 DNS 服务在互联网中的角色。
场景描述:
- 在大型分布式系统中,服务和资源需要可靠的命名机制,以便其他部分可以查找和引用它们。
- ZooKeeper 可以用作一个分布式命名服务,提供全局唯一的标识。
实现方式:
- Znode 作为命名空间:利用 ZooKeeper 的层次化命名空间来组织和查找资源。
- 顺序节点:可以使用顺序节点为资源生成唯一ID。
代码示例:
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;public class NamingServiceExample {private static final String BASE_PATH = "/services";public static void main(String[] args) throws Exception {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);// 注册一个服务String servicePath = zk.create(BASE_PATH + "/myService-", "serviceInfo".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println("服务注册路径: " + servicePath);// 查找服务List<String> children = zk.getChildren(BASE_PATH, false);for (String child : children) {System.out.println("找到服务: " + child);}zk.close();}
}
这个例子展示了如何在 ZooKeeper 中注册和查找服务。
3. 分布式锁
分布式锁 用于确保在分布式环境中对共享资源的互斥访问,避免并发问题。
场景描述:
- 分布式系统中,同一个资源可能被多个节点访问,需要一种机制来确保访问的互斥性。
- ZooKeeper 可以通过临时节点和锁的概念来实现分布式锁。
实现方式:
- 临时节点:作为锁的占位符,节点的生命周期和客户端会话绑定,确保锁的释放。
- 顺序节点:通过创建顺序节点来实现公平锁,每个客户端尝试获取最小序号的节点。
代码示例:
import org.apache.zookeeper.*;
import java.util.Collections;
import java.util.List;public class DistributedLock {private ZooKeeper zk;private String lockPath;private String lockNode;public DistributedLock(String connectString, String lockPath) throws Exception {this.zk = new ZooKeeper(connectString, 3000, null);this.lockPath = lockPath;}public void acquireLock() throws Exception {this.lockNode = zk.create(lockPath + "/lock-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);while (true) {List<String> children = zk.getChildren(lockPath, false);Collections.sort(children);String smallestChild = children.get(0);if (lockNode.endsWith(smallestChild)) {break;} else {// 等待锁释放Watcher watcher = event -> {if (event.getType() == Event.EventType.NodeDeleted) {synchronized (this) {this.notifyAll();}}};zk.exists(lockPath + "/" + smallestChild, watcher);synchronized (this) {this.wait();}}}}public void releaseLock() throws Exception {zk.delete(lockNode, -1);}public static void main(String[] args) throws Exception {DistributedLock lock = new DistributedLock("localhost:2181", "/locks");lock.acquireLock();System.out.println("获得锁");Thread.sleep(5000); // 模拟一些操作lock.releaseLock();System.out.println("释放锁");}
}
这个示例展示了如何使用 ZooKeeper 实现一个简单的分布式锁机制。
4. 主节点选举
主节点选举 用于在分布式系统中选出或重新选出领导者节点,常用于主从复制、负载均衡等场景。
场景描述:
- 在分布式数据库或集群系统中,常常需要一个主节点来协调操作。
- 当主节点失效时,需要一种机制来选举新的主节点。
实现方式:
- 临时顺序节点:每个节点在 ZooKeeper 中创建一个临时顺序节点,序号最小的节点被选为主节点。
- Watcher:监控主节点的变化,如果主节点失效,启动新的选举。
代码示例:
import org.apache.zookeeper.*;
import java.util.List;
import java.util.Collections;public class LeaderElection implements Watcher {private static final String ELECTION_PATH = "/election";private ZooKeeper zk;private String currentNode;public LeaderElection(String connectString) throws Exception {this.zk = new ZooKeeper(connectString, 3000, this);}public void run() throws Exception {// 创建竞选节点currentNode = zk.create(ELECTION_PATH + "/n_", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);checkLeader();}private void checkLeader() throws Exception {List<String> children = zk.getChildren(ELECTION_PATH, false);Collections.sort(children);if (currentNode.endsWith(children.get(0))) {System.out.println("我现在是领导者: " + currentNode);} else {System.out.println("我是追随者,等待领导者");String leader = ELECTION_PATH + "/" + children.get(0);zk.exists(leader, this); // 监听领导者节点}}public void process(WatchedEvent event) {if (event.getType() == Event.EventType.NodeDeleted) {try {checkLeader();} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) throws Exception {LeaderElection le = new LeaderElection("localhost:2181");le.run();Thread.sleep(Long.MAX_VALUE); // 等待事件}
}
这个例子展示了如何通过 ZooKeeper 实现领导者选举。
5. 集群管理
集群管理 涉及到集群节点的加入、退出、健康状态监控等。
场景描述:
- 在运行时,集群中的节点可能动态变化,ZooKeeper 可以帮助管理这些变化。
- 它可以用来监控节点的健康状态,进行负载均衡,管理节点的生命周期。
实现方式:
- 节点注册:每个节点在 ZooKeeper 中注册自己,通常使用临时节点来表示节点的在线状态。
- 健康检查:通过 Watcher 机制监控节点的变化,进行健康检查和负载均衡操作。
代码示例:
import org.apache.zookeeper.*;public class ClusterNode {private ZooKeeper zk;private String nodePath;public ClusterNode(String connectString) throws Exception {this.zk = new ZooKeeper(connectString, 3000, null);}public void joinCluster() throws Exception {nodePath = zk.create("/cluster/node-", "active".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println("已加入集群: " + nodePath);}public void leaveCluster() throws Exception {zk.delete(nodePath, -1);System.out.println("已离开集群: " + nodePath);}public static void main(String[] args) throws Exception {ClusterNode node = new ClusterNode("localhost:2181");node.joinCluster();Thread.sleep(10000); // 模拟在线时间node.leaveCluster();}
}
这个示例展示了如何使用 ZooKeeper 来管理集群节点的加入和退出。
6. 分布式队列
分布式队列 用于在分布式环境中实现任务的顺序处理。
场景描述:
- 在分布式系统中,任务可能需要按照一定的顺序执行,队列提供了一种异步处理机制。
- ZooKeeper 可以利用其顺序节点特性来实现分布式队列。
实现方式:
- 顺序节点:利用 ZooKeeper 的顺序节点功能,每个任务添加到队列时都会得到一个唯一的序号。
- 处理任务:节点可以按照序号处理任务,确保顺序性。
代码示例:
import org.apache.zookeeper.*;
import java.util.List;
import java.util.Collections;public class DistributedQueue {private ZooKeeper zk;private String queuePath;public DistributedQueue(String connectString, String queuePath) throws Exception {this.zk = new ZooKeeper(connectString, 3000, null);this.queuePath = queuePath;if (zk.exists(queuePath, false) == null) {zk.create(queuePath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}}public void enqueue(String task) throws Exception {zk.create(queuePath + "/task-", task.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);}public String dequeue() throws Exception {List<String> children = zk.getChildren(queuePath, false);if (children.isEmpty()) return null;Collections.sort(children);String taskNode = children.get(0);String taskPath = queuePath + "/" + taskNode;byte[] taskData = zk.getData(taskPath, false, null);zk.delete(taskPath, -1);return new String(taskData);}public static void main(String[] args) throws Exception {DistributedQueue queue = new DistributedQueue("localhost:2181", "/queue");// 入队queue.enqueue("Task 1");queue.enqueue("Task 2");// 出队System.out.println("出队任务: " + queue.dequeue());System.out.println("出队任务: " + queue.dequeue());}
}
通过这个例子,我们看到如何利用 ZooKeeper 实现一个简单的分布式队列。
结论
ZooKeeper 通过其简洁但功能强大的 API 和数据模型,提供了一种解决分布式系统中协调问题的有效途径。无论是在配置管理、命名服务、分布式锁、主节点选举、集群管理,还是分布式队列等方面,ZooKeeper 都展现了其灵活性和可靠性。通过上面的场景分析和代码示例,希望能帮助开发者更好地理解和应用 ZooKeeper 在实际分布式系统中的作用,确保系统的高效运行和数据一致性。
相关文章:
ZooKeeper 的典型应用场景:从概念到实践
引言 在分布式系统的生态中,ZooKeeper 作为一个协调服务框架,扮演着至关重要的角色。它的设计目的是提供一个简单高效的解决方案来处理分布式系统中常见的协调问题。本文将详细探讨 ZooKeeper 的典型应用场景,包括但不限于配置管理、命名服务…...
C++ list介绍
文章目录 1. list简介2. list的实现框架2.1 链表结点2.2 链表迭代器2.3 链表 3. list迭代器及反向迭代器设计3.1 list迭代器3.2 list反向迭代器3.3 list迭代器失效 4. list与vector比较 1. list简介 list,即链表。 链表的种类有很多,是否带头结点&#…...
暂未整理啊
测码学院 python的数据类型 不可变数据类型:字符串/数字/元组/ type(变量名) 获得数据的类型 str:字符串 int:整数 float:浮点数 bool:true/false 布尔类型 list:列表 dict&…...
C# Basic
文章目录 项目地址一、基础501. What is CIL?2. What is CLR?3. What is the difference betweent value type and reference types?4. what is boxing and unboxing?5. How are exceptions handled in C#?6. What is the difference between a class and a struct?7. Wh…...
小红书爬虫: 获取所需数据
小红书,又名 “小红书 ”或简称 “红”,已迅速成为中国社交和电子商务领域的重要参与者,成为一个不可或缺的平台。对于企业、营销人员和数据分析师来说,从小红书收集数据可以获得宝贵的洞察力,从而推动业务增长。虽然这…...
人工智能学习(七)之神经网络
目录 一、引言 二、经典神经网络回顾 (一)结构与计算过程 (二)局限性 三、循环神经网络(RNN)原理 (一)基本结构 (二)计算过程 (三…...
LeetCode --- 435周赛
题目列表 3442. 奇偶频次间的最大差值 I 3443. K 次修改后的最大曼哈顿距离 3444. 使数组包含目标值倍数的最少增量 3445. 奇偶频次间的最大差值 II 一、奇偶频次间的最大差值I 统计字母出现次数,然后分别统计出现偶数次的最小值和出现奇数次的最大值,…...
算法 ST表
目录 前言 一,暴力法 二,打表法 三,ST表 四,ST表的代码实现 总结 前言 ST表的主要作用是在一个区间里面寻找最大值,具有快速查找的功能,此表有些难,读者可以借助我的文章和网上的课程结…...
【AI论文】使用滑动磁贴注意力实现快速视频生成
摘要:扩散变换器(DiTs)凭借3D全局注意力机制在视频生成领域达到了最先进水平,但其计算成本高昂——生成一段仅5秒的720P视频时,仅注意力计算就占用了总推理时间的945秒中的800秒。本文引入了滑动磁贴注意力(…...
MAAS | Ollama 搭建本地 AI 大模型 deepseekWeb 界面调用
目录 一、环境准备二、安装 Ollama三、下载并部署 DeepSeek 模型四、简单交互五、通过 Web 界面调用大模型 在当今人工智能快速发展的时代,本地部署大语言模型赋予了用户更高的灵活性和个性化服务体验。本文介绍了如何准备环境、安装Ollama框架、下载并部署DeepSeek…...
Arduino 第十一章:温度传感器
Arduino 第十一章:LM35 温度传感器 一、LM35 简介 LM35 是美国国家半导体公司(现德州仪器)生产的一款精密集成电路温度传感器。与基于热力学原理的传统温度传感器不同,LM35 能直接将温度转换为电压输出,且输出电压与…...
普通用户授权docker使用权限
1、检查docker用户组 sudo cat /etc/group |grep docker 若显示:docker:x:999: # 表示存在否则创建docker用户组: sudo groupadd docker2、查看 /var/run/docker.sock 的属性 ll /var/run/docker.sock 显示: srw-rw---- 1 root root 0 1月…...
嵌入式软件C语言面试常见问题及答案解析(四)
嵌入式软件C语言面试常见问题及答案解析(四) 原本打算将链表相关的面试题整合到一个文档中,奈何写着写着就发现题目比较多,题型也比较丰富,所以导致上一篇已经足够长了,再长也就有点不礼貌了。 所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者…...
Python中是否有类似R语言中rds的功能,可将对象保存为文件?
在数据分析和科学计算领域,R语言和Python都是极为流行的编程语言。它们各自拥有独特的优势和丰富的库资源,使得数据科学家们能够高效地处理和分析数据。在R语言中,RDS(R Data Serialization)格式是一种非常方便的方式&…...
LabVIEW无人机飞行状态监测系统
近年来,无人机在农业植保、电力巡检、应急救灾等多个领域得到了广泛应用。然而,传统的目视操控方式仍然存在以下三大问题: 飞行姿态的感知主要依赖操作者的经验; 飞行中突发的姿态异常难以及时发现; 飞行数据缺乏系统…...
车联网安全入门一:了解CAN总线及环境模拟
准备打工了,工作内容和车联网安全相关,本来想着和app分析有较大关系,但是还涉及到很多关于汽车渗透测试相关的知识,由于之前并没有接触过,就借此机会和大家来学习一下。 ## CAN基础知识 ### CAN(Controller…...
hive spark读取hive hbase外表报错分析和解决
问题现象 使用Spark shell 操作hive关联Hbase的外表导致报错;hive使用tez引擎操作关联Hbase的外表时报错。 问题1:使用tez或spark引擎,在hive查询时只要关联hbase的hive表就会有问题其他表正常。 “org.apache.hadoop.hbase.client.RetriesExhaustedException:Can’t get …...
【MQ】RabbitMQ 高可用延时功能的探究
延迟消息如果使用延时交换机来实现,如果数据量过大,就会很占 CPU 资源,轻则时间误差大,重则 RabbitMQ 宕机 一、针对一个 RabbitMQ 节点 (1)利用队列 ttl,将延迟消息根据 delay 的时间进行分级…...
网络安全讲座之一:网络安全的重要性
第一讲内容主要对于安全的发展以及其重要性作了简明的阐述,并介绍了一些国内外知名的网络安全相关网站,并对于如何建立有效的安全策略给出了很好的建议,并让大家了解几种安全标准。 媒体经常报道一些有关网络安全威胁的令人震惊的事件&am…...
flutter ListView Item复用源码解析
Flutter 的 ListView 的 Item 复用机制是其高性能列表渲染的核心,底层实现依赖于 Flutter 的渲染管线、Element 树和 Widget 树的协调机制。以下是 ListView 复用机制的源码级解析,结合关键类和核心逻辑进行分析。 1. ListView 的底层结构 ListView 的复…...
基于java手机销售网站设计和实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
HTML 左右联动高亮示例
HTML 左右联动高亮示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>左右联动高亮示例</titl…...
如何本地部署DeepSeek
第一步:安装ollama https://ollama.com/download 打开官网,选择对应版本 第二步:选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量(Parameters),其中 B 是英文 B…...
虚拟机+Docker配置主机代理和常见配置
完整配置流程如下: 配置虚拟机使用宿主机代理: # 设置环境变量(宿主机IP为192.168.100.1,代理端口7890) export http_proxyhttp://192.168.100.1:7890 export https_proxyhttp://192.168.100.1:7890# 测试代理是否生…...
996引擎-问题处理:盟重传送石问题
996引擎-问题处理:盟重传送石问题 问题解决方案补充:回城卷参考资料问题 今天添加了个新地图,由于这个版本只有盟重传送石没设计回城卷。 所以怎么搞都回不到新地图的回城点。(当时也是懵逼了都忘记它叫 盟重 传送石`) 分析 先看一下道具表的配置。 [@StdModeFuncX] 表示…...
从零到一学习c++(基础篇--筑基期七-vector与迭代器)
从零到一学习C(基础篇) 作者:羡鱼肘子 温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。 温馨提示2:本篇会尽量用更加通俗的语言介绍c的基础,用通俗的语言去…...
PKI及SSL协议分析
PKI的基本组成,完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。 任务一:搭建CA服务器 本任务初步了…...
请解释 JavaScript 中的函数式编程,优缺点是什么?
一、对JavaScript函数式编程的理解 函数式编程(Functional Programming,FP)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。 在JavaScript中,函数式编程具有以下几个关键特性&…...
WPS接入DeepSeek模型
1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 (最好是安装最新的wps) 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…...
头条百度批量采集软件说明文档
旧版说明文档《头条号文章批量采集软件4.0版本说明文档!头条/微头条文章批量采集》 头条的采集软件已经更新了好多个版本了,一直没有做详细的介绍文档,最近更新了一些功能进去,一块来写一下说明文档。 1、主界面 2、头条作者采集…...
网络安全架构师怎么考 网络安全 架构
安全通信网络 随着现代技术的不断发展,等级保护对象通常通过网络实现资源共享和数据交互,当大量的设备连成网络后,网络安全成了最为关注的问题。按照“一个中心,三重防御”的纵深防御思想,边界外部通过广域网或城域网…...
Vue 3 30天精进之旅:Day 21 - 项目实践:打造功能完备的Todo应用
前言 经过前20天的学习,我们已经掌握了Vue 3的核心概念、组合式API、路由、状态管理等关键技术。今天将通过一个完整的项目实践——Todo应用,将所学知识融会贯通。我们将为Todo应用添加编辑、删除、过滤等进阶功能,并优化代码结构。 一、项目…...
2025年02月11日Github流行趋势
项目名称:unsloth 项目地址url:https://github.com/unslothai/unsloth项目语言:Python历史star数:27175今日star数:1024项目维护者:danielhanchen, shimmyshimmer, Erland366, Datta0, xyangk项目简介&…...
嵌入式硬件篇---原码、补码、反码
文章目录 前言简介八进制原码、反码、补码1. 原码规则示例问题 2. 反码规则示例问题 3. 补码规则示例优点 4. 补码的运算5. 总结 十六进制原码、反码、补码1. 十六进制的基本概念2. 十六进制的原码规则示例 3. 十六进制的反码规则示例 4. 十六进制的补码规则示例 5. 十六进制补…...
PCM与G711A互转
PCM与G711A互转 工具类(Java)调用方法(Kotlin) 工具类(Java) public class G711Code {private final static int SIGN_BIT 0x80;private final static int QUANT_MASK 0xf;private final static int SEG…...
MapReduce简单应用(三)——高级WordCount
目录 1. 高级WordCount1.1 IntWritable降序排列1.2 输入输出格式1.3 处理流程 2. 代码和结果2.1 pom.xml中依赖配置2.2 工具类util2.3 高级WordCount2.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。 1. 高级WordCo…...
C# 数据验证Regex
Regular Expression,简称 Regex,是一种用于匹配和处理文本的强大工具。它通过定义特定的模式,可以用来搜索、替换或提取字符串中的特定内容。 先引入命名空间 using System.Text.RegularExpressions; Intege(整数) 必须是正整数 //必须是正整数publi…...
Jenkins+gitee 搭建自动化部署
Jenkinsgitee 搭建自动化部署 环境说明: 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本,不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…...
C/C++混合读入cin与scanf问题
因为C/C在某些时候是如此的融洽,以至于很多时候可能会混用,就比如 scanf与cin或getline(cin, ..)这是一个严肃的问题。因为随意混用,可能导致,在某些特殊时刻,读取混乱。所以本篇的意义就是为了缕清混用机制 一、scan…...
矩阵 NFC 碰一碰发视频源码搭建技术解析,支持OEM
一、引言 在移动互联与物联网飞速发展的当下,NFC(Near Field Communication,近场通信)技术凭借其便捷、快速的数据传输特性,在众多领域得到广泛应用。本文将深入探讨如何搭建矩阵 NFC 碰一碰发视频的源码,…...
Log4j定制JSON格式日志输出
1.前言 log4j是Java中一个强大的日志记录框架,通过简单的配置便可以在程序中进行日志打印与记录。关于log4j博主最近碰到一个需求,需要将程序运行过程中的日志按给定的json模板输出,本文记录一下log4j如何配置json格式的日志打印。 2.日志配…...
Spring依赖注入方式
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
【C++八股】什么是函数指针,如何定义和使⽤场景
函数指针是指向函数的指针变量,它存储的是一个函数的地址,允许通过指针间接调用函数。使用函数指针可以动态地选择和调用函数,或者将函数作为参数传递给其他函数。 1. 函数指针的定义 函数指针的定义与普通指针稍有不同。它需要声明指向特定…...
DeepSeek 入驻 Cursor —— 表现能否超越 Claude?
DeepSeek 刚刚在 Cursor 平台上线了它的两款模型:DeepSeek V3 和 R1。目前,许多开发者(包括我们在内)主要依赖 Claude 3.5 Sonnet(最新版本 claude-3-5-sonnet-20241022)作为主要语言模型,因此我…...
skynet-src/atomic.h:25:23: 致命错误:stdatomic.h:没有那个文件或目录
skynet-src/atomic.h:25:23: 致命错误:stdatomic.h:没有那个文件或目录 故事背景,又接了一个新项目,要搞开发环境啊。skyent的框架。ubuntu已经跑起来了,但是内网是centos的跑不起来。只能怀疑是环境问题了࿰…...
docker compose部署nexus
整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...
IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统
案例:刀箱某一blade,例如 blade 5 安装 Hyper-V Server 2019 操作系统(安装进硬盘) 刀箱USB插入安装系统U盘,登录192.168... IBM BlandeCenter Restart Blande 5,如果Restart 没反应,那就 Power Off Blade 然后再 Power On 重启后进入BIOS界面设置usb存储为开机启动项 …...
Python的顺序结构和循环结构
文章目录 一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(c)多分支 if-elif-elif-...-else (3)注意事…...
[python SQLAlchemy数据库操作入门]-30.掌握 SQLAlchemy:优雅应对数据库异常的艺术
哈喽,大家好,我是木头左! 捕获和处理 SQLAlchemy 异常 在实际应用中,需要根据不同的异常类型采取不同的处理策略。下面是一个示例,展示了如何捕获和处理 SQLAlchemy 的异常。 from sqlalchemy import create_engine, Column, Integer, String, exc from sqlalchemy.ext.…...
编译和链接【三】
文章目录 编译和链接【三】前言系列文章入口编译过程词法分析语法分析语义分析生成中间代码汇编链接 编译和链接【三】 前言 在我大一的时候, 我使用VC6.0对C语言程序进行编译链接和运行 , 然后我接触了VS, Qt creator等众多IDE,…...