1.利用ZK来实现一个服务的注册和发现
2.å¦ä½ä½¿ç¨cruatorçå¬zookeeperäºä»¶åå
利用ZK来实现一个服务的注册和发现
利用ZK来实现一个服务的注册和发现小结
一、服务的注册
1、先来安装zk,这里可以在windows环境下安装即可,我们就用一个单节点做测试。楚汉德州源码不用建集群或者伪集群
2、启动zk-server
3、在项目工程里引入操作ZK的客户端框架 curator
4、通过curator的操作命令来链接zk-server,并创建节点
5、进行服务提供方所提供的服务接口在第4部上所建节点进行服务接口的注册(即服务的暴露)
6、启动服务提供方的转盘抽奖源码监听(用来监听消费方发送来的消息)
7、补充:服务的监听其实质还是通过ServerSockt来获取消息,但是实际当中的一些消息中间件并不会这样用。我们知道现如今高性能的IO通信框架netty已经被广泛使用,采用了同步非阻塞的设计思想,以及多路复用器来完成高并发下的网络通信
二、服务的响应式网站源码发现
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,vb.net 源码而我们并不去优先考虑使用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