内容简介:回顾下zk应用场景:再来看看zk在服务注册与发现中的应用:
zookeeper应用场景
回顾下zk应用场景:
- 数据发布与订阅
- 服务注册与发现
- 分布式锁
- 分布式队列
- master选举
- 配置中心
- 命名服务
- 负载均衡
zookeeper实现服务注册与发现
服务注册与发现
再来看看zk在服务注册与发现中的应用:
代码实现逻辑:
服务注册:
public class ServiceRegister {
private static final String BASE_SERVICES = "/services";
private static final String SERVICE_NAME="/products";
public static void register(String address,int port) {
try {
ZooKeeper zooKeeper = new ZooKeeper("localhost:2181",5000,(watchedEvent)->{});
Stat exists = zooKeeper.exists(BASE_SERVICES + SERVICE_NAME, false);
if(exists==null) {
zooKeeper.create(BASE_SERVICES + SERVICE_NAME,"".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
String server_path = address+":"+port;
//创建的临时的有序节点
//临时的话断开连接了可以监听到,有序节点创建代表每一个节点否则相同节点名称无法创建
zooKeeper.create(BASE_SERVICES + SERVICE_NAME+"/child",server_path.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("产品服务注册成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
发现服务:
public class InitListener implements ServletContextListener {
private static final String BASE_SERVICES = "/services";
private static final String SERVICE_NAME="/products";
private ZooKeeper zooKeeper;
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
zooKeeper = new ZooKeeper("localhost:2181",5000,(watchedEvent)->{
if(watchedEvent.getType() == Watcher.Event.EventType.NodeChildrenChanged && watchedEvent.getPath().equals(BASE_SERVICES+SERVICE_NAME)) {
updateServiceList();
}
});
updateServiceList();
} catch (Exception e) {
e.printStackTrace();
}
}
private void updateServiceList() {
try{
List<String> children = zooKeeper.getChildren(BASE_SERVICES + SERVICE_NAME, true);
List<String> newServerList = new ArrayList<String>();
for(String subNode:children) {
byte[] data = zooKeeper.getData(BASE_SERVICES + SERVICE_NAME + "/" + subNode, false, null);
String host = new String(data, "utf-8");
System.out.println("host:"+host);
newServerList.add(host);
}
//保存注册服务的ip端口信息,以供远程rpc调用
LoadBalance.SERVICE_LIST = newServerList;
}catch (Exception e) {
e.printStackTrace();
}
}
}
public abstract class LoadBalance {
public volatile static List<String> SERVICE_LIST;
public abstract String choseServiceHost();
}
/**
* 随机负载均衡算法
*/
public class RamdomLoadBalance extends LoadBalance {
@Override
public String choseServiceHost() {
String result = "";
if(!CollectionUtils.isEmpty(SERVICE_LIST)) {
int index = new Random().nextInt(SERVICE_LIST.size());
result = SERVICE_LIST.get(index);
}
return result ;
}
}
再讲讲几个关键点
1.注册服务的时候需要创建临时节点,断开连接的时候也就是服务端挂了后节点删除可监听到
2.注册服务的时候创建的是有序节点,一般来说相同服务都是有几台机器的,创建顺序节点可区分多台机器的服务
3.发现服务的一端监听服务节点的子节点,有子节点被删除了或者有新子节点创建即重新发现服务可用的机器
dubbo中基于zk的服务注册与发现也是这个原理
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring Cloud实战系列(一) - 服务注册与发现Eureka
- Kubernetes首个严重安全漏洞发现者,谈发现过程及原理机制
- 服务发现之Consul
- 服务发现-注册中心概述
- 四层发现
- 问题发现定位
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
银行3.0:移动互联时代的银行转型之道
[澳]布莱特·金(Brett King) / 白 宫 施 轶 / 广东经济出版社 / 2014-12 / 88.00元
银行未来会怎样,银行下一步该怎么做?银行如何在客户行为变化、科技变化,以及新的非银行竞争者不断涌入等时代变化的形势下,在未来取得成功? 这是第一本透彻深入地全面呈现当今银行业的内外形势与状况的书,内容涉及技术变化、客户行为变化、涌现的外部竞争者,银行现有组织架构、流程模式、制度思维、人员结构、互动渠道、营销方式等。具体包括低网点化,ATM、网站、呼叫中心的落伍,以及智能手机、社交媒体、移动支......一起来看看 《银行3.0:移动互联时代的银行转型之道》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
MD5 加密
MD5 加密工具