Zookeeper 的使用,Zookeeper客户端 Curator的使用
1、ZooKeeper的节点服务挂掉后,就要进行选举,必须有一台主其他的都是从,虽然服务最终会恢复,但在选举期间注册服务是不可用的。这里保证的是CAP理论中的 C
2、Eureka各个节点是平等关系,任何节点挂掉,只要还有一台服务是正常的,就可以保证服务可用。数据都是最新的,如果查询到的数据不是最新的,就是因为eureka的自我保护机制导致的。 这里保证的是CAP理论中的 A。
所以 Eureka保证的AP,Zookeeper保证的CP。
a. 先下载zk,然后在本地启动zk
b. 通过Zookeeper Curator 客户端完成数据的读写功能,如下代码
package com.simulate.register;
import com.alibaba.fastjson.JSONObject;
import com.simulate.framework.URL;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ZookeeperRegister {
static CuratorFramework client;
static {
client = CuratorFrameworkFactory
.newClient("localhost:2181", new RetryNTimes(3, 1000));
client.start();
}
private static Map<String, List<URL>> REGISTER = new HashMap<>();
public static void regist(String interfaceName, URL url) {
try {
String result = client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(String.format("/dubbo/service/%s/%s", interfaceName, JSONObject.toJSONString(url)), null);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<URL> get(String interfaceName) {
List<URL> urlList = new ArrayList<>();
try {
List<String> result = client.getChildren().forPath(String.format("/dubbo/service/%s", interfaceName));
for (String urlstr : result) {
urlList.add(JSONObject.parseObject(urlstr, URL.class));
}
REGISTER.put(interfaceName, urlList);
} catch (Exception e) {
e.printStackTrace();
}
return urlList;
}
}
package com.simulate.framework;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class URL implements Serializable {
private String hostname;
private Integer port;
}
main方法展示:
public static void main(String[] args) {
// 注册服务
URL url = new URL("localhost", 2181);
// 1. 这是启用 zk后,从zk中获取调用地址。 需要启动zk服务,本地集成zk客户端去访问zk服务
ZookeeperRegister.regist(HelloService.class.getName(), url);
List<URL> urls = ZookeeperRegister.get(HelloService.class.getName());
System.out.println(urls);
}
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.simulate</groupId>
<artifactId>simulate</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.16.Final</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.12</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
</dependencies>
</project>