Zookeeper 学习-Eclipse+Maven+GIT定制应用

Zookeeper 学习-定制ZK应用

摘要

在这里插入图片描述

GIT初始化

Linux环境配置

用于GIT私有仓库及GIT客户端使用
安装Git

yum install -y git

注意:目前操作需要在root用户下
也可以到官方的镜像下载想要的版本,自行构建
https://mirrors.edge.kernel.org/pub/software/scm/git/

安装完后检查版本

git versión

输出如下即可

git version 2.18.2

新增GIT用户

adduser aliyungit

设置GIT用户密码

echo “aliyungit:aliyungit | chpasswd

禁用shell登录
基于安全考虑,git用户不允许SSH登录,修改/etc/passwd文件中GIT用户设置

vi /etc/passwd

将/bin/bash更改为/usr/bin/git-shell

aliyungit:x:1000:1000::/home/aliyungit:/bin/bash
改为:
aliyungit:x:1000:1000::/home/aliyungit: /usr/bin/git-shell

注意: git用户可以通过ssh使用git,但无法登录shell, git-shell每次一登录就自动退出。

SSH客户端验证连接,格式如下
ssh账号名@服务器IP COMMAND

ssh aliyungit@localhost ls -ltr /home/aliyungit/test.git

第一次连接有警告,输入yes继续。如果可以连接上,说明 ssh连接正常。

GIT私有仓库初始化

切换到git用户

su – aliyungit

创建私有仓库路径进入用户目录,将git目录设置成为git用户所有

mkdir /home/aliyungit/myserver.git

初始化git仓库

git init –bare

输出如下,表示成功

Initialized empty Git repository in /home/aliyungit/myserver.git

初始化完成后,Eclipse GIT客户端就使用此仓库,上传或下载代码。
注意:git命令—bare参数,在当前目录创建一个裸仓库,没有工作区的文件,其次此目录仅用于存储仓库的历史版本等数据。

GIT Window客户端环境配置

用于Eclipse开发工具使用
在Eclipse工具中指定创建RSA Key,当前环境使用SSH方式连接GIT
在Eclipse菜单Preferences中,指向General->Network Connection->SSH2->Key Management标签,点击Generate RSA Key按钮,生成证书

生成证书文件会在General标签中指定目录产生,如图中c:\users\user1.ssh

找到目录中将目录中后缀pub文件,如id_rsa.pub

将目录中后缀pub文件复制到LINUX GIT主机上,通过SFTP上传到Linux GIT主机上,路径在/home/aliyungit/.ssh目录下,文件名称改名为win_id_rsa.pub

登录LINUX GIT主机, 切换到aliyungit用户

su - aliyungit

进入.ssh目录

cd /home/aliyungit/.ssh

将window环境中私钥文件内容追加到authorized_keys文件

cat win_id_rsa.pub >> authorized_keys

LINUX环境中,调整SSH参数
部分LINUX环境需要设置SSH参数来开启RSA认证

vi /etc/ssh/sshd_config

确认以下三个参数设置,如有行首有字符”#”代表注释没有设置,需要去除行首注释”#”。

RSAAuthentication yes     
PubkeyAuthentication yes     
AuthorizedKeysFile  .ssh/authorized_keys

在window环境中,使用SSH客户端验证连接,格式如下
ssh账号名@服务器IP 命令

ssh aliyungit@localhost ls -ltr /home/aliyungit/test.git

注意:第一次连接有警告,输入yes继续。如果可以连接上,说明 ssh连接正常。
如果window没有安装SSH客户端,请安装SSH工具后再来测试。

GIT Window 客户端存储库配置

用于在Eclipse开发工具中开发代码,上传到GIT私有仓库
在Eclipse中,打开Window->Perspective->OpenPerspective->Other

在打开窗口中,选择Git后,点击Open

打开GitRepositories中,点击Clone a Repository

输入Linux GIT远程私有仓库地址

配置完成后,可以在GitRepositories看到新建Git仓库

Maven初始化

Window环境配置

用于Eclipse开发工具中开发代码
设置Maven存储库,加入aliyun 存储库,
在用户路径下子目录.m2中,增加文件setting.xml
C:\Users\USER1.m2
配置文本内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
  </pluginGroups>

  <proxies>
  </proxies>

  <servers>
  </servers>

  <mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

  </mirrors>

  <profiles>
    <profile>
      <id>jdk-1.8</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
  </profiles>
</settings>

在Eclipse菜单Preferences中,指向General->Maven->User Setting中,设置Global Setting以及User Setting输入框,完成后点击Update Setting

在Eclipse菜单栏中,子菜单Show View 中选择 Other

在弹出对话框选择Maven Repositories,

在存储库树视图中,可以看到新增的全局存储库

Linux环境配置

下载安装包

wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz 

解压安装包到执行路径

tar -xvf apache-maven-3.6.3-bin.tar.gz  -C /oss/apache-maven-3.6.3

设置环境变量的配置文件,修改profile文件

vim /etc/profile

新增以下五行

export JAVA_HOME=/etc/alternatives/java_sdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export MAVEN_HOME=/oss/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH

重新刷新配置文件,即时生效修改的设置

source /etc/profile

验证是否安装

mvn -version

输出结果如下

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /oss/apache-maven-3.6.3
Java version: 1.8.0_252, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-147.5.1.el8_1.x86_64", arch: "amd64", family: "unix"

设置Maven存储库,加入aliyun 存储库,
在用户home路径下子目录.m2中,增加文件setting.xml

vi /root/.m2/settings.xml

配置文本内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
  </pluginGroups>

  <proxies>
  </proxies>

  <servers>
  </servers>

  <mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

  </mirrors>

  <profiles>
    <profile>
      <id>jdk-1.8</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
  </profiles>
</settings>

Zookeeper测试应用

Window Eclipse开发

新建Maven项目
在Eclipse中如何创建Maven项目
创建Maven项目
打开菜单栏中New子菜单中MavenProject

勾选Create a Simple project (skip archetype selection),点击下一步

在GroupId输入名称,类似于集合或PackageName
在ArtifaceId输入当前项目名称,类似与WAR项目名称
点击完成Finish完成按钮

Eclipse会自动创建一个Maven项目,项目图标中会显示“m”字样,同时会创建一个pom.xml文件

pom.xml文件指定依赖包应用关系,具体内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.zc.test.zookeeper</groupId>
	<artifactId>Demo1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.6.1</version>
		</dependency>
	</dependencies>
   </project>

文件用Eclipse工具打开之后的图形配置界面

如果pom.xml发生更改,选中项目后打开右键菜单,Maven中选择子菜单Update Project即可

在弹出窗口中选择项目后,点击OK按钮

定制测试代码

编写Test.java,
调用Zookeeper缺省API

package com.zc.demo.zookeeper;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooKeeper.States;




public class Test {

	
    // 会话超时时间,设置为与系统默认时间一致
    private static final int SESSION_TIMEOUT = 30 * 1000;

    // 创建 ZooKeeper 实例
    private ZooKeeper zk;

    // 创建 Watcher 实例
    private Watcher wh = new Watcher() {
        /**
         * Watched事件
         */
        public void process(WatchedEvent event) {
            System.out.println("WatchedEvent >>> " + event.toString());
        }
    };

    // 初始化 ZooKeeper 实例
    private void createZKInstance() throws IOException {
        // 连接到ZK服务,多个可以用逗号分割写
        zk = new ZooKeeper("localhost:2181,localhost:2182,localhost:2183", Test.SESSION_TIMEOUT, this.wh);
        if(!zk.getState().equals(States.CONNECTED)){
            while(true){
                if(zk.getState().equals(States.CONNECTED)){
                    break;
                }
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void ZKOperations() throws IOException, InterruptedException, KeeperException {
        System.out.println("\n1. Create ZooKeeper Node (znode : zoo2, Data: myData2 ,Permissions: OPEN_ACL_UNSAFE ,NodeType: Persistent");
        zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        System.out.println("\n2. See whether to create success: ");
        System.out.println(new String(zk.getData("/zoo2", this.wh, null)));// 添加Watch

        // 前面一行我们添加了对/zoo2节点的监视,所以这里对/zoo2进行修改的时候,会触发Watch事件。
        System.out.println("\n3. Go to modify the node data ");
        zk.setData("/zoo2", "shanhy20160310".getBytes(), -1);

        // 这里再次进行修改,则不会触发Watch事件,这就是我们验证ZK的一个特性“一次性触发”,也就是说设置一次监视,只会对下次操作起一次作用。
        System.out.println("\n3-1. Modify the node data again ");
        zk.setData("/zoo2", "shanhy20160310-ABCD".getBytes(), -1);

        System.out.println("\n4. See if modified successfully: ");
        System.out.println(new String(zk.getData("/zoo2", false, null)));

        System.out.println("\n5. Remove nodes ");
        zk.delete("/zoo2", -1);

        
        System.out.println("\n6. Check to see if the node is removed: ");
        System.out.println(" Node State: [" + zk.exists("/zoo2", false) + "]");
    }

    private void ZKClose() throws InterruptedException {
        zk.close();
    }

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        Test dm = new Test();
        dm.createZKInstance();
        dm.ZKOperations();
        dm.ZKClose();
    }
}

编写ZkClientTest.java

调用Zookeeper第三方方法库I0Itec.zkclient

package com.zc.demo.zookeeper;

import java.util.List;
import java.util.concurrent.TimeUnit;

import org.I0Itec.zkclient.DataUpdater;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.IZkStateListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;

/**
 */
public class ZkClientTest {

    public static void main(String[] args) {
        ZkClient zkClient = new ZkClient("localhost:2181,localhost:2182,localhost:2183");
        String node = "/myapp";

        // 订阅监听事件
        childChangesListener(zkClient, node);
        dataChangesListener(zkClient, node);
        stateChangesListener(zkClient);

        if (!zkClient.exists(node)) {
            zkClient.createPersistent(node, "hello zookeeper");
        }
        System.out.println(zkClient.readData(node).toString());
        
        zkClient.updateDataSerialized(node, new DataUpdater<String>() {

            public String update(String currentData) {
                return currentData + "-123";
            }
        });
        System.out.println(zkClient.readData(node).toString());

        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 订阅children变化
     *
     * @param zkClient
     * @param path
     * @author SHANHY
     * @create  2016年3月11日
     */
    public static void childChangesListener(ZkClient zkClient, final String path) {
        zkClient.subscribeChildChanges(path, new IZkChildListener() {

            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                System.out.println("clildren of path " + parentPath + ":" + currentChilds);
            }

        });
    }

    /**
     * 订阅节点数据变化
     *
     * @param zkClient
     * @param path
     * @author SHANHY
     * @create  2016年3月11日
     */
    public static void dataChangesListener(ZkClient zkClient, final String path){
        zkClient.subscribeDataChanges(path, new IZkDataListener(){

            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println("Data of " + dataPath + " has changed.");
            }

            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println("Data of " + dataPath + " has changed.");
            }

        });
    }

    /**
     * 订阅状态变化
     *
     * @param zkClient
     * @author SHANHY
     * @create  2016年3月11日
     */
    public static void stateChangesListener(ZkClient zkClient){
        zkClient.subscribeStateChanges(new IZkStateListener() {

            public void handleStateChanged(KeeperState state) throws Exception {
                System.out.println("handleStateChanged");
            }

            public void handleSessionEstablishmentError(Throwable error) throws Exception {
                System.out.println("handleSessionEstablishmentError");
            }

            public void handleNewSession() throws Exception {
                System.out.println("handleNewSession");
            }
        });
    }
}

放入GIT仓库

其后,将应用加入到Git仓库,选中应用后,在右键菜单中,选择Team->ShareProject

在弹出窗口中,Repository的下拉菜单中选择新建仓库后,点击Finish

OpenPerspective中打开在Git ,进入Git Staging中,选择所有Unstaged Changes,点击添加

输入CommitMessage后,点击Commit and Push

Linux GIT客户端同步

从GIT私有仓库下载代码到Linux环境运行
初始化本地仓库
创建git本地仓库路径

mkdir /oss/eclipse-ws

从远程获取最新版本并merge到本地,执行git pull命令

cd /oss/eclipse-ws
git clone aliyungit@127.0.0.1:/home/aliyungit/myserver.git

注意:路径必须是新建路径
语法如下
git clone 用户名@服务器IP:/相对用户根目录的git仓库绝对路径/git仓库名.git

GIT Linux抓取最新

从远程获取最新版本并merge到本地
在”.git”平级目录下,执行git pull命令

cd /oss/eclipse-ws/myserver
git pull

在提示中输入用户密码

aliyungitliyungit@127.0.0.1's password:

输出日志

remote: Enumerating objects: 39, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 28 (delta 10), reused 0 (delta 0)
Unpacking objects: 100% (28/28), done.
From 127.0.0.1:/home/aliyungit/myserver
   19106be..0a897ff  master     -> origin/master
Updating 19106be..0a897ff
Fast-forward
 DemoZK1/pom.xml                                    | 118 +++++++++-----
 .../src/main/java/com/zc/demo/zookeeper/Test.java  | 180 ++++++++++-----------
 2 files changed, 166 insertions(+), 132 deletions(-)

注意: 在”.git”平级目录下执行
可以检查DemoZK1/pom.xml 文件内容,已经与Eclipse开发中同步。

Linux Maven打包

在应用目录放置pom.xml文件的目录下,执行mvn package

cd /oss/eclipse-ws/myserver/DemoZK1
mvn package

输出如下

[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.zc.test.zookeeper:Demo1:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 43, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] --------------------< com.zc.test.zookeeper:Demo1 >---------------------
[INFO] Building Demo1 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom (11 kB at 4.8 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.jar (153 kB at 44 kB/s)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Demo1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /oss/eclipse-ws/myserver/DemoZK1/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Demo1 ---
[INFO] Changes detected - recompiling the module!
…
…
[INFO] Copying zookeeper-3.6.1.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/zookeeper-3.6.1.jar
[INFO] Copying netty-resolver-4.1.48.Final.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/netty-resolver-4.1.48.Final.jar
[INFO] Copying netty-transport-native-epoll-4.1.48.Final.jar to /oss/eclipse-ws/myserver/DemoZK1/target/lib/netty-transport-native-epoll-4.1.48.Final.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:44 min
[INFO] Finished at: 2020-06-09T23:52:23+08:00
[INFO] ------------------------------------------------------------------------

注意:在应用目录放置pom.xml文件的目录下,

打包仅应用类pom.xml

打包仅包括应用类,不包括依赖包,依赖包下载到目录中,运行时指定查找

<build>
     <plugins>
       <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> 
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <configuration>  
                <archive>  
                    <manifest>  
                        <addClasspath>true</addClasspath>  
                        <classpathPrefix>lib/</classpathPrefix>  
                        <mainClass>com.zc.demo.zookeeper.Test</mainClass>  
                    </manifest>  
                </archive>  
            </configuration>  
        </plugin>  
        <!-- 拷贝依赖的jar包到lib目录 -->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
            <executions>  
                <execution>  
                    <id>copy</id>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>copy-dependencies</goal>  
                    </goals>  
                    <configuration>  
                        <outputDirectory>  
                            ${project.build.directory}/lib  
                        </outputDirectory>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
                  
    </plugins>
</build>	

检查打包文件

打包命令,会在应用目录创建子目录target,并创建打包jar文件,如” Demo1-0.0.1-SNAPSHOT.jar”

[root@cloudhost DemoZK1]#cd /oss/eclipse-ws/myserver/DemoZK1
[root@cloudhost DemoZK1]# ls -ltr /oss/eclipse-ws/myserver/DemoZK1/target
total 12
drwxr-xr-x 3 root root   35 Jun 10 00:07 maven-status
drwxr-xr-x 3 root root   25 Jun 10 00:07 generated-sources
drwxr-xr-x 3 root root   17 Jun 10 00:07 classes
drwxr-xr-x 2 root root   28 Jun 10 00:07 maven-archiver
-rw-r--r-- 1 root root 5368 Jun 10 00:07 Demo1-0.0.1-SNAPSHOT.jar
drwxr-xr-x 2 root root 4096 Jun 10 00:07 lib

注意:在应用目录创建子目录target,以及打包文件

打包jar文件内部文件MANIFEST.MF 指定相关信息,路径如下

Demo1-0.0.1-SNAPSHOT.jar ->META-INF->MANIFEST.MF

MANIFEST.MF文件内容如下

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: root
Class-Path: lib/zookeeper-3.6.1.jar lib/commons-lang-2.6.jar lib/zooke
 eper-jute-3.6.1.jar lib/audience-annotations-0.5.0.jar lib/netty-hand
 ler-4.1.48.Final.jar lib/netty-common-4.1.48.Final.jar lib/netty-reso
 lver-4.1.48.Final.jar lib/netty-buffer-4.1.48.Final.jar lib/netty-tra
 nsport-4.1.48.Final.jar lib/netty-codec-4.1.48.Final.jar lib/netty-tr
 ansport-native-epoll-4.1.48.Final.jar lib/netty-transport-native-unix
 -common-4.1.48.Final.jar lib/slf4j-api-1.7.25.jar lib/slf4j-log4j12-1
 .7.25.jar lib/log4j-1.2.17.jar
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_252
Main-Class: com.zc.demo.zookeeper.Test

Linux运行测试

Test.java运行测试
在应用目录子目录target,启动打包文件应用验证

[root@cloudhost target]# cd /oss/eclipse-ws/myserver/DemoZK1/target
[root@cloudhost target]# java -jar Demo1-0.0.1-SNAPSHOT.jar
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
WatchedEvent >>> WatchedEvent state:SyncConnected type:None path:null

1. Create ZooKeeper Node (znode �� zoo2, Data�� myData2 ��Permissions�� OPEN_ACL_UNSAFE ��NodeType�� Persistent

2. See whether to create success��
myData2

3. Go to modify the node data
WatchedEvent >>> WatchedEvent state:SyncConnected type:NodeDataChanged path:/zoo2

3-1. Modify the node data again

4. See if modified successfully��
shanhy20160310-ABCD

5. Remove nodes

6. Check to see if the node is removed��
 Node State�� [null]
WatchedEvent >>> WatchedEvent state:Closed type:None path:null

注意:在应用目录子目录target

ZKclient运行测试

执行应用验证

[root@cloudhost target]# java -jar Demo1-0.0.1-SNAPSHOT.jar
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
clildren of path /myapp:[]
Data of /myapp has changed.
hello zookeeper
hello zookeeper-123
Data of /myapp has changed.

注意:在应用目录子目录target

Zkclient对应pom.xml

与前一个pom.xml区别不大,主要新增依赖包zkclient,

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.11</version>
</dependency>		

以及调整mainclass为ZkClientTest

<mainClass>com.zc.demo.zookeeper.ZkClientTest</mainClass>  

报错处理

Maven -No compiler is provided in this environment

编译时可能提示如下报错

 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project Demo1: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

解决方法:增加环境变量执行JDK路径
设置环境变量的配置文件,修改profile文件

vim /etc/profile

新增以下三行

export JAVA_HOME=/etc/alternatives/java_sdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

重新刷新配置文件,即时生效修改的设置

source /etc/profile

附加

Maven常用命令

1. 创建Maven的普通java项目: 
mvn archetype:create 
-DgroupId=packageName    
-DartifactId=projectName 

2. 创建Maven的Web项目:   
mvn archetype:create 
-DgroupId=packageName    
-DartifactId=webappName 
-DarchetypeArtifactId=maven-archetype-webapp    

3. 编译源代码: mvn compile 

4. 编译测试代码:mvn test-compile    

5. 运行测试:mvn test 

6. 产生site:mvn site   

7. 打包:mvn package   

8. 在本地Repository中安装jar:mvn install 

9. 清除产生的项目:mvn clean   

10. 生成eclipse项目:mvn eclipse:eclipse  

11. 生成idea项目:mvn idea:idea  

12. 组合使用goal命令,如只打包不测试:mvn -Dtest package   

13. 编译测试的内容:mvn test-compile  

14. 只打jar包: mvn jar:jar  

15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile 
      ( -skipping 的灵活运用,当然也可以用于其他组合命令)  

16. 清除eclipse的一些系统设置:mvn eclipse:clean

17. 获取依赖包: mvn dependency:get -DremoteRepositories=http://repo1.maven.org/maven2/ \
                   -DgroupId=junit -DartifactId=junit -Dversion=4.8.2 \
                   -Dtransitive=false -Ddest=./

GIT常用命令

专用名词的译名如下。
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

一、新建代码库

# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]

二、配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

三、增加/删除文件

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

四、代码提交

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

五、分支

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

# 本地存在一个分支,名称叫:develop_chen,但远程没有怎么办?

git push origin develop_chen

这样就在远程建立一个和本地一样的分支 

git branch --set-upstream-to=origin/develop  develop  本地分支和远程分支简历跟踪关系

六、标签

# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

七、查看信息

# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的代码差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

# 从本地master拉取代码更新当前分支:branch 一般为master
$ git rebase [branch]

八、远程同步

$ git remote update  --更新远程仓储
# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

九、撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

十、用户名操作:

# 查看用户名:
$ git config user.name
 
# 查看用户邮箱:
$ git config user.email
 
# 修改命令:
# 修改用户名:
$ git config --global user.name "Your_username"
 
# 修改用户邮箱:
$ git config --global user.email "Your_email"

十 一、其他(合并两个分支:Merge)

1,将开发分支代码合入到master中

git checkout dev           #切换到dev开发分支
git pull
git checkout master
git merge dev              #合并dev分支到master上
git push origin master     #将代码推到master上

2,将master的代码同步更新到开发分支中

merge方法:保证主干提交线干净(可以安全回溯)

git checkout master
git pull
git checkout dev
git merge master
git pull origin dev
 # 生成一个可供发布的压缩包
 $ git archive

参考链接

Zookeeper的集群配置和Java测试程序

https://blog.csdn.net/catoop/article/details/50848555
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值