【流行框架】ZooKeeper

ZooKeeper远程连接超时排查与解决 在使用ZooKeeper时,我们遇到了连接超时的问题。通过仔细的排查和分析,我们发现问题的根源是客户端和服务端准备时间的不一致。通过调整客户端的连接超时时间,我们最终解决了问题。这个问题的排查过程虽然比较繁琐,但却让我们学到了很多有关ZooKeeper的知识。希望通过本篇博客,能够帮助到遇到类似问题的读者。如果有任何疑问或者建议,欢迎在评论区留言。 阅读详情

概述

  • Zookeeper是Apache Hadoop项目下的一个子项目,是一个树形目录服务

  • Zookeeper翻译过来就是 动物管理员,他是用来管理Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk

  • Zookeeper是一个分布式的、开源的分布式应用程序的协调服务

  • Zookeeper提供的主要功能包括

  • 配置管理

  • 分布式锁

  • 集群管理

安装与启动参看Dubbo注册中心部分

命令操作

数据模型

  • Zookeeper是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个层次化结构

  • 这里面的每一个节点都被称为:ZNode,每个节点上都会保存自己的数据和节点信息

  • 节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下

节点可以分为四大类

  • PERSISTENT 持久化节点

  • EPHEMERAL 临时节点:-e

  • PERSISTENT_SEQUENTIAL 持久化顺序节点:-s

  • EPHEMERAL_SEQUENTIAL 临时顺序节点:-es

服务端

  • 启动ZooKeeper服务:./zkServer.sh start

  • 查看ZooKeeper服务状态:./zkServer.sh status

  • 停止ZooKeeper服务:./zkServer.sh stop

  • 重启ZooKeeper服务:./zkServer.sh restart

客户端

基本CRUD

  • 连接ZooKeeper服务端:./zkCli.sh -server ip:2181(连接本机的话不需要-server ip:端口)

  • 断开连接:quit

  • 查看指定目录下的子节点:ls / ls /dubbo/config

  • 查看命令帮助:help

  • 创建节点:create /节点名 [节点数据]

  • 获取数据:get /节点名

  • 设置数据:set /节点名 数据

  • 删除节点:delete /节点名

当被删节点含有子节点时,不能使用delete删除,需要使用 deleteall命令

临时顺序节点

  • 创建临时节点:create -e /节点名

  • 创建顺序节点:create -s /节点名

  • 创建临时顺序节点: create -es /节点名

  • 查看节点详细信息:ls2 /路径(已经被淘汰,替换为:)ls -s /路径

  • czxid:节点被创建的事务id

  • ctime:创建时间

  • mzxid:最后一次被更新的事务id

  • mtime:修改时间

  • pzxid:子节点列表最后一次被更新的事务id

  • cversion:子节点的版本号

  • dataversion:数据版本号

  • aclversion:权限版本号

  • ephemeralOwner:用于临时节点,代表临时节点的事务id,如果为持久节点则为0

  • dataLength:节点存储的数据长度

  • numChildrean:当前节点的子节点个数


JavaAPI操作

Curator

简介

  • Curator 是 Apache ZooKeeper 的Java客户端库

  • 常见的ZooKeeper Java API

  • 原生Java API

  • ZkClient

  • Curator

  • Curator项目的目标是简化ZooKeeper客户端的使用

  • Curator 最初是Netfix 研发的,后来捐献了Apache基金会,目前是Apache的顶级项目

常用操作

  • 建立连接

  • 添加节点

  • 删除节点

  • 修改节点

  • 查询节点

  • Watch事件监听

  • 分布式锁实现

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--curator--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.0</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>

建立连接

@Test
publicvoidtestConnect(){
    /*
            connectString 连接字符串。zk server 地址和端口(多个用逗号隔开) "192.168.23.129:2181,192.131.34.168:2181"
            sessionTimeoutMs 会话超时时间  单位ms
            connectionTimeoutMs 连接超时时间 单位ms
            retryPolicy 重试策略
         */// 第一种方式
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
    // CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.23.129:2181",60 * 1000, 15 * 1000, retryPolicy);
    // 开启连接// client.start();// 第二种方式
    CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.23.129:2181")
        .sessionTimeoutMs(60 * 1000).connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).namespace("hellocode").build();
    client.start();
}
第二种方式指定namespace可以简化操作,让指定的名称空间作为根目录

添加节点

publicclassCuratorTest{
    private CuratorFramework client;
    @BeforepublicvoidtestConnect(){
        /*
            connectString 连接字符串。zk server 地址和端口(多个用逗号隔开) "192.168.23.129:2181,192.131.34.168:2181"
            sessionTimeoutMs 会话超时时间  单位ms
            connectionTimeoutMs 连接超时时间 单位ms
            retryPolicy 重试策略
         */// 第一种方式
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
//        CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.23.129:2181",//                60 * 1000, 15 * 1000, retryPolicy);//        // 开启连接//        client.start();// 第二种方式
        client = CuratorFrameworkFactory.builder().connectString("192.168.23.129:2181")
                .sessionTimeoutMs(60 * 1000).connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).namespace("hellocode").build();
        client.start();
    }

    /**
     * 创建节点:create 持久 临时 顺序
     * 1\. 基本创建:create().forPath("")
     * 2\. 创建节点 带有数据:create().forPath("",data)
     * 3\. 设置节点的类型:create().withMode(节点类型).forPath("",data)
     * 4,创建多级节点:create().withMode(节点类型).creatingParentsIfNeeded().forPath("",data)
     */@TestpublicvoidtestCreate()throws Exception {
        // 1\. 基本创建:create().forPath("")// 如果创建节点没有指定数据,则默认当前客户端的ip作为数据存储
        String path = client.create().forPath("/app1");
        System.out.println(path);
    }
    @TestpublicvoidtestCreate2()throws Exception {
        // 2\. 创建节点 带有数据:create().forPath("",data)// 如果创建节点没有指定数据,则默认当前客户端的ip作为数据存储
        String path = client.create().forPath("/app2","Hello World".getBytes());
        System.out.println(path);
    }
    @TestpublicvoidtestCreate3()throws Exception {
        // 3\. 设置节点的类型:create().withMode(节点类型).forPath("",data)// 如果创建节点没有指定数据,则默认当前客户端的ip作为数据存储
        String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
        System.out.println(path);
    }
    @TestpublicvoidtestCreate4()throws Exception {
        // 4,创建多级节点:create().withMode(节点类型).creatingParentsIfNeeded().forPath("",data)// 如果创建节点没有指定数据,则默认当前客户端的ip作为数据存储
        String path = client.create().creatingParentsIfNeeded().forPath("/app3/p1");
        System.out.println(path);
    }

    @Afterpublicvoidclose(){
        if(client != null){
            client.close();
        }
    }
}

查询节点

/**
     * 查询节点:
     * 1\. 查询数据:get:getData().forPath()
     * 2\. 查询子节点:ls:getChildren().forPath()
     * 3\. 查询节点状态信息:ls -s:getData().storingStatIn(状态对象).forPath()
*/@TestpublicvoidtestGet1()throws Exception {
    // 1\. 查询数据:get:getData().forPath()byte[] bytes = client.getData().forPath("/app2");
    System.out.println(new String(bytes));
}

@TestpublicvoidtestGet2()throws Exception {
    // 2\. 查询子节点:ls:getChildren().forPath()
    List<String> childrens = client.getChildren().forPath("/");
    System.out.println(childrens);
}

@TestpublicvoidtestGet3()throws Exception {
    // 3\. 查询节点状态信息:ls -s:getData().storingStatIn(状态对象).forPath()
    Stat stat = new Stat();
    client.getData().storingStatIn(stat).forPath("/app1");
    System.out.println(stat);
}

修改节点

/*
    *  修改数据
    *   1\. 修改数据 :setData().forPath()
    *   2\. 根据版本修改:setData().withVersion(version).forPath()
    *   version是通过查询出来的。目的是为了让其他客户端或者线程不干扰当前操作
* */@TestpublicvoidtestSet()throws Exception {
    Stat stat = client.setData().forPath("/app1", "hehe".getBytes(StandardCharsets.UTF_8));
    System.out.println(stat);
}

@TestpublicvoidtestForVersion()throws Exception {
    Stat stat = new Stat();
    client.getData().storingStatIn(stat).forPath("/app1");
    client.setData().withVersion(stat.getVersion()).forPath("/app1", "haha".getBytes(StandardCharsets.UTF_8));
}

删除节点

/*
     *  删除节点 delete deleteall
     *  1\. 删除单个节点
     *  2\. 删除带有子节点的节点
     *  3\. 必须成功的删除(防止网络抖动)
     *  4\. 回调
* */@TestpublicvoidtestDelete()throws Exception {
    // 1\. 删除单个节点
    client.delete().forPath("/app1");
}

@TestpublicvoidtestDelete2()throws Exception {
    // 2\. 删除带有子节点的节点
    client.delete().deletingChildrenIfNeeded().forPath("/app3");
}

@TestpublicvoidtestDelete3()throws Exception {
    // 3\. 必须成功的删除(防止网络抖动)
    client.delete().guaranteed().forPath("/app2");
}

@TestpublicvoidtestDelete4()throws Exception {
    // 4\. 回调
    client.delete().guaranteed().inBackground(new BackgroundCallback() {
        @OverridepublicvoidprocessResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent)throws Exception {
            System.out.println(curatorEvent);
        }
    }).forPath("/app2");
}

Watch监听

  • ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是ZooKeeper实现分布式协调服务的重要特性

  • ZooKeeper中引入了Watcher机制来实现了发布/订阅功能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者

  • ZooKeeper原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便,需要开发人员自己反复注册Watcher,比较繁琐

  • Curator引入了Cache来实现对ZooKeeper服务端事件的监听

  • ZooKeeper提供了三种Watcher

  • NodeCache:只是监听某一个特定的节点

  • PathChildrenCache”监控一个ZNode的子节点

  • TreeCache:可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合

NodeCache

@TestpublicvoidtestNodeCache()throws Exception {
    // 1\. 创建NodeCache对象
    NodeCache nodeCache = new NodeCache(client,"/app1");
    // 2.注册监听
    nodeCache.getListenable().addListener(new NodeCacheListener() {
        @OverridepublicvoidnodeChanged()throws Exception {
            System.out.println("节点变化了~~");

            // 获取修改后节点的数据byte[] data = nodeCache.getCurrentData().getData();
            System.out.println(new String(data));
        }
    });
    nodeCache.start();
}

PathChildrenCache

@TestpublicvoidtestPathChildrenCache()throws Exception {
    PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app2",true);
    pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
        @OverridepublicvoidchildEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent)throws Exception {
            System.out.println("子节点变化了~~~");
            if(pathChildrenCacheEvent.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
                System.out.println("子节点更改了~~~");
                System.out.println(new String(pathChildrenCacheEvent.getData().getData()));
            }
        }
    });
    pathChildrenCache.start();
    while (true){

    }
}

TreeCache

@TestpublicvoidtestTreeCache()throws Exception {
    TreeCache treeCache = new TreeCache(client,"/app2");
    treeCache.getListenable().addListener(new TreeCacheListener() {
        @OverridepublicvoidchildEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent)throws Exception {
            System.out.println("节点变化了");
            System.out.println(treeCacheEvent);
        }
    });
    treeCache.start();
    while (true){

    }
}

分布式锁

概述

  • 在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题

  • 但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题

  • 那么就需要一种更高级的锁机制,来处理这种跨机器的进程之间的数据同步问题——这就是分布式锁

原理

  • 核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点

  1. 客户端获取锁时,在lock节点下创建临时顺序节点

  1. 然后获取/lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除

  1. 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件

  1. 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应的通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听

售票案例

Curator实现分布式锁API

Curator中有五种锁方案:

  • InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)

  • InterProcessMutex:分布式可重入排它锁

  • InterProcessReadWriteLock:分布式读写锁

  • InterProcessMultiLock:将多个锁作为单个实体管理的容器

  • InterProcessSemaphoreV2:共享信号量

模拟12306售票案例

Ticket12306

/**
 * @author HelloCode
 * @site https://www.hellocode.top
 * @date 2022年08月18日 11:18
 */publicclassTicket12306implementsRunnable{

    privateint tickets = 10;
    private InterProcessMutex lock;

    publicTicket12306(){
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
        CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString("192.168.23.129:2181")
            .connectionTimeoutMs(15 * 1000)
            .sessionTimeoutMs(60 * 1000)
            .retryPolicy(retryPolicy)
            .build();
        client.start();
        lock = new InterProcessMutex(client,"/lock");
    }

    @Overridepublicvoidrun(){
        while(true){
            try {
                // 获取锁
                lock.acquire(3, TimeUnit.SECONDS);
                if(tickets > 0){
                    System.out.println(Thread.currentThread() + ":" + tickets--);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                // 释放锁try {
                    lock.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

LockTest

/**
 * @author HelloCode
 * @site https://www.hellocode.top
 * @date 2022年08月18日 17:11
 */publicclassLockTest{
    publicstaticvoidmain(String[] args){
        Ticket12306 ticket = new Ticket12306();

        // 创建客户端
        Thread t1 = new Thread(ticket,"携程");
        Thread t2 = new Thread(ticket,"飞猪");

        t1.start();
        t2.start();
    }
}

集群

搭建

要求

真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动很多个虚拟机内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭建在一台虚拟机上,用端口进行区分

配置集群

  1. 在每个zookeeper的data目录下创建一个myid文件,内容分别是1、2、3。这个文件就是记录每个服务器的id

echo 1 > /usr/local/zookeeper-cluster/zookeeper-1/data/myid
echo 2 > /usr/local/zookeeper-cluster/zookeeper-2/data/myid
echo 3 > /usr/local/zookeeper-cluster/zookeeper-3/data/myid
  1. 在每一个zookeeper的zoo.cfg配置客户端访问端口(clientPort)和集群服务器IP列表。 集群服务器IP列表如下

vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg

server.1=192.168.23.129:2881:3881
server.2=192.168.23.129:2882:3882
server.3=192.168.23.129:2883:3883
server.服务器id=服务器IP地址:服务器之间通信端口(默认2881):服务器之间投票选举端口(默认3881)
真实环境搭建集群时的2881和3881就直接使用默认值即可

启动集群

启动集群就是分别启动每个实例

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start

启动后查询一下运行状态

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status

故障测试

  • 3个节点的集群,1个从服务器挂掉,集群正常

  • 3个节点的集群,2个从服务器都挂掉,主服务器也无法运行。因为可运行的机器没有超过集群总数量的半数

  • 3个节点的集群,2个从服务器都挂掉,再重启一个从服务器,主服务器恢复运行,集群恢复正常

  • 当主服务器挂掉,将在正常的从服务器中重新进行选举,选举出新的leader

集群角色

在ZooKeeper集群服务中有三个角色:

  • Leader 领导者

  1. 处理事务请求

  1. 集群内部各服务器的调度者

  • Follower 跟随者

  1. 处理客户端非事务请求,转发事务请求给Leader服务器

  1. 参与Leader选举投票

  • Observer 观察者

  1. 处理客户端非事务请求,转发事务请求给Leader服务器

ZooKeeper 中的 Curator 框架解析 Curator 是 Netflix 开发的一个开源库,旨在简化 ZooKeeper 的使用。它提供了一套丰富的工具和高级抽象,使得开发者可以更容易地构建分布式协调服务。Curator 通过提供简单易用的 API 和高级抽象,极大地简化了 ZooKeeper 的使用。它不仅提高了开发效率,还增强了代码的健壮性和可测试性。通过本文的介绍,希望你能对 Curator 有一个基本的了解,并能够在实际项目中应用它来构建分布式协调服务。 阅读详情

相关推荐

ZooKeeper : Curator框架namespace原理分析

ZooKeeper : Curator框架Session API介绍 在学习Curator框架API之前,可以先了解Java客户端原生API,这样不仅可以更好的理解Curator框架API,还可以突出Curator框架的方便和强大。 ZooKeeper :Java客户端Session、ACL、Znode API介绍 ZooKeeper :Java客户端Watcher API介绍 ZooKeeper :Java客户端执行批量任务和Transaction API介绍 Curator是一个比较完善的ZooKe

kaven 3987

Zookeeper : session超时设置

(1)tickTime,这是个时间单位定量。 (2)minSessionTimeout, maxSessionTimeout:一般,客户端连接zookeeper的时候,都会设置一个session timeout,如果超过这个时间client没有zookeeper server有联系,则这个session被设置为过期(如果这个session上有临时节点,则会被全部删除),但是这个时间不是客户端可以...

金溪的博客 2万+

Kafka配置文件中的Zookeeper参数

在Kafka的配置文件中,有一些与Zookeeper相关的参数可以进行调整,以满足不同的需求和环境。本文将详细介绍Kafka配置文件中与Zookeeper相关的参数,并提供相应的源代码示例。这个参数用于设置与Zookeeper会话的超时时间,即Kafka与Zookeeper之间的心跳检测间隔时间。如果你的Zookeeper集群在不同的主机上或使用了不同的端口,你需要相应地修改这个参数。这是最重要的Zookeeper参数之一,用于指定Kafka连接到的Zookeeper集群的地址。默认情况下,该参数的值是。

DeoSql的博客 801

Zookeeper+Kafka集群部署

kafka设置群集 必要前提:zookeeper的集群是正常。 准备三台虚拟机 确定 三台主机IP 1.zookeeper集群搭建 1.2 zookeeper 搭建zookeeper的集群 1.2.1. . zookeeper的配置文件 zoo.cfg 每个文件都加入如下内容 server.1=192.168....

qq_45122010的博客 662

Kafka错误解决:kafka.zookeeper.ZooKeeperClientTimeoutException:连接超时等待解决方案

通过遵循上述步骤,您应该能够解决"kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection"错误,并成功连接到Kafka集群。增加连接超时时间:如果网络连接良好,但仍然遇到连接超时问题,可以尝试增加Kafka客户端连接到ZooKeeper服务器的超时时间。以上代码创建了一个简单的Kafka消费者,连接到本地的Kafka集群,并订阅名为"test-topic"的主题。是ZooKeeper服务器的端口号。

CvhShell的博客 4185

头歌 DNS协议分析第3关----DNS 报文分析

DNS 报文分析

qq_67667368的博客 4347

【流行框架】Zookeeper

Zookeeper是Apache Hadoop项目下的一个子项目,是一个树形目录服务Zookeeper翻译过来就是 动物管理员,他是用来管理Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zkZookeeper是一个分布式的、开源的分布式应用程序的协调服务Zookeeper提供的主要功能包括配置管理分布式锁集群管理安装与启动参看Dubbo注册中心部分。

HelloCode 528

利用LATX技术在龙芯安同AOCS OS上部署坚果云:跨架构文件同步实战

本文详细介绍了如何在龙芯安同AOCS OS上,利用LATX指令翻译技术部署坚果云客户端,实现跨架构文件同步。通过安装LATX环境、解压x64安装包、运行安装脚本三步,成功在loongarch64架构上运行仅支持x86_64的软件,解决了国产平台办公协同的痛点,并分享了性能实测与优化建议。

weixin_29305337的博客 456

互联网架构中的八大流行技术

软件开发技术日新月异,流行的技术三五年就换一茬,目前在企业架构中都流行哪些技术呢,小编总结了一下!spring boot采用约定优于配置的原则实现的一个可以快速搭建项目的框架,搭建一个WEB服务器也就是分分钟的事情!并且有非常强大的生态圈,如:spring boot + mybatis、redis、mongoDb、rabbitMQ、elasticsearch等等。spring cloud基于spr...

weixin_33804582的博客 1047

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

银河麒麟V10 SP1忘记密码?3分钟搞定单用户模式密码重置(附详细截图)

本文详细介绍了银河麒麟V10 SP1操作系统忘记登录密码后的应急恢复方法。核心是通过GRUB引导菜单进入单用户模式,无需密码即可获得root权限,从而快速重置用户密码。文章提供了从捕捉GRUB界面、编辑启动参数到执行密码修改命令的完整步骤图解与常见问题解决方案,帮助用户在几分钟内恢复系统访问。

w3x4y的博客 916

zookeeper学习之三(Curator客户端)

Curator框架是最好用,最流行的zookeeper的客户端。 它有以下三个优点 1.提供了一套非常友好的操作API; 2. 提供一些高级特性(包括但不仅限于前篇文章中提到的)的封装 3.易测试   maven依赖如下   &lt;dependency&gt; &lt;groupId&gt;org.apache.curator&lt;/groupId&gt; ...

iteye_4416的博客 916

麒麟V10系统下CoreDump文件自动归档与快速定位指南(附coredumpctl实战)

本文详细介绍了在麒麟V10操作系统下,如何利用systemd-coredump机制和coredumpctl工具实现CoreDump文件的自动化管理与高效调试。内容涵盖从系统架构解析、自动化配置策略,到使用coredumpctl进行快速查询、过滤与深度分析的实战指南,旨在帮助运维人员和开发者快速定位系统崩溃的根本原因,提升问题排查效率。

gg901的博客 222

ZooKeeper分布式锁

maven配置 org.apache.curator curator-framework 2.8.0 org.apache.curator curator-recipes 2.8.0 Curator框架是最好用,最流行的zookeeper的客户端。 它有以下三个优点 1.提供了一套非常友好的操作API; 2. 提供一些高级特性(包括但不仅限于前篇文章中

爱吃鱼油 378

C语言实验——各位数字之和排序

C语言实验——各位数字之和排序Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description给定n个正整数,根据各位数字之和从小到大进行排序。 Input输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面...

aiLMengi000的博客 1243

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式

揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。

weixin_42520239的博客 251

Dubbo和Zookeeper集成

缺点: 1、性能扩展比较难 2、协同开发问题 3、不利于升级维护 步骤解析: RPC两个核心模块:通讯,序列化。 <!--dubbo--> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-start...

豪华的博客 754

如何给数据添加高斯白噪声?

首先测试集应该是加噪声的,至于训练集需不需要加噪声就见仁见智了。我个人测试的结果是,训练集如果不加噪声的话效果特别差,如果加噪声的话效果就比较好接受,大家可以自己试试看。在轴承故障研究中免不了要涉及到给数据主动加入噪声的情况,一般我们加的是高斯白噪声。由于热噪声是由大量自由电子的运动产生的,其统计特性服从高斯分布,故常将热噪声称为高斯白噪声。的频谱是均匀分布的,好像白光的频谱在可见光的频谱范围内均匀分布那样,所以热噪声又常称为。定义一:如果一个噪声,它的瞬时值服从。又是均匀分布的,则称它为高斯白噪声。

weixin_50642818的博客 5220

Zookeeper-开源客户端

ZkClient ZkClient是Github上⼀个开源的zookeeper客户端,在Zookeeper原⽣API接⼝之上进⾏了包装,是⼀个更易⽤的Zookeeper客户端,同时,zkClient在内部还实现了诸如Session超时重连、Watcher反复注册等功能。 接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等⽅⾯来介绍如何使⽤zkClient这个zookeeper客户端。 添加依赖: 在pom.xml⽂件中添加如下内容 <dependency> <groupId

jiqiren1994的博客 371

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Dubbo】Dubbo整合Zookeeper

记录自己学习dubbo的智障过程

qq_45888932的博客 2384

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

5-ZooKeeper客户端使用

zookeeper的客户端其实是一个服务程序,他提供了各种api,有很多客户端是根据api做了可视化界面的。我们来看看Java客户端能使用的api是什么样的。 Java客户端分类 1、原生Java client <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3

诗人不写诗 309

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Zookeeper开源客户端Curator

Curator介绍: Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基础上进行封装、实现一些开发细节,包括接连重连、反复注册Watcher和NodeExistsException等。目前已经作为Apache的顶级项目出现,是最流行的Zookeeper客户端之一。从编码风格上来讲,它提供了基于...

qq_36250202的博客 266

Dubbo框架+zookeeper详解

Dubbo :是一个RPC框架,SOA框架: Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式 作为SOA:具有服务治理功能,提供服务的注册和发现,用zookeeper实现注册中心,启动时候服务端会把所有接口注册到注册中心,并且订阅configurat

qq_22162093的博客 1万+

服务框架Dubbo和ZooKeeper

本篇为动物园之旅~ dubbo看作动物园的动物,那么zookeeper就是动物园 如果有人想去动物园看小老虎,那么动物园中有小老虎才能看到,否则看不到~

m0_66689823的博客 7187

新人一看就懂:Dubbo+Zookeeper的RPC远程调用框架demo

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现

程序员云帆哥的博客 4866
上一篇: 怒冲GitHub榜首!京东T8幕后打造高并发面试手册,狂虐阿里面试官
下一篇: Github标星30k+,阿里内部的《Java快速学习指南》,肝了!
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值