为啥dubbo使用zkclient作为zookeeper的客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥dubbo使用zkclient作为zookeeper的客户端相关的知识,希望对你有一定的参考价值。

本文内容并非原创,使用资料均来自互联网。
dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢?
先看看zookeeper本身自带的客户端的问题。
1 ) ZooKeeper的Watcher是一次性的,用过了需要再注册;
2 )
session的超时后没有自动重连,生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显;
3

没有领导选举机制,集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果;
4
) 客户端只提供了存储byte数组的接口,而项目中一般都会使用对象。

5 )客户端接口需要处理的异常太多,并且通常,我们也不知道如何处理这些异常。
I0Itec这个zookeeper客户端基本上解决了上面的所有问题,主要有以下特性:
1) 提供了zookeeper重连的特性------能够在断链的时候,重新建立连接,无论session失效与否.
2) 持久的event监听器机制------ ZKClient框架将事件重新定义分为了stateChanged、znodeChanged、dataChanged三种情况,用户可以注册这三种情况下的监听器(znodeChanged和dataChanged和路径有关),而不是注册Watcher。
3) zookeeper异常处理-------zookeeper中繁多的Exception,以及每个Exception所需要关注的事情各有不同,I0Itec简单的做了封装.
4) data序列化------简单的data序列化.(Serialzer/Deserialzer)
5)有默认的领导选举机制
请注意使用I0Itect-zkClient暂时有几个方法仍需要重写:
1) create方法 : 创建节点时,如果节点已经存在,仍然抛出NodeExistException,可是我期望它不在抛出此异常.
2) retryUtilConnected : 如果向zookeeper请求数据时(create,delete,setData等),此时链接不可用,那么调用者将会被阻塞直到链接建立成功;不过我仍然需要一些方法是非阻塞的,如果链接不可用,则抛出异常,或者直接返回.
3) create方法 : 创建节点时,如果节点的父节点不存在,我期望同时也要创建父节点,而不是抛出异常.
4) data监测: 我需要提供一个额外的功能来补充watch的不足,开启一个线程,间歇性的去zk server获取指定的path的data,并缓存起来..归因与watch可能丢失,以及它不能持续的反应znode数据的每一次变化,所以只能手动去同步获取。
参考技术A dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢? 先看看zookeeper本身自带的客户端的问题。 1 ) ZooKeeper的Watcher是一次性的,用过了需要再注册;

短信平台README.MD

1、引入dubbo服务,作为一个提供者提供服务
2、dubbo所依赖的jar包:dubbo-2.5.3.jar(dubbo服务的核心jar包)
javassist-3.15.0-GA.jar(字节码生成包)
netty-3.2.5.Final.jar(网络传输包)
zkclient-0.1.jar(zkclient将ZooKeeper的watcher机制转换成为一种更加容易理解的订阅模式)
zookeeper-3.3.3.jar(注册zooker时必须jar服务端)
fastjson-1.1.37.jar(json格式的jar包)
mysql-connector-java-5.1.26-bin.jar(数据库驱动jar包)(手动添加)
3、一般只进行数据库的配置(用户和模板配置),只有在增加短信提供商的时候才需要修改代码
4、dubbo服务消费者直连提供者:在src/main/source/下有spring_dubbo_provider_d.xml(提供者实例)
在src/test/source/spring_dubbo_consumer_d.xml(消费者实例)
5、dubbo服务的白名单(IP白名单):
(1)、在src/main/source/创建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
纯文本文件,内容添加:AuthorityFilter=com.isoftstone.iics.bizsupport.sms.web.constant.AuthorityFilter
指明过滤器路径
(2)、创建AuthorityFilter该类后,继承Filter类,实现invoke方法
(3)、在提供者配置中添加该标签:<dubbo:provider filter="AuthorityFilter"/>
(4)、电话白名单类似于ip白名单.
6、http接口电话白名单UAT环境不做限制,测试环境做限制


FAQ:
1.exception:Fail to start server// Failed to bind to: /0.0.0.0:20880
(1)、生产者和消费者在同一个工程,注释掉消费者!
(2)、可能在本机上已经有一个容器启动了,所以在绑定zooker集群的时候失败了!
(3)、端口绑定失败,端口正在被使用!
2.使用dubbo提供的hessian协议进行直连RPC调用时,路径设置有误,报远程方法执行失败!(RPC调用传送文件)
(1)、contextpath设置有误
(2)、尚未解决
3、The host did not accept the connection within timeout of 10000 ms




文字接口测试--返回信息有问题,目前不太懂
curl -H "Content-Type: application/json" -X POST  --data ‘{"tid":"100","mobile":"18295789020"}‘ http://10.0.0.5:8082/com.isoftstone.iics.bizsupport.sms/sms/sendmessage?sid=21&passwd=123456



curl -H "Content-Type: application/json" -X POST  --data ‘{"tid":"100","mobile":"18295789020"}‘ http://10.0.0.5:8082/com.isoftstone.iics.bizsupport.sms/sms/sendmessage?sid=21&passwd=123456

curl -H "Content-Type:application/x-www-form-urlencoded;charset=utf-8" -X POST --data "mobile=18295789020&smsMessage=123456" http://10.6.1.5/com.isoftstone.iics.bizsupport.sms/sms/message

 

以上是关于为啥dubbo使用zkclient作为zookeeper的客户端的主要内容,如果未能解决你的问题,请参考以下文章

dubbo在Github上为啥不更新了

Dubbo报org.I0Itec.zkclient.exception.ZkNoNodeException异常

短信平台README.MD

Dubbo-002

【Dubbo】与ZK交互

Dubbo学习-4-dubbo简单案例-2-服务提供者和消费者配置