皮皮网

【火星探索源码】【魔窟源码】【obfsproxy 源码】curator源码cache

2024-12-29 00:51:43 来源:bim 源码

1.利用ZK来实现一个服务的注册和发现
2.如何使用cruator监听zookeeper事件变化

curator源码cache

利用ZK来实现一个服务的注册和发现

       利用ZK来实现一个服务的注册和发现小结

        一、服务的注册

        1、先来安装zk,这里可以在windows环境下安装即可,我们就用一个单节点做测试。火星探索源码不用建集群或者伪集群

        2、启动zk-server

        3、在项目工程里引入操作ZK的客户端框架 curator

        4、通过curator的操作命令来链接zk-server,并创建节点

        5、进行服务提供方所提供的服务接口在第4部上所建节点进行服务接口的注册(即服务的暴露)

        6、启动服务提供方的魔窟源码监听(用来监听消费方发送来的消息)

        7、补充:服务的监听其实质还是通过ServerSockt来获取消息,但是实际当中的一些消息中间件并不会这样用。我们知道现如今高性能的IO通信框架netty已经被广泛使用,采用了同步非阻塞的设计思想,以及多路复用器来完成高并发下的网络通信

        二、服务的obfsproxy 源码发现

        1、消费方开始调用提供方的服务接口

        2、调用方式:1>可以使用jdk动态代理来调用远程方法

        2>也可以自己实现一个InvocationHandler,其目的就把远程接口加载到本地,当做本地方法来使用

        3、serverceLocator方式

        3.1 服务发现步骤

        3.2 通过curator来链接zk-server

        3.3 访问znode是否存在

        3.4 通过zk-api 提供PathChildrenCache、PathChildrenCacheListener来监听znode数据是红帽源码否有变化

        3.5 获取zk-server的ip+port

        3.6 通过消费方socket来链接 zk-server 并发送消息

        总结:这里的服务注册和发现 完全是用了zk的两个非常重要的特性:znode结构以及事件监听通知机制,我们可以看到

        在消费方服务发现里,会有一个监听对应znode的watcher实时动态的负责监听。这里可以理解为:只要znode上有

        新的服务方接口,就会通知消费方来调用

        缺点:实际项目当中我们知道作为服务注册和发现的组件常用的有ZK、Eureka,fcntl 源码而我们并不去优先考虑使用ZK,原因何在?

        我们知道ZK\Eureka,这两者都是作为分布式系统当中的一种重要的分布式协调器,而我们所知的二者都满足了分布式系统

        CAP理论当中的一个侧重点,ZK主要满足CP,而Euraka是满足AP,这就为ZK不能满足A而带来一定程度的影响,比如当ZK中

        master节点挂掉之后,因为集群节点过多,从节点的leader选举占据了大量的时间,而导致zk的不可用,反而大大提升了

        系统的风险。

        优点:ZK的优点也是基于自身的特点,根据他的特点我们可以去实现一个分布式系统当中常用的 配置管理中心,这里就利用

        了他的一致性特点

        优化方案,如果服务提供房是一个集群,那么消费方请求可以通过负载均衡,来打到不同的节点上,以防止单一节点过载

如何使用cruator监听zookeeper事件变化

       æŽŒæ¡zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括:

       1,配置文件同步

       2,主从切换

       3,分布式队列

       4,分布式锁

       5,其他

       æ•£ä»™ï¼Œåœ¨ä»¥å‰çš„文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下:

       <pre name="code" class="java">package com.qin.curator.zk;

       import javax.sound.midi.Patch;

       import org.apache.curator.RetryPolicy;

       import org.apache.curator.framework.CuratorFramework;

       import org.apache.curator.framework.CuratorFrameworkFactory;

       import org.apache.curator.framework.CuratorFrameworkFactory.Builder;

       import org.apache.curator.framework.api.CuratorWatcher;

       import org.apache.curator.framework.recipes.cache.NodeCache;

       import org.apache.curator.framework.recipes.cache.NodeCacheListener;

       import org.apache.curator.framework.recipes.cache.PathChildrenCache;

       import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;

       import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;

       import org.apache.curator.retry.ExponentialBackoffRetry;

       import org.apache.curator.utils.ZKPaths;

       import org.apache.zookeeper.WatchedEvent;

       /**

       *

       * 使用curator监听zookeeper节点

       * @author qindongliang

       * **/

       public class CuratorWatch {

       static CuratorFramework zkclient=null;

       static String nameSpace="php";

       static {

        String zkhost="...:";//zk的host

        RetryPolicy rp=new ExponentialBackoffRetry(, 3);//重试机制

        Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost)

        .connectionTimeoutMs()

        .sessionTimeoutMs()

        .retryPolicy(rp);

        builder.namespace(nameSpace);

        CuratorFramework zclient = builder.build();

        zkclient=zclient;

        zkclient.start();// 放在这前面执行

        zkclient.newNamespaceAwareEnsurePath(nameSpace);

       }

       public static void main(String[] args) throws Exception{

       watch();

       Thread.sleep(Long.MAX_VALUE);

       }

       /**

       *

       * 监听节点变化

       *

       * */

       public static void watch()throws Exception{

        PathChildrenCache cache = new PathChildrenCache(zkclient, "/zk", false);

        cache.start();

       System.out.println("监听开始/zk........");

       PathChildrenCacheListener plis=new PathChildrenCacheListener() {

       @Override

       public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)

       throws Exception {

        switch ( event.getType() )

        {

        case CHILD_ADDED:

        {

        System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

        break;

        }

       case CHILD_UPDATED:

        {

        System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

        break;

        }

        case CHILD_REMOVED:

        {

        System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

        break;

        }

        }

       }

       };

       //注册监听

       cache.getListenable().addListener(plis);

       }

       }

       </pre>

       è¿è¡ŒåŽçš„控制台打印:

       <pre name="code" class="java">::. [main] INFO o.a.c.f.imps.CuratorFrameworkImpl - Starting

       ::. [main] DEBUG o.a.curator.CuratorZookeeperClient - Starting

       ::. [main] DEBUG org.apache.curator.ConnectionState - Starting

       ::. [main] DEBUG org.apache.curator.ConnectionState - reset

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.6-, built on // : GMT

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=QINDONGLIANG.dhgatecn.msf

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.7.0_

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:\Java\jdk1.7.0_\jre

       ::. [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=D:\eclipseworkspace2yw\opzk\bin;D:\eclipseworkspace2yw\opzk\lib\curator-client-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-examples-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-framework-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-recipes-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-test-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-x-discovery-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-x-discovery-server-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\curator-x-rpc-2.6.0.jar;D:\eclipseworkspace2yw\opzk\lib\log4j-1.2..jar;D:\eclipseworkspace2yw\opzk\lib\zookeeper-3.4.5.jar;D:\eclipseworkspace2yw\opzk\lib\commons-io-2.1.jar