`
zhao_rock
  • 浏览: 191791 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

zookeeper注册服务与netty的简单结合应用

阅读更多

简单介绍一下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:使用代码框时,生成的代码框总是跑到第一行,只能将代码粘贴在文本中

0
0
分享到:
评论

相关推荐

    Dubbo-Zookeeper-Netty-SpringMVC, 使用dubbo注册服务,netty做服务器,springmvc提供restful接口.zip

    在本项目"Dubbo-Zookeeper-Netty-SpringMVC"中,我们主要关注四个关键技术和框架的集成与应用。这四个技术分别是Dubbo、Zookeeper、Netty和SpringMVC,它们在分布式系统开发中各自扮演着重要的角色。让我们详细探讨...

    netty-redis-zookeeper高并发实战学习-netty-redis-zookeeper.zip

    ZooKeeper可以用于服务注册与发现,以及分布式锁,确保服务间的协作和一致性。这样的架构可以处理大规模并发请求,同时保证系统的稳定性和性能。 在学习"Netty-Redis-Zookeeper高并发实战"的过程中,你可能会涉及到...

    dubbo+netty打造高性能的RPC

    Zookeeper是Apache的一个分布式协调服务,常用于管理分布式应用中的配置信息、命名服务、集群同步等。http和https则是Web服务的标准协议,前者为明文传输,后者通过SSL/TLS加密以确保数据安全。 在这样的组合下,...

    springboot netty4 及时通讯(带心跳检测,zookeeper)

    **四、Zookeeper服务注册与发现** Zookeeper是一个分布式协调服务,可用于服务注册、发现和配置管理。 1. **服务注册** - 创建Zookeeper客户端,连接到Zookeeper集群。 - 在Netty服务器启动时,向Zookeeper注册...

    《Netty、Redis、ZooKeeper高并发实战》-netty-redis-zookeeper.zip

    Netty、Redis和ZooKeeper的结合应用: 在高并发环境下,Netty作为高效的网络通信层,可以快速处理客户端的连接和数据传输。Redis利用其内存存储特性,提供高速的数据访问,可以作为缓存或者消息中间件来减轻后端...

    netty自定义rpc实现

    本主题聚焦于如何使用Netty框架自定义RPC实现,结合了Zookeeper作为服务注册与发现的组件。下面将详细介绍这个过程中的关键知识点。 1. **Netty基础**: Netty是一个高性能、异步事件驱动的网络应用程序框架,用于...

    dubbo+zookeeper+spring -demo

    2. **Zookeeper服务注册与发现**: Zookeeper是Apache的一个分布式协调服务,它为分布式应用提供一致性服务。在Dubbo中,Zookeeper作为服务注册中心,服务提供者启动时会将自己注册到Zookeeper上,服务消费者则从...

    zookeeper3.8和Dubbo安装包

    1. **服务注册与发现**: 通过Zookeeper等注册中心,实现服务的自动注册和发现。 2. **服务治理**: 提供服务的监控、限流、熔断、降级等高级功能,提升系统的稳定性。 3. **RPC通信**: 使用高性能的Netty框架,提供...

    dubbo+zookeeper案例,dubbo和Zookeeper详解,Java源码.zip

    Zookeeper的主要功能包括配置管理、命名服务、分布式同步、组服务等,广泛应用于服务注册与发现、配置中心等场景。 三、Dubbo与Zookeeper的集成 在Dubbo中,Zookeeper常被用作注册中心,服务提供者向Zookeeper注册...

    netty同步传输demo

    通过这个示例,开发者可以学习如何结合Netty的同步通信机制和ZooKeeper的分布式协调能力,构建一个可靠的分布式系统。理解并掌握这些技术,对于构建大规模、高并发、高可用的网络应用至关重要。

    基于Netty、ZooKeeper、Hdfs的高可用性的数据同步和保活.zip

    综上所述,这个项目结合了Netty的网络通信能力、ZooKeeper的分布式协调服务和Hdfs的分布式存储,构建了一个具备高可用性、数据同步和保活机制的系统。这种系统对于处理大规模、高并发的数据操作,尤其是在人工智能...

    Dubbo+Zookeeper+Spring所需jar包(全)

    在Dubbo中,Zookeeper通常被用作服务注册中心,服务提供者会在Zookeeper上注册自己的服务,而服务消费者则会从Zookeeper获取服务提供者的地址,从而实现服务发现。 Spring是一个广泛使用的Java企业级应用开发框架,...

    Zookeeper实现简单的分布式RPC框架

    在IT行业中,分布式系统已经成为大型应用的标准架构,而Zookeeper作为一个强大的分布式协调服务,被广泛应用于构建复杂的分布式环境。本文将深入探讨如何利用Zookeeper实现一个简单的分布式RPC(Remote Procedure ...

    zookeeper与dubbo的介绍

    在Dubbo中,Zookeeper常被用作服务注册与发现的中心。Dubbo服务提供者会在Zookeeper上注册自己的服务,而消费者则通过Zookeeper获取服务提供者的地址,实现动态的服务发现。这种模式极大地提高了系统的可扩展性和...

    基于Netty实现了dubbo rpc

    5. **服务注册与发现**:Netty实现的RPC框架还需要集成服务注册中心,服务提供者启动时向注册中心注册自己的服务,服务消费者可以从注册中心获取服务提供者的地址信息。Dubbo支持Zookeeper、Eureka等多种注册中心。 ...

    zookeeper开发所需jar包

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    netty-rpc-master.zip

    综上所述,Netty-RPC框架利用了Netty的高并发和低延迟特性,结合Zookeeper的服务注册与发现能力,以及Protostuff高效的序列化手段,实现了高效、可靠的分布式通信。通过深入理解这些组件的工作原理和整合方式,...

    netty手写dubbo源码分享

    五、Netty实现服务注册与发现 Dubbo的服务注册通常基于Zookeeper或其他注册中心,服务提供者启动时,将自身服务信息注册到注册中心,服务消费者订阅感兴趣的服务。在Netty中,可以通过配置监听注册中心的事件,当...

    使用netty自定义rpc通信框架

    2. **服务注册与发现**:为了能够找到服务提供者,我们需要一个服务注册中心,例如Zookeeper、Eureka等。服务消费者可以通过注册中心获取服务提供者的地址。 3. **请求与响应**:客户端发送RPC请求到服务器,服务器...

Global site tag (gtag.js) - Google Analytics