服务提供者

服务提供者中拷贝 Constants

服务提供者中拷贝 UserService

连接 Zk 集群

/***
* 连接ZooKeeper集群
*/
public ZooKeeper connectZk() {
ZooKeeper zk = null;
try {
zk = new ZooKeeper(Constants.host, Constants.ZK_TIME_OUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 判断是否连接zk集群
if (event.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();//唤醒处于等待状态的连接
}
}
});
latch.await(); //使当前线程处于等待状态
} catch (Exception e) {
e.printStackTrace();
}
return zk;
}

注册 watcher

 /**
* 观察/provider节点中的数据是否有变化
*
* @param zk
*/
public void watchNode(ZooKeeper zk) {
try {
//观察/provider下面的结点是否有变化
List<String> nodelist = zk.getChildren(Constants.ZK_REGISTER, new Watcher() {
@Override
public void process(WatchedEvent event) {
//子节点发生变化
if (event.getType() == Event.EventType.NodeChildrenChanged) {
watchNode(zk);
}
}
});
//存放读取的地址数据
List<String> datalist = new ArrayList<>();
for (String node : nodelist) {
byte[] data = zk.getData(Constants.ZK_REGISTER + "/" + node, false, null);
datalist.add(new String(data));
}
//将datalist复制给urls
urls = datalist;
} catch (Exception e) {
e.printStackTrace();
}
}

获取远程服务

/**
* 获取rmi的远程服务对象
*/
public <T> T lookupService(String url) {
T remote = null;
try {
remote = (T) Naming.lookup(url);
} catch (Exception e) { if (e instanceof ConnectException) {
if (urls.size() != 0) {
url = urls.get(0);
return lookupService(url);
}
}
}
return remote;
}

随机获取远程服务

**
* 查找rmi服务,,通过随机算法,产生一个URL
*/
public <T extends Remote> T lookup() {
T service = null;
int size = urls.size();
if (size > 0) {
String url = null;
if (size == 1) {
url = urls.get(0);
} else {
//产生随机数
int random = ThreadLocalRandom.current().nextInt(size);
url = urls.get(random);
}
System.out.println("==========" + url);
service = lookupService(url);
}
return service;
}

创建无参数构造方法、

 public ServiceConsumer(){
ZooKeeper zk=connectZk();
if (zk!=null){
watchNode(zk);
}
}

创建启动类消费服务

package com.bjsxt.app;

import com.bjsxt.service.UserService;
import com.bjsxt.service.ServiceConsumer; import java.rmi.RemoteException; public class ZkClusterConsumerApp {
public static void main(String[] args) throws RemoteException, InterruptedException {
ServiceConsumer serviceConsumer=new ServiceConsumer();
while (true){
UserService userService=serviceConsumer.lookup();
//调用远程的方法
String result = userService.helloRem("zhangsan");
System.out.println("result= "+result);
Thread.sleep(3000);
}
}
}

使用 Zookeeper 的 Api 实现服务订阅的更多相关文章

  1. 使用 Zookeeper 的 Api 实现服务注册

    创建常量接口 com.bjsxt.constant.Constants package com.bjsxt.constant; public interface Constants { //访问Zoo ...

  2. (原) 2.1 Zookeeper原生API使用

    本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1.jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中 <dependency> & ...

  3. Zookeeper C API 指南四(C API 概览)(转)

    上一节<Zookeeper C API 指南三(回调函数)>重点讲了 Zookeeper C API 中各种回调函数的原型,本节将切入正题,正式讲解 Zookeeper C API.相信大 ...

  4. Zookeeper C API 指南一(转)

    Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...

  5. ZooKeeper -- 分布式开源协调服务

    ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等服务.ZooKeeper支持Java和C两种编程 ...

  6. 基于.NET CORE微服务框架 -Api网关服务管理

    1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...

  7. 9. 使用ZooKeeper Java API编程

    ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...

  8. Zookeeper Windows版的服务安装和管理工具

    以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈).然后遇到了多个一模一样但是同时运行的服务.不同服务但依赖同相同的配置数据(前端网页服务:Nginx+IIS+nodejs. ...

  9. Hadoop生态圈-zookeeper的API用法详解

    Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...

随机推荐

  1. nuxt.js 部署静态页面[dist]到gh-pages

    一. 1.添加package.json { "name": "nuxtweb001", "version": "1.0.0&quo ...

  2. win7设置docker默认服务端地址

    目录 win7设置docker默认服务端地址 1.开启docker远程访问 2.本地调整 2.1 docker.exe重命名 2.2 添加docker.bat 2.3 添加快速切换功能 3.使用验证 ...

  3. @resource和@autowired的区别是什么-CSDN论坛-CSDN.NET-中国最大的IT技术社区 - Google Chrome

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  4. Linux centos5.6版本下mysql5.6主从环境安装配置

    MySQL数据库支持数据库的主从复制功能,因此在集群方面具有其独特的优势,国内外大型网站架构体系中,均采用了MySQL的主从数据库配置来实现查询负载.数据库热备等功能.本人在此将如何配置实现做了个简单 ...

  5. spark集群搭建(三台虚拟机)——zookeeper集群搭建(3)

    !!!该系列使用三台虚拟机搭建一个完整的spark集群,集群环境如下: virtualBox5.2.Ubuntu14.04.securecrt7.3.6_x64英文版(连接虚拟机) jdk1.7.0. ...

  6. nyoj 45-棋盘覆盖 (高精度, Java)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  7. 笔记本进入BIOS设置

    转眼间,到大三了. 在学习<Red Hat Linux 服务器搭建与管理>这门课时,刚开学第一节,就是虚拟机,但是最烦恼的是我们笔记本电脑的默认设置,它把虚拟化给禁止了. 1,首先,我们需 ...

  8. css三大特效之优先级

    1.什么是优先级作用:当多个选择器选中同一个标签,并且给同一个标签设置相同的属性时,如何层叠就由优先级来确定

  9. c# 为什么会出现死锁?多线程死锁怎么解决

    出现死锁必须满足以下几个条件: 1.互斥条件:该进程拥有的资源,其他进程只能等待其释放. 2.不剥夺条件:该进程拥有的资源只能由它自己来释放. 3.请求和保持条件:请求其他的资源,同时自己拥有的资源又 ...

  10. 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)

    前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小. 本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理. Batch gradient d ...