服务提供者

服务提供者中拷贝 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. CAP的学习和应用

    性能优化真言:队列缓存分布式  异步调优堆配置 前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧 一.CAP使用场景? 平时工作中经常使用到MQ,如(kafka,rab ...

  2. 你了解MySQL中的锁吗?

    MySQL中的锁,分为全局锁.表级锁.行锁 全局锁 全局锁的意思就是,对整个数据库实例加锁,它的命令是FTWRL Flash tables with read lock 这个命令的语义是,使整个库处于 ...

  3. 小程序的基本概念-生命周期(组件 wxml)

    一.组件生命周期:一个组件从创建开始到使用中最后被销毁的过程 ---onLoad事件:组件(创建成功并且加载完成)触发一次 (1)当此事件触发发送请求获取数据 (2)获取其他组件传递数据(option ...

  4. mpvue+小程序云开发,纯前端实现婚礼邀请函(相册小程序)

    请勿使用本文章及源码作为商业用途! 前言 当初做这个小程序是为了婚礼前的需要,结婚之后,希望这个小程序能够留存下来,特地花了一些空闲时间将小程序转化成为“相册类小程序” 体验码 准备工作 mpvue框 ...

  5. T-SQL Part XI: Login Failed 18456 以及修改Authentication Mode

    这是一个很常见的场景,安装SQL Server时候选择了默认的Windows Authentication Only,然后使用中发现还是需要支持用户名/密码登录. 按照MSDN的文档,然而并没有多大作 ...

  6. 如何基于k8s快速搭建TeamCity(YAML分享)

    前言 最近有朋友基于之前的博客<Docker最全教程之使用TeamCity来完成内部CI.CD流程(十七)>搭建TeamCity时出现了一些问题,由于平常比较忙,没有及时答复,非常抱歉. ...

  7. springMVC-MyBatis-Mysql 环境下, 返回时间格式不是指定格式

    在数据库中的时间是: 比如: 2018-04-06:12;23:34. 但是mybatis查询出来以后是下面的格式. {"updatedTime":{"date" ...

  8. JenKins结合cppcheck及cpplint进行代码风格及静态代码检测

    JenKins结合cppcheck及cpplint 最近公司需要在Jenkins上安装cppcheck及cpplint进行代码风格及静态代码检测,这里记录下过程. 前提条件 安装了Jenkins 步骤 ...

  9. 安装Fedora后

    更新操作系统版本: https://fedoraproject.org/wiki/DNF_system_upgrade    靠谱: 设置ssh:ssh生成公钥私钥.默认root(.ssh/confi ...

  10. scrapy框架介绍及安装

    什么是scrapy框架? scrapy框架的安装 1.windowes下的安装 Python 2 / 3升级pip版本: pip install --upgrade pip 通过pip 安装 Scra ...