使用 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 ~] ...
随机推荐
- C语言变量名和地址的关系【转载】//基础的东西
原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...
- Zabbix日志监控插件
#!/usr/bin/env python # coding:utf-8 import re import os import sys import logging logging.basicConf ...
- windows中修改IP映射的位置
windows中修改IP映射的位置 置顶 2018年08月05日 14:42:44 wangxiaolong0 阅读数:1473 在安装linux之后,发现windows不能通过映射来访问linu ...
- element - ui tree
一行代码两行泪,没有外网真可怕!好久没写博客了,更新一把. <template> <div> <el-tree :data="data" :props ...
- Docker学习-Docker搭建Consul集群
1.环境准备 Linux机器三台 网络互通配置可以参考 https://www.cnblogs.com/woxpp/p/11858257.html 192.168.50.21 192.168.50.2 ...
- Feign 调用丢失Header的解决方案
问题 在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题. 解决方案 首先需要写一个 Feign请求拦截器,通 ...
- nyoj 66-分数拆分 (Java,暴力)
66-分数拆分 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:9 难度:1 题目描述: 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y ...
- nyoj 264-国王的魔镜 (string[-1:-int(str_len/2+1):-1])
264-国王的魔镜 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:25 难度:1 题目描述: 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜 ...
- requests模块发送带headers的Get请求和带参数的请求
1.在PyCharm开发工具中新建try_params.py文件: 2.try_params.py文件中编写代码: import requests#设置请求Headers头部header = {&qu ...
- 如何使用Sping Data JPA更新局部字段
问题描述 在更新数据时,有时候我们只需要更新一部分字段,其他字段保持不变.Spring Data JPA并未提供现成的接口,直接使用save()更新会导致其他字段被Null覆盖掉. 解决办法 通常有两 ...