简单介绍一下zookeeper和netty
Netty:流行的NIO Socket通信框架,很多开源软件如hadoop tachyon spark都使用Netty作为底层通信框架
Zookeeper:分布式的,开放源码的分布式应用程序协调服务,hadoop hbase等开源分布式系统的重要组件
应用场景描述:
利用Zookeeper的服务注册与发现功能,实现Netty通信集群的简单高可用。
首先NettyServer端需要将服务注册到zookeeper中,代码如下
package com.zookeeper;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import com.constance.Constant;
public class ServiceRegistry {
private CountDownLatch latch = new CountDownLatch(1);
private String registryAddress;
public ServiceRegistry(String registryAddress) {
this.registryAddress = registryAddress;
}
//注册到zk中,其中data为服务端的 ip:port
public void register(String data) {
if (data != null) {
ZooKeeper zk = connectServer();
if (zk != null) {
createNode(zk, data);
}
}
}
private ZooKeeper connectServer() {
ZooKeeper zk = null;
try {
zk = new ZooKeeper(registryAddress, Constant.ZK_SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();
}
}
});
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
return zk;
}
private void createNode(ZooKeeper zk, String data) {
try {
byte[] bytes = data.getBytes();
String path = zk.create(Constant.ZK_DATA_PATH, bytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("create zookeeper node path:"+path+" data:"+data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
NettyServer端启动及调用注册服务的代码
package com.main;
import com.constance.Constant;
import com.netty.Server;
import com.zookeeper.ServiceRegistry;
public class ServerMain {
public static void main(String[] agrs){
int port = 9988;
//register service in zookeeper
ServiceRegistry zsr = new ServiceRegistry(Constant.registryAddress);
String serverIp = "123.123.123.123:9988";
zsr.register(serverIp);
//netty bind
new Server().bind(port);
}
}
NettyClient端启动时发现服务的代码
package com.main;
import com.constance.Constant;
import com.netty.Client;
import com.test.TestThread;
import com.zookeeper.ServiceDiscovery;
public class ClientMain {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
//find service from zookeeper
ServiceDiscovery sd = new ServiceDiscovery(Constant.registryAddress);
String serverIp = sd.discover();
String[] serverArr = serverIp.split(":");
System.out.println("ServerIP:"+serverArr[0]+" ServerPort:"+serverArr[1]);
String hostIP = "123.123.111.111";
int port = 9988;
new TestThread().test();
//Client.connect(hostIP, port);
Client.connect(serverArr[0], Integer.valueOf(serverArr[1]));
}
}
NettyClient中zk发现服务的方法
package com.zookeeper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import com.constance.Constant;
public class ServiceDiscovery {
private CountDownLatch latch = new CountDownLatch(1);
private volatile List<String> dataList = new ArrayList<String>();
private String registryAddress;
public ServiceDiscovery(String registryAddress) {
this.registryAddress = registryAddress;
ZooKeeper zk = connectServer();
if (zk != null) {
watchNode(zk);
}
}
public String discover() {
String data = null;
int size = dataList.size();
if (size > 0) {
if (size == 1) {
data = dataList.get(0);
} else {
//随机获取其中的一个
data = dataList.get(ThreadLocalRandom.current().nextInt(size));
}
}
return data;
}
private ZooKeeper connectServer() {
ZooKeeper zk = null;
try {
//format host1:port1,host2:port2,host3:port3
zk = new ZooKeeper(registryAddress, Constant.ZK_SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
//zookeeper处于同步连通的状态时
if (event.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();
}
}
});
latch.await();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return zk;
}
private void watchNode(final ZooKeeper zk) {
try {
List<String> nodeList = zk.getChildren(Constant.ZK_REGISTRY_PATH, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getType() == Event.EventType.NodeChildrenChanged) {
watchNode(zk);
}
}
});
List<String> dataList = new ArrayList<String>();
for (String node : nodeList) {
byte[] bytes = zk.getData(Constant.ZK_REGISTRY_PATH + "/" + node, false, null);
dataList.add(new String(bytes));
}
this.dataList = dataList;
} catch (Exception e) {
e.printStackTrace();
}
}
}
ps:使用代码框时,生成的代码框总是跑到第一行,只能将代码粘贴在文本中
相关推荐
Dubbo-Zookeeper-Netty-SpringMVC, 使用dubbo注册服务,netty做服务器,springmvc提供restful接口
服务注册和发现一直是分布式的核心组件。本文介绍了借助 ZooKeeper 做注册中心,如何实现一个简单的服务注册和发现。,需要的朋友可以参考下
【书籍学习】Netty、Redis、Zookeeper高并发实战-netty-redis-zookeeper # netty-redis-zookeeper 【书籍学习】Netty、Redis、Zookeeper高并发实战
netty,redis,zookeeper高-netty_redis_zookeeper_source_code
基于Zookeeper+Netty+Protostuff实现的简单RPC框架源码,代码内有详细注释
可视化的在线zookeeper服务查看,可以查看线上服务的注册清空,便于开发的同学寻找bug,调试代码
整合dubbo Zookeeper netty http https等框架打造高性能的web访问demo
基于Netty,ZooKeeper和Spring的RPC框架中文详情: 特征: 简单的代码和框架 ZooKeeper的服务注册表/发现支持 高可用性,负载平衡和故障转移 支持不同的负载均衡策略 支持异步/同步调用 支持不同版本的服务 支持...
基于Java+Zookeeper+Netty+Spring完成的简单RPC服务
5、zookeeper的java -Curator(服务注册与发现) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130320669 本文介绍使用zookeeper的Curator类库实现服务的注册与发现。 该示例会涉及到本专栏下的...
今天小编就为大家分享一篇关于Dubbo无法访问远程Zookeeper已注册服务的问题解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
1、zookeeper3.7.1安装与验证 网址:https://blog.csdn.net/chenwewi520feng/article/details/130280946 zookeeper的安装与验证分为4个部分,即环境准备、部署、验证和环境变量设置。 由于zookeeper需要非root用户,...
自己动手写基于动态代理,使用ZooKeeper作为注册中心,以Netty进行网络通信的RPC框架。更多详情请查看相关博客:https://blog.csdn.net/qq_31142553/article/details/86316654
本文深入探讨了Zookeeper在...此外,文章还详细介绍了使用Zookeeper构建注册中心的步骤,包括服务注册、节点监听、自动发现和负载均衡等关键概念。这些内容对于理解和应用Zookeeper在复杂分布式架构中的作用至关重要。
netty-redis-zookeeper高并发实战学习-netty-redis-zookeeper
ZooKeeper注册中心安装详细步骤
本人亲自写的demo,确定可以运行。项目是基于springboot的zookeeper环境下,服务注册及发现demo。包内有具体说明。下载后,如有疑问可以发消息我。
《Netty、Redis、ZooKeeper高并发实战》-netty-redis-zookeeper
Spring:它是最强大的依赖注入框架,也是业界的权威标准。 Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO ...ZooKeeper:提供服务注册与发现功能,开发分布式系统的必备选择,同时它也具备天生的集群能力。
「喜欢自提」基于netty实现rpc。 网上找的开源项目,用心研究了一下,做了些调整,都写中文注释。 挺有意思的,如果你想研究开源项目,这或许是个不错的突破口