dubbo使用zookeeper连接,zookeeper宕机后怎么处理?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo使用zookeeper连接,zookeeper宕机后怎么处理?相关的知识,希望对你有一定的参考价值。
1、配置文件同步
2、主从切换
3、分布式队列
4、分布式锁
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。
通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper 能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使用示例。
常用接口列表
客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互。
前面说了 ZooKeeper 主要是用来维护和监控一个目录节点树中存储的数据的状态,所有我们能够操作 ZooKeeper 的也和操作目录节点树大体一样,如创建一个目录节点,给某个目录节点设置数据,获取某个目录节点的所有子目录节点,给某个目录节点设置权限和监控这个目录节点的状态变化。
1,配置文件同步2,主从切换3,分布式队列4,分布式锁5,其他在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下:packagecom.qin.curator.zk;importjavax.sound.midi.Patch;importorg.apache.curator.RetryPolicy;importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.framework.CuratorFrameworkFactory.Builder;importorg.apache.curator.framework.api.CuratorWatcher;importorg.apache.curator.framework.recipes.cache.NodeCache;importorg.apache.curator.framework.recipes.cache.NodeCacheListener;importorg.apache.curator.framework.recipes.cache.PathChildrenCache;importorg.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;importorg.apache.curator.framework.recipes.cache.PathChildrenCacheListener;importorg.apache.curator.retry.ExponentialBackoffRetry;importorg.apache.curator.utils.ZKPaths;importorg.apache.zookeeper.WatchedEvent;/****使用curator监听zookeeper节点*@authorqindongliang***/publicclassCuratorWatchstaticCuratorFrameworkzkclient=null;staticStringnameSpace="php";staticStringzkhost="192.168.46.22:2181";//zk的hostRetryPolicyrp=newExponentialBackoffRetry(1000,3);//重试机制Builderbuilder=CuratorFrameworkFactory.builder().connectString(zkhost).connectionTimeoutMs(5000).sessionTimeoutMs(5000).retryPolicy(rp);builder.namespace(nameSpace);CuratorFrameworkzclient=builder.build();zkclient=zclient;zkclient.start();//放在这前面执行zkclient.newNamespaceAwareEnsurePath(nameSpace);publicstaticvoidmain(String[]args)throwsExceptionwatch();Thread.sleep(Long.MAX_VALUE);/****监听节点变化***/publicstaticvoidwatch()throwsExceptionPathChildrenCachecache=newPathChildrenCache(zkclient,"/zk",false);cache.start();System.out.println("监听开始/zk..");PathChildrenCacheListenerplis=newPathChildrenCacheListener()@OverridepublicvoidchildEvent(CuratorFrameworkclient,PathChildrenCacheEventevent)throwsExceptionswitch(event.getType())caseCHILD_ADDED:System.out.println("Nodeadded:"+ZKPaths.getNodeFromPath(event.getData().getPath()));break;caseCHILD_UPDATED:System.out.println("Nodechanged:"+ZKPaths.getNodeFromPath(event.getData().getPath()));break;caseCHILD_REMOVED:System.out.println("Noderemoved:"+ZKPaths.getNodeFromPath(event.getData().getPath()));break;;//注册监听cache.getListenable().addListener(plis);运行后的控制台打印:18:33:07.722[main]INFOo.a.c.f.imps.CuratorFrameworkImpl-Starting18:33:07.727[main]DEBUGo.a.curator.CuratorZookeeperClient-Starting18:33:07.727[main]DEBUGorg.apache.curator.ConnectionState-Starting18:33:07.727[main]DEBUGorg.apache.curator.ConnectionState-reset18:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment:zookeeper.version=3.4.6-1569965,builton02/20/201409:09GMT18:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment:host.name=QINDONGLIANG.dhgatecn.msf18:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment:java.version=1.7.0_0418:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment:java.vendor=OracleCorporation18:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment:java.home=D:\\Java\\jdk1.7.0_04\\jre18:33:07.734[main]INFOorg.apache.zookeeper.ZooKeeper-Clientenvironment: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.15.jar;D:\\eclipseworkspace2yw\\opzk\\lib\\zookeeper-3.4.5.jar;D:\\eclipseworkspace2yw\\opzk\\lib\\commons-io-2.1.jar
参考技术Bzookeeper宕机后,因为消费者会缓存提供者的信息,所以应用不会有问题。
但是,此时提供者和消费者都无法重连zookeeper,因为dubbo貌似配置的zkclient不会重连zookeeper,所以一旦重启一台服务提供者,那么这台就从服务消费者的缓存中消失了,
此时服务消费者又连不上zookeeper,所以如果同时重启,消费者就没有提供者可用了,所以只能重启一台提供者后,再重启一个消费者,交错重启。
dubbo框架----初探索-配置
使用框架版本
dubbo-2.5.3
spring-4.2.1.RELEASE
jdk-1.8
tomcat-8.0
zookeeper-3.3.6
Dubbo与Zookeeper、SpringMVC整合使用
第一步:在Linux上安装Zookeeper
(1)下载Zookeeper-3.4.6.tar.gz 地址http://www.apache.org/dist/zookeeper/
(2) 我们放到Linux下的一个文件夹,然后解压:
(3)然后在对应的zookeeper-3.4.6/conf 下有一个文件zoo_sample.cfg的这个文件里面配置了监听客户端连接的端口等一些信息,Zookeeper 在启动时会找zoo.cfg这个文件作为默认配置文件,所以我们复制一个名称为zoo.cfg的文件
我们查看一下这个文件的里面的一些配置信息,如图所示:
(4)启动Zookeeper 的服务,如图所示:
第二步:配置dubbo-admin的管理页面,方便我们管理页面
(1)下载dubbo-admin-2.4.5.war包,在Linux的tomcat部署,先把dubbo-admin-2.4.1放在tomcat的webapps/ROOT下,然后进行解压:
dubbo 源代码地址:https://github.com/alibaba/dubbo
关于dubbo在jdk 1.8 环境下打包,报错,参考:https://github.com/alibaba/dubbo/issues/50
提供dubbo-admin-2.5.4.war 访问地址:http://share.weiyun.com/006e0a25a056dcbdc0664841ab9e5feb
初次访问需要用户名:root;密码:root;
第三步:SpringMVC与Dubbo的整合,这边使用的Maven的管理项目
我们先开发服务注册的,就是提供服务,项目结构如图所示:
(1)test-maven-api项目加入了一个服务接口,代码如下:
package com.dubbo.registry.service; public interface TestRegistryService { public String hello(String name); }
(2)test-maven-console 工程在pom.xml加入Dubbo和Zookeeper的jar包、引用test-maven-api的jar包,代码如下:
<dependency> <groupId>cn.test</groupId> <artifactId>test-maven-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
具体的实现Java代码为:
package com.dubbo.registry.serviceImpl; import org.springframework.stereotype.Service; import com.dubbo.registry.service.TestRegistryService; @Service("testRegistryService") public class TestRegistryServiceImpl implements TestRegistryService{ public String hello(String name) { return "hello"+name; } }
为了让dubbo和zookeeper来管理过程,我们还需要做额外的配置(前提是spring已经加入到工程中来)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd" default-lazy-init="false"> <!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 --> <dubbo:application name="dubbo_provider"></dubbo:application> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" check="false" subscribe="false" register=""></dubbo:registry> <!-- 要暴露的服务接口 --> <dubbo:service interface="com.dubbo.registry.service.TestRegistryService" ref="testRegistryService" /> </beans>
启动过程,效果如下图:
(3)test-maven-customer项目的具体实现,相关pom代码如下:
<dependency> <groupId>cn.test</groupId> <artifactId>test-maven-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
web层,控制器代码
package com.dubbo.registry.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.dubbo.registry.service.TestRegistryService; @Controller public class IndexController { @Autowired private TestRegistryService testRegistryService; @RequestMapping("/hello") public String index(Model model){ String name = testRegistryService.hello("zz"); System.out.println("xx=="+name); return ""; } }
dubbo和zookeeper配置如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd" default-lazy-init="false"> <dubbo:application name="dubbo_consumer"></dubbo:application> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"></dubbo:registry> <!-- 要引用的服务 --> <dubbo:reference interface="com.dubbo.registry.service.TestRegistryService" id="testRegistryService"></dubbo:reference> </beans>
启动项目:效果如下
(5)然后访问消费者项目,Controller层能像调用本地一样调用服务的具体实现,如图所示:
参考:
http://dubbo.io/Developer+Guide-zh.htm#DeveloperGuide-zh-%E6%9A%B4%E9%9C%B2%E6%9C%8D%E5%8A%A1%E6%97%B6%E5%BA%8F
http://www.cnblogs.com/Javame/p/3632473.html
http://blog.csdn.net/congcong68/article/details/41113239
http://doc.okbase.net/congcong68/archive/112508.html
以上是关于dubbo使用zookeeper连接,zookeeper宕机后怎么处理?的主要内容,如果未能解决你的问题,请参考以下文章
dubbo使用zookeeper连接,zookeeper宕机后怎么处理
dubbo使用zookeeper连接,zookeeper宕机后怎么处理?