使用 Zookeeper 的 Api 实现服务订阅
服务提供者中拷贝 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 实现服务订阅的更多相关文章
- 使用 Zookeeper 的 Api 实现服务注册
创建常量接口 com.bjsxt.constant.Constants package com.bjsxt.constant; public interface Constants { //访问Zoo ...
- (原) 2.1 Zookeeper原生API使用
本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1.jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中 <dependency> & ...
- Zookeeper C API 指南四(C API 概览)(转)
上一节<Zookeeper C API 指南三(回调函数)>重点讲了 Zookeeper C API 中各种回调函数的原型,本节将切入正题,正式讲解 Zookeeper C API.相信大 ...
- Zookeeper C API 指南一(转)
Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...
- ZooKeeper -- 分布式开源协调服务
ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等服务.ZooKeeper支持Java和C两种编程 ...
- 基于.NET CORE微服务框架 -Api网关服务管理
1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...
- 9. 使用ZooKeeper Java API编程
ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...
- Zookeeper Windows版的服务安装和管理工具
以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈).然后遇到了多个一模一样但是同时运行的服务.不同服务但依赖同相同的配置数据(前端网页服务:Nginx+IIS+nodejs. ...
- Hadoop生态圈-zookeeper的API用法详解
Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...
随机推荐
- 关于GDAL读写Shp乱码的问题总结
目录 1. 正文 1.1. shp文件本身的编码的问题 1.2. 设置读取的编码方式 1.2.1. GDAL设置 1.2.2. 解码方式 1.2.3. 其他 2. 参考 1. 正文 最近在使用GDAL ...
- nyoj 35-表达式求值(stack, 栈的应用)
35-表达式求值 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:37 submit:53 题目描述: ACM队的mdd想做一个计算器,但是,他要做的 ...
- nyoj 283-对称排序 (sort)
283-对称排序 内存限制:64MB 时间限制:1000ms 特判: No 通过数:2 提交数:4 难度:1 题目描述: In your job at Albatross Circus Managem ...
- 类加载器 - ClassLoader详解
获得ClassLoader的途径 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread ...
- linux文件时间
Linux 查看文件修改时间(精确到秒)(简单) ls --full-time 查看文件时间戳命令:stat test.txt linux 下查看文件修改时间 等(详细) 查看文件时间戳命令:stat ...
- Vue 指令总结大全
1.v-text v-text主要用来更新textContent. <p>{{msg}}</p>与<p v-text="msg2"></p ...
- Java数组使用以及foreach循环
Java数组使用以及foreach循环 二话不说,先甩一个简单的程序: final int NUM= 10; int[] arrays = new int[NUM]; System.out.print ...
- Scala学习系列一
一 scala介绍 Scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. 1) Scala 是一门多范式 (multi-parad ...
- 【设计模式大法】Iterator模式
Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...
- 使用vuecli3发布npm包
一.使用vuecli3创建项目 vue create svgicon 二.修改目录,开发组件前的准备 把src目录改为examples作为查看组件的演示目录,新建packages目录作为组件编写的目录 ...