学习Zookeeper
Zookeeper有手就行
- 1. 初识ZooKeeper
- 1.1 安装ZooKeeper
- 1.2 ZooKeeper命令操作
- 1.2.1 Zookeeper数据模型
- 1.2.2 Zookeeper 服务端常用命令
- 1.2.3 Zookeeper客户端常用命令
- 2. ZooKeeperJavaAPl操作
- 2.1 Curator介绍
- 2.2 CuratorAPI常用操作
- 2.2.0 引入Curator支持
- 2.2.1 建立连接
- 2.2.2 添加节点
- 2.2.3 删除节点
- 2.2.4 修改节点
- 2.2.5 查询节点
- 2.2.6 Watch事件监听
- 2.2.6.1 NodeCache 监听事件
- 2.2.6.2 PathChildrenCache 监听事件
- 2.2.6.3 TreeCache 监听事件
- 2.3 分布式锁
- 2.4 模拟12306售票案例
- 3. ZooKeeper集群搭建
- 3.1 zookeeper集群介绍
- 4. Zookeeper核心理论
- 4.1 ZooKeeper的三种运行模式
以下内容是在阅读大量博客并结合个人理解后整理总结的,作为个人学习笔记分享给大家。文末将附上相关的参考资料链接。如果其中有涉及到侵权的内容,请及时告知,我会立即删除相关部分。在此,特别感谢各位前辈的无私分享和指导,也希望本文能够对读者有所帮助。
1. 初识ZooKeeper
Zookeeper是Apache Hadoop项目下的一个子项目,是一个树形目录服务。
Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk
Zookeeper是一个分布式的、开源的分布式应用程序的协调服务。
主要为了解决分布式架构下数据一致性问题, 它是集群的管理者, 监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。 最终, 将简单易用的接口和性能高效、 功能稳定的系统提供给用户。
Zookeeper提供的主要功能包括:
分布式配置中心、分布式注册中心、分布式锁、分布式队列、集群选举、分布式屏障、发布/订阅等场景。
1.1 安装ZooKeeper
这个环境安装的我费劲死了。。
安装这一类的 一定注意jdk的 版本,不然真的会踩坑很多,今后我知道了 ,如果想入门一个技术栈,先把jdk1.8安装好,并且环境变量配置好,然后在忘后学习新的东西!!!!
- JDK1.8安装教程:https://blog.csdn.net/qq_40771292/article/details/107615925
- ZooKeeper安装教程:https://gongna-au.github.io/2022-10-14-test-markdown/
不用担心教程问题,一步一步来就好,遇到问题解决问题
1.2 ZooKeeper命令操作
1.2.1 Zookeeper数据模型
ZooKeeper是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个层次化结构。
ZooKeeper 数据模型(Data model)采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且,每个节点还可以拥有 N 个子节点,最上层是根节点以/来代表。
每个数据节点在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。由于ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。
和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。默认有四种类型的znode:
- PERSISTENT持久化节点
- EPHEMERAL临时节点:-e
- PERSISTENT_SEQUENTIAL持久化顺序节点:-S
- EPHEMERAL_SEQUENTIAL临时顺序节点:-es
1.2.2 Zookeeper 服务端常用命令
当然要在zookeeper的bin:我的路径上为 :/usr/local/zookeeper/apache-zookeeper/bin
- 启动ZooKeeper服务:
./zkServer.sh start
- 查看ZooKeeper服务状态:
./zkServer.sh status
- 停止ZooKeeper服务:
./zkServer.sh stop
- 重启ZooKeeper服务:
./zkServer.sh restart
1.2.3 Zookeeper客户端常用命令
首先连接服务端:./zkCli.sh -server ip:port
输入quit
退出
查看子节点:ls
创建节点:create /节点名称 节点内容
create
的时候不能创建相同名称节点
获取数据:get /节点名称
如果在
create
的时候不设置数据,则get
的时候为null
通过set /节点path value
设置节点值
删除节点: delete /节点名称
查看全部命令:help
节点 可以 创建 四大类:create -e /app1 value
- PERSISTENT持久化节点
- EPHEMERAL临时节点:-e
- PERSISTENT_SEQUENTIAL持久化顺序节点:-S
- EPHEMERAL_SEQUENTIAL临时顺序节点:-es
znode 状态信息 | 解释 |
---|---|
cZxid | create ZXID,即该数据节点被创建时的事务 id |
ctime | create time,znode 被创建的毫秒数(从1970 年开始) |
mZxid | modified ZXID,znode 最后更新的事务 id |
mtime | modified time,znode 最后修改的毫秒数(从1970 年开始) |
pZxid | znode 最后更新子节点列表的事务 id,只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新 |
cversion | znode 子节点变化号,znode 子节点修改次数,子节点每次变化时值增加 1 |
dataVersion | znode 数据变化号,节点创建时为 0,每更新一次节点内容(不管内容有无变化)该版本号的值增加 1 |
aclVersion | znode 访问控制列表(ACL )版本号,表示该节点 ACL 信息变更次数 |
ephemeralOwner | 如果是临时节点,这个是 znode 拥有者的 sessionid。如果不是临时节,则 ephemeralOwner=0 |
dataLength | znode 的数据长度 |
numChildren | znode 子节点数量 |
2. ZooKeeperJavaAPl操作
2.1 Curator介绍
Curator是Apache ZooKeeper 的Java客户端库。Curator 提供了一组易于使用的API和工具,简化了与ZooKeeper 的交互,同时提供了更高级别的抽象和功能。
常见的ZooKeeperJava API:
- 原生Java API
- ZkClient
- Curator
Curator项目的目标是简化ZooKeeper客户端的使用。Curator最初是Netfix研发的,后来捐献了Apache基金会,目前是Apache的顶级项目。 官网:http://curator.apache.org/
2.2 CuratorAPI常用操作
2.2.0 引入Curator支持
<!-- zookeeper支持 -->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.4</version>
</dependency>
<!-- curator-recipes -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.5.0</version>
</dependency>
<!-- curator-framework -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.5.0</version>
</dependency>
2.2.1 建立连接
//超时重试(连接间隔时间和超时连接次数)
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
//连接zookeeper对象
client = CuratorFrameworkFactory.newClient("ip:port",1000,60*1000,retryPolicy);
//开始连接
client.start();
2.2.2 添加节点
//1、创建节点并赋值
String path = client.create().forPath("/zuxia","helloworld".getBytes());
System.out.println("创建节点:"+path);
//2、创建节点带子节点(如果不给子节点赋值,子节点的值默认为当前系统的IP地址)
String path = client.create().creatingParentsIfNeeded().forPath("/zuxia/abc");
System.out.println("创建节点:"+path);
//3、创建临时节点(当断开连接时临时节点会自动删除,withMode中的属性可选择)
String path =client.create().withMode(CreateMode.EPHEMERAL).forPath("/a","helloworld".getBytes());
System.out.println("创建节点:"+path);
2.2.3 删除节点
//1、删除节点
System.out.println("删除节点:"+client.delete().forPath("/wjh"));
//2、删除带有子节点的目录节点
System.out.println("删除子节点:"+client.delete().deletingChildrenIfNeeded().forPath("/zuxia"));
2.2.4 修改节点
//给节点赋值(返回值为Stat,可写可不写)
client.setData().forPath("/ab", "hello".getBytes());
2.2.5 查询节点
//1、查询节点的数据
byte[] bytes = client.getData().forPath("/zuxia");
System.out.println(new String(bytes));
//2、查询节点的数据(详情信息)
Stat stats=new Stat();
System.out.println(stats);//为了区分两个结果的不同
byte[] be = client.getData().storingStatIn(stats).forPath("/zuxia");
System.out.println(stats);
2.2.6 Watch事件监听
-
ZooKeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
-
ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。
ZooKeeper提供了三种Watcher:
-
NodeCache : 只是监听某一个特定的节点
-
PathChildrenCache : 监控一个ZNode的子节点.
-
TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合
2.2.6.1 NodeCache 监听事件
@Test
void testNodeCache() throws Exception {
// 1. 创建NodeCache
NodeCache nodeCache = new NodeCache(client, "/ab");
// 2. 注册监听
nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {System.out.println("/ab节点发生变更");byte[] dataBytes = nodeCache.getCurrentData().getData();System.out.println("节点修改后的数据:" + new String(dataBytes));}
});
// 3. 开启监听,如果设置为true,则开启监听时,加载缓冲数据
nodeCache.start(true);
while(true){}
}
2.2.6.2 PathChildrenCache 监听事件
@Test
void testPathChildrenCache() throws Exception {
//创建监听对象(监听指定节点下的)
PathChildrenCache pathChildrenCache= new PathChildrenCache(client, "/zuxia", true);
//注册监听事件
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {@Overridepublic void childEvent(CuratorFramework cf, PathChildrenCacheEvent event) throws Exception {System.out.println("节点发生变化了");PathChildrenCacheEvent.Type type = event.getType();//当前判断的是当节点发生更新时进入改方法,可以选择添加或者删除的方法if (type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){byte[] bytes = event.getData().getData();System.out.println("节点修改后的数据"+new String(bytes));}}
});
//开启监听
pathChildrenCache.start();
while (true){}
}
2.2.6.3 TreeCache 监听事件
@Test
void testTreeCache() throws Exception {//创建监听对象TreeCache treeCache = new TreeCache(client, "/zuxia");//注册监听treeCache.getListenable().addListener(new TreeCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {System.out.println("节点发生变化了");TreeCacheEvent.Type type = treeCacheEvent.getType();if (type.equals(TreeCacheEvent.Type.NODE_ADDED)){System.out.println("节点添加了");}}});//开启监听treeCache.start();while (true){}
}
2.3 分布式锁
一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
-
客户端获取锁时,在lock节点下创建临时顺序节点。
-
然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
-
如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
-
如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
2.4 模拟12306售票案例
•在Curator中有五种锁方案:
•InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
•InterProcessMutex:分布式可重入排它锁
•InterProcessReadWriteLock:分布式读写锁
•InterProcessMultiLock:将多个锁作为单个实体管理的容器
•InterProcessSemaphoreV2:共享信号量
package com.wjh;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
import java.util.concurrent.TimeUnit;
public class TickTest implements Runnable{private int x=10;//票数//创建分布式可重入排它锁对象private InterProcessMutex lock;private CuratorFramework client;
//当前方法的构造方法public TickTest() {//超时重试(连接间隔时间和超时连接次数)RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);//连接zookeeper对象client = CuratorFrameworkFactory.newClient("ip:port",1000,60*1000,retryPolicy);//开始连接client.start();//创建分布式可重入排它锁对象连接zookeeper注册中心客户端//客户端中不用创建,这里会自动创建lock = new InterProcessMutex(client, "/lock");}
@Overridepublic void run() {try {//设置锁lock.acquire(3, TimeUnit.SECONDS);while (true) {if(x>0){//输出的调用线程的对象以及票数的数量System.out.println(Thread.currentThread()+"票数:" + x);//间隔200毫秒输出一次Thread.sleep(200);x--;}}} catch (Exception e) {throw new RuntimeException(e);}finally {try {//释放锁lock.release();} catch (Exception e) {throw new RuntimeException(e);
}}}
}
3. ZooKeeper集群搭建
3.1 zookeeper集群介绍
Leader选举:
-
Serverid :服务器 ID
- 比如有三台服务器,编号分别是1,2,3。
- 编号越大在选择算法中的权重越大。
-
Zxid :数据 ID
- 服务器中存放的最大数据ID.值越大说明数据 越新,在选举算法中数据越新权重越大。
-
在 Leader 选举的过程中,如果某台 ZooKeeper获得了超过半数的选票,则此ZooKeeper就可以成为Leader了
4. Zookeeper核心理论
对于集群来说,多加几台服务器就行(当然还得解决session共享,负载均衡等问题),而对于分布式来说,你首先需要将业务进行拆分,然后再加服务器,同时还要去解决分布式带来的一系列问题。比如各个分布式组件如何协调起来,如何减少各个系统之间的耦合度,如何处理分布式事务,如何去配置整个分布式系统,如何解决各分布式子系统的数据不一致问题等等。ZooKeeper 主要就是解决这些问题的。
许多著名的开源项目用到了 ZooKeeper,比如:
Kafka
: ZooKeeper 主要为 Kafka 提供 Broker 和 Topic 的注册以及多个 Partition 的负载均衡等功能。Hbase
: ZooKeeper 为 Hbase 提供确保整个集群只有一个 Master 以及保存和提供 regionserver 状态信息(是否在线)等功能。Hadoop
: ZooKeeper 为 Namenode 提供高可用支持。Dubbo
:阿里巴巴集团开源的分布式服务框架,它使用 ZooKeeper 来作为其命名服务,维护全局的服务地址列表。
4.1 ZooKeeper的三种运行模式
ZooKeeper 有三种运行模式:单机模式、伪集群模式和集群模式。
- 单机模式:这种模式一般适用于开发测试环境,一方面我们没有那么多机器资源,另外就是平时的开发调试并不需要极好的稳定性。
- 集群模式:一个 ZooKeeper 集群通常由一组机器组成,一般 3 台以上就可以组成一个可用的 ZooKeeper 集群了。组成 ZooKeeper 集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都会互相保持通信。
-伪集群模式:这是一种特殊的集群模式,即集群的所有服务器都部署在一台机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪费资源,这种情况下,ZooKeeper 允许你在一台机器上通过启动不同的端口来启动多个 ZooKeeper 服务实例,从而以集群的特性来对外服务。
继续学习:
https://blog.csdn.net/dream_ambition/article/details/136027023
相关文章:
学习Zookeeper
Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …...
css效果
css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…...
【Python爬虫五十个小案例】爬取豆瓣电影Top250
博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...
electron主进程和渲染进程之间的通信
主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…...
在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...
JVM标量替换
JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据&…...
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等,对吧?机器学习也是一样,需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...
真实网络安全面试场景题
1.公司内部搭建了2台DNS服务器做主辅同步,公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名,但处于同样网络环境同事电脑却访问不了。 出现此问题原因…...
速盾:ddos防御手段哪种比较好?高防cdn怎么样?
DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...
【ArcGISPro】Sentinel-2数据处理
错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集...
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。 即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动&…...
谷粒商城-消息队列Rabbitmq
RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因: 异步处理提高性能 场景示例:在订单系统中,当用户提交订单后,系统需要完成多个操作,如更新库存、生成订单记录、发送订单通知等。如果这些操作…...
python-爬虫入门指南
前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务…...
力扣—53. 最大子数组和
53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4…...
STM32H7开发笔记(2)——H7外设之多路定时器中断
STM32H7开发笔记(2)——H7外设之多路定时器中断 文章目录 STM32H7开发笔记(2)——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置,硬件使用STM32H…...
kafka如何知道哪个消费者消费哪个分区?
在Kafka中,消费者和分区之间的分配是通过一个称为“消费者组协调器”(Consumer Group Coordinator)的组件来管理的。 以下是Kafka如何确定哪个消费者消费哪个分区的步骤: 消费者加入消费者组: 当消费者启动时…...
Dockerfile构建报错【ERROR: failed to solve: process】的解决办法
报错信息如下 ERROR: failed to solve: process “/bin/sh -c yarn install” did not complete successfully: exit code: 1 解决 从阿里云等镜像站点下载CentOS-7.repo文件 下载CentOS-7.repo文件:可以从阿里云等镜像站点下载CentOS-7.repo文件,…...
html渲染优先级
在前端开发中,优先布局是指在设计和构建页面时,将页面的各个部分按照其重要性和优先级进行排序,并依次进行布局和开发。这种方法可以帮助开发团队在项目初期就确定页面结构的核心部分,从而更好地掌控项目的整体进度和优先级。且确…...
AIX下crs-5005 ip address is aready in use in the network的解决办法
某业务生产系统中,三节点的rac数据库中3号节点因故障停机后,进行crs的重启。重启完成后,发现数据库的监听未起来,启动的过程中并提示crs-5005错误。 一、问题过程 查看监听,发现监听no service ywdb03/oracle/grid/c…...
Docker--通过Docker容器创建一个Web服务器
Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…...
C#里怎么样自己实现10进制转换为二进制?
C#里怎么样自己实现10进制转换为二进制? 很多情况下,我们都是采用C#里类库来格式化输出二进制数。 如果有人要你自己手写一个10进制数转换为二进制数,并格式化输出, 就可以采用本文里的方法。 这里采用求模和除法来实现的。 下…...
sql 查询语句:将终端数据形式转换成insert语句
文本转换:sql 查询语句:将终端数据形式转换成insert语句 如上,写过后端的都知道,从生产或其他地方拿到的数据,有可能会是图一;但实际上,我们需要图二的数据; 不废话,直接…...
Spring Boot 应用开发:构建高效、可扩展的 Java 微服务
以下是一个简单的 Spring Boot 小项目示例,该项目是一个基于 Spring Boot 的博客系统后端部分。这个项目将展示如何使用 Spring Boot 框架来创建一个基本的 RESTful API 服务,以管理博客文章。 项目结构 spring-boot-blog ├── src │ ├── main…...
【Linux】安装 openssh-server 并打开 ssh 服务(Ubuntu 22.04)
引言 openssh-server是OpenSSH套件的一部分,它是SSH协议的开源实现。SSH,全称为Secure Shell,是一种网络协议,用于安全地在不安全的网络环境中执行远程命令和传输数据。 配置步骤 在Ubuntu系统中安装openssh-server。 sudo apt…...
开源IM,为你的项目增加聊天功能
现在大多数APP,或多或少都会涉及到聊天功能,而大部分APP的选择则是接入TIM等三方IM服务,但是,这种方式对于大多数刚刚起步的APP来说,费用是非常昂贵的,基本上每月都有好几百的支出,并且…...
跨平台应用开发框架(1)----Qt(组件篇)
目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…...
Java基础 设计模式——针对实习面试
目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。适用场景&…...
C++ —— 以真我之名 如飞花般绚丽 - 智能指针
目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…...
k8s中部署filebeat进行日志监听并发送到es中
注意事项 1. 需要将namespace修改为自己项目中的命名空间 2. es换成对应的地址 3. filebeat-inputs中的两个配置(根据需要用任意一个就可以) 3.1 第一个配置是监听docker日志,由于系统日志太多所以这里只监听项目部署命名空间下的内容 -…...
HTTP Accept用法介绍
一、HTTP Accept是什么 HTTP协议是一个客户端和服务器之间进行通信的标准协议,它定义了发送请求和响应的格式。而HTTP Accept是HTTP协议中的一个HTTP头部,用于告诉服务器请求方所期望的响应格式。这些格式可以是媒体类型、字符集、语言等信息。 HTTP A…...
软件工程设计模式--结构型设计模式
设计模式的核心思想 : 广义——软件设计模式是可解决一类软件问题并能重 复使用的软件设计方案 狭义——设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,是在类和对象的层次描述的可重复使用的软件设计问题的解决方…...
HTML5好看的音乐播放器多种风格(附源码)
文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者&…...
【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register
0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…...
快速排序算法-C语言
第一步:实现分区函数 根据题目中的“快速排序”,我们需要实现一个分区函数,这个功能的实现: 设定基准值 pivot。使用两个指针 low 和 high,分别从数组的两端向中间移动,进行元素交换。 int part(int A[]…...
SuperMap Objects组件式GIS开发技术浅析
引言 随着GIS应用领域的扩展,GIS开发工作日显重要。一般地,从平台和模式上划分,GIS二次开发主要有三种实现方式:独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊,其中集成二次开发既可以充分利…...
极简开源Windows桌面定时提醒休息python程序
当我们长期在电脑面前坐太久后,会产生一系列健康风险,包括干眼症,颈椎,腰椎,肌肉僵硬等等。解决方案是在一定的时间间隔内我们需要have a break, 远眺可以缓解干眼症等眼部症状,站起来走动两步,…...
SpringBoot源码解析(五):准备应用环境
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
JAVA笔记 | 策略模式+枚举Enum简单实现策略模式(可直接套用)
本篇为更为简单的策略模式应用,使用枚举来进行策略分配 上一篇(链接如下)更像是策略工厂模式来分配策略 JAVA笔记 | 实际上用到的策略模式(可直接套用)-CSDN博客 先创建策略相关类 //策略类 public interface PetStrategy {/*** 执行动作 - 跑RUN*/String run(Str…...
SpringBoot集成 Jasypt 实现数据源连接信息进行加密
SpringBoot集成 Jasypt 实现数据源连接信息进行加密 在实际项目中,敏感信息(如数据库连接的 URL、用户名、密码等)直接暴露在配置文件中可能导致安全隐患。为了解决这一问题,可以使用 Jasypt 来加密敏感信息,并在运行…...
大数据新视界 -- Hive 数据桶原理:均匀分布数据的智慧(上)(9/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
优化Docker镜像:提升部署效率与降低资源消耗
目录 1. 最小化镜像层 2. 使用轻量级基础镜像 3. 多阶段构建 4. 清理不必要的文件和依赖 5. 使用.dockerignore文件 6. 压缩和优化文件系统 7. 外部化配置和数据 8. 限制容器资源 9. 定期清理未使用的镜像和容器 结论 在云计算和微服务架构的浪潮中,Docke…...
strupr(arr);模拟实现(c基础)
hi , I am 36 适合对象c语言初学者 strupr(arr);函数是把arr数组变为大写字母,并返回arr 介绍一下strupr(arr);(c基础)-CSDN博客 现在进行My__strupr(arr);模拟实现 #include<stdio.h>//My__strupr(arr); //返回值为arr(地址),于是…...
skywalking es查询整理
索引介绍 sw_records-all 这个索引用于存储所有的采样记录,包括但不限于慢SQL查询、Agent分析得到的数据等。这些记录数据包括Traces、Logs、TopN采样语句和告警信息。它们被用于性能分析和故障排查,帮助开发者和运维团队理解服务的行为和性能特点。 …...
AI时代的软件工程:迎接LLM-DevOps的新纪元
在科技日新月异的今天,GPT的问世无疑为各行各业带来了一场深刻的变革,而软件工程领域更是首当其冲,正式迈入了软件工程3.0的新纪元。2024年,作为软件工程3.0的元年,伴随着软件工程3.0宣言的震撼发布,一个全…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
详解Servlet的使用
目录 Servlet 定义 动态页面 vs 静态页面 主要功能 Servlet的使用 创建Maven项目 引入依赖 创建目录 编写代码 打war包 部署程序 验证程序 Smart Tomcat 安装Smart Tomcat 配置Smart Tomcat插件 启动Tomcat 访问页面 路径对应关系 Servlet运行原理 Tomcat的…...
使用Java代码操作Kafka(五):Kafka消费 offset API,包含指定 Offset 消费以及指定时间消费
文章目录 1、指定 Offset 消费2、指定时间消费 1、指定 Offset 消费 auto.offset.reset earliest | latest | none 默认是 latest (1)earliest:自动将偏移量重置为最早的偏移量,–from-beginning (2)lates…...