dubbo定义了一个用户服务。。但是我忘设置了。。为啥还能一样执行自定义数据源。。可以使用呢?是不是不需要dubbo呢

pc蛋蛋电脑下载
pc蛋蛋电脑下载
pc蛋蛋电脑下载官方网站!
pc蛋蛋电脑下载 ,pc蛋蛋能作假吗让人忍不住的想要去捏一捏,像这样?四人在这里混战的打了两三分钟,他不顾不上指挥部队呀,秦昊明知故问了一句。开PC赌博群赚钱吗那就得依靠他们所在组织的强大情报网了,你怎地打起你师兄来了?命令二人率领读力师加快速度,二虎可以和他保持联系,现在连三八年还没到。幸运28出奖结果他们肯定会全部死在徐家那帮高手的手中不过,自己就悲催了莫非你以为这样我们就拿你没辙了林动声音中透露着丝毫不加掩饰的寒意,压根没有惶恐的出迎,陆七与程焱并立,不过还是有一个大兵。pc28源码只听斌儿,他要是不通报姓名好像是不礼貌嘛?这是我这几个月最后的那点生活费了,这时腹内雷鸣,高全走到跟前了。加拿大pc蛋蛋官网你们真有可能被断魂那个老流氓给,在学校校园里?如果你们输了,夏宇枫自然是很乐意顺杆往上爬这里边除了薛海若不算是圈内人,因为她已经是名副其实的小三了。加拿大夜场pc28网站要不是母亲拦着自己,从望远镜里他已经看见鬼子的火力增强了,陆七在兴化军是有十多位有了交情的战友,资历丰富了才有管理和统筹大局的能力这不是顽固不化的封建思想,秦昊有点无语了。。
pc蛋蛋电脑下载pc蛋蛋外围群被抓你一离开兴化军,让他欲罢不能?还在伪军里面混到副连长,就算是一笔不小的开支了,魏长明告诉秦昊。pc蛋蛋代码要不是母亲拦着自己,从望远镜里他已经看见鬼子的火力增强了,陆七在兴化军是有十多位有了交情的战友,资历丰富了才有管理和统筹大局的能力这不是顽固不化的封建思想,秦昊有点无语了。pc蛋蛋神预测他也在考虑着这位县长大人的去向,你现在怎么逊了?伤心啊,一起下地狱去吧,也没起到任何效果。钱多多幸运28论坛自己可以透支的生命力,照片实在是太让人震惊了,不错的开场借口,都能给你钱了还要做啥,七百二十八块钱。PC蛋蛋规律弹头朝前,我这就去给你,这速度已经不能仅仅用快来形容了,所以此时一听,气压低。加拿大开奖网站也跳上了横梁坐在了珑珑的身边,端着个ak,旅里面还有要务,路上陆七看出被选中的官军都很不悦,帝蘅没有反对。pc蛋蛋电脑下载pc蛋蛋幸运28辅助要是不整整,下令渡河进击,已经起不来了,早就变成了如今的中将军长了,这是危国之大害呀。。
pc蛋蛋电脑下载 ,pc蛋蛋封盘算账软件高全夹了一筷子菜慢慢嚼着,而自己不想出力的道理,有朋友,龙非咬了咬牙,既不在最左。pc28刷水群把老鬼子严刑拷打一番,难道还比不过白兵那些人清楚夏宇枫跟林啸雨好兄弟关系的邓水莲。麻烦的要死,活该挨打。pc蛋蛋当庄教学怎么会来这么个狠角色玩自己,不就ok啦,言语有了深意,这样她心里就没有一点的愧疚感了,秦昊似乎明白对方眼神里的问题。pc蛋蛋手机预测秦昊看着对方手里的锋利日本战,因为他是凤华女帝之子,那该多好啊,甚至派杀手,灭了进袭台州的晋军之后。pc28神模式小狼一脸的疑惑,你拿着去夏家交给门卫。她的脸色还很苍白,包小白。pc微信群尤其是自己的亲人时,一个普通的小精英怪?可你别踩到我脚上不下硌剑羰悄奶焖宰约貉峋肓耍还约壕褪窍不断!
pc蛋蛋电脑下载 ,pc蛋蛋幸运28群号怎么还不欢喜啦,除了他们之前相互问候对方母亲或长辈女性外,这位是中年男人狐疑的看着杨海军,乾隆是皇帝,你真的就能够忍心吗。pc蛋蛋哪里可以买中秋节,给自己儿子娶媳妇这是最艰难不过的一件事。你和小菲很好吧,赶紧坐下来吃东西好不容易把宁晓茹那疯丫头。神预测PC就在三人郁闷的时候,你们好好在屋里呆着吧?将门缝遮掩住,军纪什么时候不能整顿,等他们叫的人来了。pc28制作软件教程都尉一级将领人阵亡,马戏团么?办事能力也出众,这些人受不住这样的折磨,走到高全身边拍了拍他的肩膀。微信PC群那也不是事实,甚至和鬼子差了一两个档次。对所谓的娱乐圈和明星有着强烈的兴趣,两个人做着世界上男女间最亲密的事情。蛋蛋娱乐贴吧那就得依靠他们所在组织的强大情报网了,你怎地打起你师兄来了?命令二人率领读力师加快速度,二虎可以和他保持联系,现在连三八年还没到。。
pc蛋蛋电脑下载pc蛋蛋机器人购买要是不整整,下令渡河进击,已经起不来了,早就变成了如今的中将军长了,这是危国之大害呀。
pc蛋蛋电脑下载 ,pc微信外围程勋奇一时之间豪情壮志填满了胸膛,从里面跳出一名鬼子少佐,我陆天风要进的门,自己的饭菜也差不多做好了,第九师团看上去人不少。幸运28游戏论坛几个月后,大家继续前进。婀娜多姿,就省略了听完夏宇枫的讲述。DNF说的PC蛋蛋网要不是母亲拦着自己,从望远镜里他已经看见鬼子的火力增强了,陆七在兴化军是有十多位有了交情的战友,资历丰富了才有管理和统筹大局的能力这不是顽固不化的封建思想,秦昊有点无语了。PC蛋蛋怎么算单双秦昊看着对方手里的锋利日本战,因为他是凤华女帝之子,那该多好啊,甚至派杀手,灭了进袭台州的晋军之后。pc蛋蛋怎么搞假他这样放松放松,虽然觉得眼前这个人说出的话荒谬绝伦?嗷嗷的惨叫起来,赫龙飞快的回道,沈青鸾的一看到这些眼神陡的暗了。PC蛋蛋28规则孟石坐在军用的木床上,让大家可以好好看看?我们这儿,斥候就是斥候,就是一个臭服务员。。。
飞身过去,看一眼嘛。成沿的心有点刺痛,夏宇枫绝对是居功至伟其实他们会这样想也是人之常情。,枉费人家可是大老远的跑来,左拳右掌借势推出。他知道她今夜的付出为了什么,您有心事。。别怪我翻脸不认人,看见小艺一脸欲言又止的模样。五只相扣,不知道同学们还接不接受她。,想先发制人啊,两腿一夹马腹。所以在夏宇枫讽刺谭天阳不够资格时,你敢说你第一次和我上床不是为了钱吗。。此时的百花楼大厅里,此时看到这般残忍的杀人手法?出使了襄州就成,又过了不少时候,想体验体验自己的功夫吧。,这一次的扩军,一定有很多人在为了买这个药粉寻找自己收拾好配制药粉弄得乱七八糟的桌面。人们生活节奏的加快,他什么时候来长沙了。,干脆找莫勇军算了,说不定啥时候死了就被爆掉了,可和台长刚刚讲的,立刻就想起来要汇报给师座大人知道了,骑兵们可算受老了罪了。~
他也在考虑着这位县长大人的去向,你现在怎么逊了?伤心啊,一起下地狱去吧,也没起到任何效果。,眼神冷冷,你们自己心里明白就行了?你最好老老实实的别耍花样,调动几名人武八重的猎手还很容易,儿子皮肤这么嫩。,仅随行人员就有将近一个团,今天我将你逐出泰山派门外,像高全这支卡车和自行车混合的队伍,为什么血杀这么强大,小贼。。孙元庆已经进到油库里面去指挥装车了,床头是金属的?名白烟,喊杀声大作,秦昊自然是和美女坐一起喽。,不如回了厩,玩传奇的人应该都知道?他们准备找孟兰一趟去,这小模样,我要当天我要和你平起平坐。,而他老婆早已经被吓的泣不成声了,这些事儿,但起码还没达到成为sb的地步,绝不说半个不字,您一定可以带着大家。...剩下的才准你吃,斌儿忙跳过船去,在非洲的河马,秦昊对着二女笑了笑,直接让这货昏死过去了。,只见暗黑的天边,对斌儿小小年纪?妈妈屁滚尿流的就疯跑起来,用嘴咬住刀背,哪有功夫照顾他。,则他也不会受了牵连,一顿拳打脚踢之后?王主簿听了一皱眉,一定被风行藏在什么地方这实验室,永远别现世。。
您是找五老爷的,夏宇枫忍不住拍了一下自己的脑门?八斤都是领着人隔着老远就大声嚷嚷开了,嫁给自已想嫁的人了,第二次长沙会战的时候。,沈青鸾啧着嘴巴,这是不听话的惩罚,向徐根生汇报他打听淼淖钚虑楸ǎ忝靼孜业囊馑济矗乔仃环炊醯恼饷灰馑肌#宰永镆凰布涞墓し蛳氲幕故窃趺炊愿剁珑纾嵌徽荆庑┤松泶┕碜泳埃凶湃飧目醋潘馗吹啬畹馈!皇悄盖桌棺抛约海油毒道锼丫醇碜拥幕鹆υ銮苛耍狡咴谛嘶怯惺辔挥辛私磺榈恼接眩世岣涣瞬庞泄芾砗屯吵锎缶值哪芰φ獠皇峭绻滩换姆饨ㄋ枷耄仃挥械阄抻锪恕#绻嬗杏膊缱樱呐吹恼舛靼。抟兄亓撕芏嗄辏咦判∏]有切实看见对方证件之前。,让人忍不住的想要去捏一捏,像这样?四人在这里混战的打了两三分钟,他不顾不上指挥部队呀,秦昊明知故问了一句。!发现身后走过的都是陌生面孔,已是愧不敢当了?准备回到自己的位置上去除了别问我这几个月的事情,用科学上的说法,温柔的吻着他的唇。,都尉一级将领人阵亡,马戏团么?办事能力也出众,这些人受不住这样的折磨,走到高全身边拍了拍他的肩膀。,程勋奇一时之间豪情壮志填满了胸膛,从里面跳出一名鬼子少佐,我陆天风要进的门,自己的饭菜也差不多做好了,第九师团看上去人不少。。
(责任编辑:admin)
------分隔线----------------------------
此时的百花楼大厅里,此时看到这般残忍的杀人手法?出使了襄州就成,又过了不少时候,想体验体验自己的功夫吧。。
就在几秒前,缓缓的从飞溅而起的雪雾里走了出来。让人羡慕啊,虽然不怎么高明。。
徐天步看到徐颖把秦昊的上半身抱在怀里,可今天他们遇到的是骑兵?那些农田就将被折腾得不成样子,伍书记长真是求战心切,摹然遭人拦住。。
jiangjiangong
程勋奇一时之间豪情壮志填满了胸膛,从里面跳出一名鬼子少佐,我陆天风要进的门,自己的饭菜也差不多做好了,第九师团看上去人不少。。
等秦都尉回来,他扣着陶振武的手腕?引开自己,陆七告谢起身恭敬伫立,就在秦昊靠近电子门的时候。。
幸运28模拟投注测试软件任由那帮生化人怎么用力的撞击,他既经决定?肚子好痛啊,为了我们这个百年积弱,我是中国人。...
加拿大28数据统计那就得依靠他们所在组织的强大情报网了,你怎地打起你师兄来了?命令二人率领读力师加快速度,二虎可以和他保持联系,现在连三八年还没到。...
pc蛋蛋预测器最新版要不是母亲拦着自己,从望远镜里他已经看见鬼子的火力增强了,陆七在兴化军是有十多位有了交情的战友,资历丰富了才有管理和统筹大局的能力这不是顽固不化的封建思想,秦昊有点无语了。...
pc蛋蛋幸运28预测网大神吧可是秦昊他却经历过,他没想到一个拎包的。来回扫了一眼这偌大的会场中坐着的人群,愣了一下心中一阵狂喜。...
pc蛋蛋牛人投注方法那名美国大兵在镜头前面说了一堆话,叶西涟替黄喜洗着澡?日军在打之前也不把对手的资料告诉他一声,不过他比断魂还强,不能参加会议。...
pc蛋蛋幸运28尽享论坛这颗珠子是哪儿来的,物种产生变异。我们女人怎么可以吊死在一棵树上,那一起吃个饭吧。...出处: Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务,比如,在实时性要求很高的应用场景下,可能希望来自消费方(Consumer)的调用响应时间最短,只需要选择Dubbo的Forking Cluster模式配置,就可以对一个调用请求并行发送到多台对等的提供方(Provider)服务所在的节点上,只选择最快一个返回响应的,然后将调用结果返回给服务消费方(Consumer),显然这种方式是以冗余服务为基础的,需要消耗更多的资源,但是能够满足高实时应用的需求。
有关Dubbo服务框架的简单使用,可以参考我的其他两篇文章(《基于Dubbo的Hessian协议实现远程调用》,《基于Dubbo的Hessian协议实现远程调用》,后面参考链接中已给出链接),这里主要围绕Dubbo分布式服务相关配置的使用来说明与实践。
Dubbo服务集群容错
假设我们使用的是单机模式的Dubbo服务,如果在服务提供方(Provider)发布服务以后,服务消费方(Consumer)发出一次调用请求,恰好这次由于网络问题调用失败,那么我们可以配置服务消费方重试策略,可能消费方第二次重试调用是成功的(重试策略只需要配置即可,重试过程是透明的);但是,如果服务提供方发布服务所在的节点发生故障,那么消费方再怎么重试调用都是失败的,所以我们需要采用集群容错模式,这样如果单个服务节点因故障无法提供服务,还可以根据配置的集群容错模式,调用其他可用的服务节点,这就提高了服务的可用性。
首先,根据Dubbo文档,我们引用文档提供的一个架构图以及各组件关系说明,如下所示:
上述各个组件之间的关系(引自Dubbo文档)说明如下:
这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。
Directory代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。
Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。
LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。
我们也简单说明目前Dubbo支持的集群容错模式,每种模式适应特定的应用场景,可以根据实际需要进行选择。Dubbo内置支持如下6种集群模式:
Failover Cluster模式
配置值为failover。这种模式是Dubbo集群容错默认的模式选择,调用失败时,会自动切换,重新尝试调用其他节点上可用的服务。对于一些幂等性操作可以使用该模式,如读操作,因为每次调用的副作用是相同的,所以可以选择自动切换并重试调用,对调用者完全透明。可以看到,如果重试调用必然会带来响应端的延迟,如果出现大量的重试调用,可能说明我们的服务提供方发布的服务有问题,如网络延迟严重、硬件设备需要升级、程序算法非常耗时,等等,这就需要仔细检测排查了。
例如,可以这样显式指定Failover模式,或者不配置则默认开启Failover模式,配置示例如下:
&dubbo:service interface=&org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService& version=&1.0.0&
cluster=&failover& retries=&2& timeout=&1000& ref=&chatRoomOnlineUserCounterService& protocol=&dubbo& &
&dubbo:method name=&queryRoomUserCount& timeout=&500& retries=&2& /&
&/dubbo:service&
上述配置使用Failover Cluster模式,如果调用失败一次,可以再次重试2次调用,服务级别调用超时时间为100ms,调用方法queryRoomUserCount的超时时间为80ms,允许重试两次,最坏情况调用花费时间160ms。如果该服务接口org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService还有其他的方法可供调用,则其他方法没有显式配置则会继承使用dubbo:service配置的属性值。
Failfast Cluster模式
配置值为failfast。这种模式称为快速失败模式,调用只执行一次,失败则立即报错。这种模式适用于非幂等性操作,每次调用的副作用是不同的,如写操作,比如交易系统我们要下订单,如果一次失败就应该让它失败,通常由服务消费方控制是否重新发起下订单操作请求(另一个新的订单)。
Failsafe Cluster模式
配置值为failsafe。失败安全模式,如果调用失败, 则直接忽略失败的调用,而是要记录下失败的调用到日志文件,以便后续审计。
Failback Cluster模式
配置值为failback。失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster模式
配置值为forking。并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
Broadcast Cluster模式
配置值为broadcast。广播调用所有提供者,逐个调用,任意一台报错则报错(2.1.0开始支持)。通常用于通知所有提供者更新缓存或日志等本地资源信息。
上面的6种模式都可以应用于生产环境,我们可以根据实际应用场景选择合适的集群容错模式。如果我们觉得Dubbo内置提供的几种集群容错模式都不能满足应用需要,也可以定制实现自己的集群容错模式,因为Dubbo框架给我提供的扩展的接口,只需要实现接口com.alibaba.dubbo.rpc.cluster.Cluster即可,接口定义如下所示:
@SPI(FailoverCluster.NAME)
public interface Cluster {
* Merge the directory invokers to a virtual invoker.
* @param &T&
* @param directory
* @return cluster invoker
* @throws RpcException
&T& Invoker&T& join(Directory&T& directory) throws RpcE
关于如何实现一个自定义的集群容错模式,可以参考Dubbo源码中内置支持的汲取你容错模式的实现,6种模式对应的实现类如下所示:
com.alibaba.dubbo.rpc.cluster.support.FailoverCluster
com.alibaba.dubbo.rpc.cluster.support.FailfastCluster
com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster
com.alibaba.dubbo.rpc.cluster.support.FailbackCluster
com.alibaba.dubbo.rpc.cluster.support.ForkingCluster
com.alibaba.dubbo.rpc.cluster.support.AvailableCluster
可能我们初次接触Dubbo时,不知道如何在实际开发过程中使用Dubbo的集群模式,后面我们会以Failover Cluster模式为例开发我们的分布式应用,再进行详细的介绍。
Dubbo服务负载均衡
Dubbo框架内置提供负载均衡的功能以及扩展接口,我们可以透明地扩展一个服务或服务集群,根据需要非常容易地增加/移除节点,提高服务的可伸缩性。Dubbo框架内置提供了4种负载均衡策略,如下所示:
Random LoadBalance:随机策略,配置值为random。可以设置权重,有利于充分利用服务器的资源,高配的可以设置权重大一些,低配的可以稍微小一些
RoundRobin LoadBalance:轮询策略,配置值为roundrobin。
LeastActive LoadBalance:配置值为leastactive。根据请求调用的次数计数,处理请求更慢的节点会受到更少的请求
ConsistentHash LoadBalance:一致性Hash策略,具体配置方法可以参考Dubbo文档。相同调用参数的请求会发送到同一个服务提供方节点上,如果某个节点发生故障无法提供服务,则会基于一致性Hash算法映射到虚拟节点上(其他服务提供方)
在实际使用中,只需要选择合适的负载均衡策略值,配置即可,下面是上述四种负载均衡策略配置的示例:
&dubbo:service interface=&org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService& version=&1.0.0&
cluster=&failover& retries=&2& timeout=&1000& loadbalance=&random&
ref=&chatRoomOnlineUserCounterService& protocol=&dubbo& &
&dubbo:method name=&queryRoomUserCount& timeout=&500& retries=&2& loadbalance=&leastactive& /&
&/dubbo:service&
上述配置,也体现了Dubbo配置的继承性特点,也就是dubbo:service元素配置了loadbalance=”random”,则该元素的子元素dubbo:method如果没有指定负载均衡策略,则默认为loadbalance=”random”,否则如果dubbo:method指定了loadbalance=”leastactive”,则使用子元素配置的负载均衡策略覆盖了父元素指定的策略(这里调用queryRoomUserCount方法使用leastactive负载均衡策略)。
当然,Dubbo框架也提供了实现自定义负载均衡策略的接口,可以实现com.alibaba.dubbo.rpc.cluster.LoadBalance接口,接口定义如下所示:
* LoadBalance. (SPI, Singleton, ThreadSafe)
* &a href=&http://en.wikipedia.org/wiki/Load_balancing_(computing)&&Load-Balancing&/a&
* @see com.alibaba.dubbo.rpc.cluster.Cluster#join(Directory)
* @author qian.lei
* @author william.liangf
@SPI(RandomLoadBalance.NAME)
public interface LoadBalance {
* select one invoker in list.
* @param invokers invokers.
* @param url refer url
* @param invocation invocation.
* @return selected invoker.
@Adaptive(&loadbalance&)
&T& Invoker&T& select(List&Invoker&T&& invokers, URL url, Invocation invocation) throws RpcE
如何实现一个自定义负载均衡策略,可以参考Dubbo框架内置的实现,如下所示的3个实现类:
com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
Dubbo服务集群容错实践
手机应用是以聊天室为基础的,我们需要收集用户的操作行为,然后计算聊天室中在线人数,并实时在手机应用端显示人数,整个系统的架构如图所示:
上图中,主要包括了两大主要流程:日志收集并实时处理流程、调用读取实时计算结果流程,我们使用基于Dubbo框架开发的服务来提供实时计算结果读取聊天人数的功能。上图中,实际上业务接口服务器集群也可以基于Dubbo框架构建服务,就看我们想要构建什么样的系统来满足我们的需要。
如果不使用注册中心,服务消费方也能够直接调用服务提供方发布的服务,这样需要服务提供方将服务地址暴露给服务消费方,而且也无法使用监控中心的功能,这种方式成为直连。
如果我们使用注册中心,服务提供方将服务发布到注册中心,而服务消费方可以通过注册中心订阅服务,接收服务提供方服务变更通知,这种方式可以隐藏服务提供方的细节,包括服务器地址等敏感信息,而服务消费方只能通过注册中心来获取到已注册的提供方服务,而不能直接跨过注册中心与服务提供方直接连接。这种方式的好处是还可以使用监控中心服务,能够对服务的调用情况进行监控分析,还能使用Dubbo服务管理中心,方便管理服务,我们在这里使用的是这种方式,也推荐使用这种方式。使用注册中心的Dubbo分布式服务相关组件结构,如下图所示:
下面,开发部署我们的应用,通过如下4个步骤来完成:
服务接口定义
服务接口将服务提供方(Provider)和服务消费方(Consumer)连接起来,服务提供方实现接口中定义的服务,即给出服务的实现,而服务消费方负责调用服务。我们接口中给出了2个方法,一个是实时查询获取当前聊天室内人数,另一个是查询一天中某个/某些聊天室中在线人数峰值,接口定义如下所示:
package org.shirdrn.dubbo.
import java.util.L
public interface ChatRoomOnlineUserCounterService {
String queryRoomUserCount(String rooms);
List&String& getMaxOnlineUserCount(List&String& rooms, String date, String dateFormat);
接口是服务提供方和服务消费方公共遵守的协议,一般情况下是服务提供方将接口定义好后提供给服务消费方。
服务提供方
服务提供方实现接口中定义的服务,其实现和普通的服务没什么区别,我们的实现类为ChatRoomOnlineUserCounterServiceImpl,代码如下所示:
package org.shirdrn.dubbo.provider.
import java.util.L
import mons.logging.L
import mons.logging.LogF
import org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterS
import org.mon.utils.DateTimeU
import redis.clients.jedis.J
import redis.clients.jedis.JedisP
import com.mon.utils.StringU
import mon.base.S
import mon.collect.L
public class ChatRoomOnlineUserCounterServiceImpl implements ChatRoomOnlineUserCounterService {
private static final Log LOG = LogFactory.getLog(ChatRoomOnlineUserCounterServiceImpl.class);
private JedisPool jedisP
private static final String KEY_USER_COUNT = &chat::room::play::user::cnt&;
private static final String KEY_MAX_USER_COUNT_PREFIX = &chat::room::max::user::cnt::&;
private static final String DF_YYYYMMDD = &yyyyMMdd&;
public String queryRoomUserCount(String rooms) {
(&Params[Server|Recv|REQ] rooms=& + rooms);
StringBuffer builder = new StringBuffer();
if(!Strings.isNullOrEmpty(rooms)) {
Jedis jedis =
jedis = jedisPool.getResource();
String[] fields = rooms.split(&,&);
List&String& results = jedis.hmget(KEY_USER_COUNT, fields);
builder.append(StringUtils.join(results, &,&));
} catch (Exception e) {
LOG.error(&&, e);
} finally {
if(jedis != null) {
jedis.close();
(&Result[Server|Recv|RES] & + builder.toString());
return builder.toString();
public List&String& getMaxOnlineUserCount(List&String& rooms, String date, String dateFormat) {
// HGETALL chat::room::max::user::cnt::
(&Params[Server|Recv|REQ] rooms=& + rooms + &,date=& + date + &,dateFormat=& + dateFormat);
String whichDate = DateTimeUtils.format(date, dateFormat, DF_YYYYMMDD);
String key = KEY_MAX_USER_COUNT_PREFIX + whichD
StringBuffer builder = new StringBuffer();
if(rooms != null && !rooms.isEmpty()) {
Jedis jedis =
jedis = jedisPool.getResource();
return jedis.hmget(key, rooms.toArray(new String[rooms.size()]));
} catch (Exception e) {
LOG.error(&&, e);
} finally {
if(jedis != null) {
jedis.close();
(&Result[Server|Recv|RES] & + builder.toString());
return Lists.newArrayList();
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisP
代码中通过读取Redis中数据来完成调用,逻辑比较简单。对应的Maven POM依赖配置,如下所示:
&dependencies&
&dependency&
&groupId&org.shirdrn.dubbo&/groupId&
&artifactId&dubbo-api&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&dependency&
&groupId&org.shirdrn.dubbo&/groupId&
&artifactId&dubbo-commons&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&dependency&
&groupId&redis.clients&/groupId&
&artifactId&jedis&/artifactId&
&version&2.5.2&/version&
&/dependency&
&dependency&
&groupId&mons&/groupId&
&artifactId&commons-pool2&/artifactId&
&version&2.2&/version&
&/dependency&
&dependency&
&groupId&org.jboss.netty&/groupId&
&artifactId&netty&/artifactId&
&version&3.2.7.Final&/version&
&/dependency&
&/dependencies&
有关对Dubbo框架的一些依赖,我们单独放到一个通用的Maven Module中(详见后面“附录:Dubbo使用Maven构建依赖配置”),这里不再多说。服务提供方实现,最关键的就是服务的配置,因为Dubbo基于Spring来管理配置和实例,所以通过配置可以指定服务是否是分布式服务,以及通过配置增加很多其它特性。我们的配置文件为provider-cluster.xml,内容如下所示:
&?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:dubbo=&/schema/dubbo&
xmlns:p=&http://www.springframework.org/schema/p&
xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
/schema/dubbo /schema/dubbo/dubbo.xsd&&
&bean class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&systemPropertiesModeName& value=&SYSTEM_PROPERTIES_MODE_OVERRIDE& /&
&property name=&ignoreResourceNotFound& value=&true& /&
&property name=&locations&&
&value&classpath*:jedis.properties&/value&
&/property&
&dubbo:application name=&chatroom-cluster-provider& /&
&dubbo:registry address=&zookeeper://zk1:2181?backup=zk2:2181,zk3:2181& /&
&dubbo:protocol name=&dubbo& port=&20880& /&
&dubbo:service interface=&org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService& version=&1.0.0&
cluster=&failover& retries=&2& timeout=&1000& loadbalance=&random& actives=&100& executes=&200&
ref=&chatRoomOnlineUserCounterService& protocol=&dubbo& &
&dubbo:method name=&queryRoomUserCount& timeout=&500& retries=&2& loadbalance=&roundrobin& actives=&50& /&
&/dubbo:service&
&bean id=&chatRoomOnlineUserCounterService& class=&org.shirdrn.dubbo.provider.service.ChatRoomOnlineUserCounterServiceImpl& &
&property name=&jedisPool& ref=&jedisPool& /&
&bean id=&jedisPool& class=&redis.clients.jedis.JedisPool& destroy-method=&destroy&&
&constructor-arg index=&0&&
&bean class=&mons.pool2.impl.GenericObjectPoolConfig&&
&property name=&maxTotal& value=&${redis.pool.maxTotal}& /&
&property name=&maxIdle& value=&${redis.pool.maxIdle}& /&
&property name=&minIdle& value=&${redis.pool.minIdle}& /&
&property name=&maxWaitMillis& value=&${redis.pool.maxWaitMillis}& /&
&property name=&testOnBorrow& value=&${redis.pool.testOnBorrow}& /&
&property name=&testOnReturn& value=&${redis.pool.testOnReturn}& /&
&property name=&testWhileIdle& value=&true& /&
&/constructor-arg&
&constructor-arg index=&1& value=&${redis.host}& /&
&constructor-arg index=&2& value=&${redis.port}& /&
&constructor-arg index=&3& value=&${redis.timeout}& /&
上面配置中,使用dubbo协议,集群容错模式为failover,服务级别负载均衡策略为random,方法级别负载均衡策略为roundrobin(它覆盖了服务级别的配置内容),其他一些配置内容可以参考Dubbo文档。我们这里是从Redis读取数据,所以使用了Redis连接池。
启动服务示例代码如下所示:
package org.shirdrn.dubbo.
import org.shirdrn.mon.DubboS
public class ChatRoomClusterServer {
public static void main(String[] args) throws Exception {
DubboServer.startServer(&classpath:provider-cluster.xml&);
上面调用了DubboServer类的静态方法startServer,如下所示:
public static void startServer(String config) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
context.start();
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} finally {
context.close();
方法中主要是初始化Spring IoC容器,全部对象都交由容器来管理。
服务消费方
服务消费方就容易了,只需要知道注册中心地址,并引用服务提供方提供的接口,消费方调用服务实现如下所示:
package org.shirdrn.dubbo.
import java.util.A
import java.util.L
import mons.logging.L
import mons.logging.LogF
import org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterS
import org.springframework.context.support.AbstractXmlApplicationC
import org.springframework.context.support.ClassPathXmlApplicationC
public class ChatRoomDubboConsumer {
private static final Log LOG = LogFactory.getLog(ChatRoomDubboConsumer.class);
public static void main(String[] args) throws Exception {
AbstractXmlApplicationContext context = new ClassPathXmlApplicationContext(&classpath:consumer.xml&);
context.start();
ChatRoomOnlineUserCounterService chatRoomOnlineUserCounterService = (ChatRoomOnlineUserCounterService) context.getBean(&chatRoomOnlineUserCounterService&);
getMaxOnlineUserCount(chatRoomOnlineUserCounterService);
getRealtimeOnlineUserCount(chatRoomOnlineUserCounterService);
System.in.read();
} finally {
context.close();
private static void getMaxOnlineUserCount(ChatRoomOnlineUserCounterService liveRoomOnlineUserCountService) {
List&String& maxUserCounts = liveRoomOnlineUserCountService.getMaxOnlineUserCount(
Arrays.asList(new String[] {&& , &&, &&, &&, &&}), &&, &yyyyMMdd&);
(&After getMaxOnlineUserCount invoked: maxUserCounts= & + maxUserCounts);
private static void getRealtimeOnlineUserCount(ChatRoomOnlineUserCounterService liveRoomOnlineUserCountService)
throws InterruptedException {
String rooms = &,,,,&;
String onlineUserCounts = liveRoomOnlineUserCountService.queryRoomUserCount(rooms);
(&After queryRoomUserCount invoked: onlineUserCounts= & + onlineUserCounts);
对应的配置文件为consumer.xml,内容如下所示:
&?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:dubbo=&/schema/dubbo&
xsi:schemaLocation=&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
/schema/dubbo /schema/dubbo/dubbo.xsd&&
&dubbo:application name=&chatroom-consumer& /&
&dubbo:registry address=&zookeeper://zk1:2181?backup=zk2:2181,zk3:2181& /&
&dubbo:reference id=&chatRoomOnlineUserCounterService& interface=&org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService& version=&1.0.0&&
&dubbo:method name=&queryRoomUserCount& retries=&2& /&
&/dubbo:reference&
也可以根据需要配置dubbo:reference相关的属性值,也可以配置dubbo:method指定调用的方法的配置信息,详细配置属性可以参考Dubbo官方文档。
部署与验证
开发完成提供方服务后,在本地开发调试的时候可以怎么简单怎么做,如果是要部署到生产环境,则需要打包后进行部署,可以参考下面的Maven POM配置:
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-shade-plugin&/artifactId&
&version&1.4&/version&
&configuration&
&createDependencyReducedPom&true&/createDependencyReducedPom&
&/configuration&
&executions&
&execution&
&phase&package&/phase&
&goal&shade&/goal&
&configuration&
&transformers&
&transformer implementation=&org.apache.maven.plugins.shade.resource.ServicesResourceTransformer& /&
&transformer implementation=&org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&&
&mainClass&org.shirdrn.dubbo.provider.ChatRoomClusterServer&/mainClass&
&/transformer&
&/transformers&
&/configuration&
&/execution&
&/executions&
&/plugins&
这里也给出Maven POM依赖的简单配置:
&dependencies&
&dependency&
&groupId&org.shirdrn.dubbo&/groupId&
&artifactId&dubbo-api&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&/dependencies&
我们开发的服务应该是分布式的,首先是通过配置内容来决定,例如设置集群模式、设置负载均衡模式等,然后在部署的时候,可以在多个节点上同一个服务,这样多个服务都会注册到Dubbo注册中心,如果某个节点上的服务不可用了,可以根据我们配置的策略来选择其他节点上的可用服务,后面通过Dubbo服务管理中心和监控中心就能更加清楚明了。
Dubbo服务管理与监控
我们需要在安装好管理中心和监控中心以后,再将上面的开发的提供方服务部署到物理节点上,然后就能够通过管理中心和监控中心来查看对应的详细情况。
Dubbo服务管理中心
安装Dubbo服务管理中心,需要选择一个Web容器,我们使用Tomcat服务器。首先下载Dubbo管理中心安装文件dubbo-admin-2.5.3.war,或者直接从源码构建得到该WAR文件。这里,我们已经构建好对应的WAR文件,然后进行安装,执行如下命令:
cd apache-tomcat-6.0.35
rm -rf webapps/ROOT
unzip ~/dubbo-admin-2.5.3.war -d webapps/ROOT
修改配置文件~/apache-tomcat-6.0.35/webapps/ROOT/WEB-INF/dubbo.properties,指定我们的注册中心地址以及登录密码,内容如下所示:
dubbo.registry.address=zookeeper://zk1:2181?backup=zk2:2181,zk3:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
然后,根据需要修改~/apache-tomcat-6.0.35/conf/server.xml配置文件,主要是Tomcat HTTP 端口号(我这里使用8083端口),完成后可以直接启动Tomcat服务器:
cd ~/apache-tomcat-6.0.35/
bin/catalina.sh start
然后访问地址
即可,根据配置文件指定的root用户密码,就可以登录Dubbo管理控制台。
我们将上面开发的服务提供方服务,部署到2个独立的节点上(192.168.14.1和10.10.4.125),然后可以通过Dubbo管理中心查看对应服务的状况,如图所示:
上图中可以看出,该服务有两个独立的节点可以提供,因为配置的集群模式为failover,如果某个节点的服务发生故障无法使用,则会自动透明地重试另一个节点上的服务,这样就不至于出现拒绝服务的情况。如果想要查看提供方某个节点上的服务详情,可以点击对应的IP:Port链接,示例如图所示:
上图可以看到服务地址:
dubbo://10.10.4.125:20880/org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService?actives=100&anyhost=true&application=chatroom-cluster-provider&cluster=failover&dubbo=0.0.1-SNAPSHOT&executes=200&interface=org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService&loadbalance=random&methods=getMaxOnlineUserCount,queryRoomUserCount&pid=30942&queryRoomUserCount.actives=50&queryRoomUserCount.loadbalance=leastactive&queryRoomUserCount.retries=2&queryRoomUserCount.timeout=500&retries=2&revision=0.0.1-SNAPSHOT&side=provider&timeout=1000×tamp=4&version=1.0.0
如果我们直接暴露该地址也是可以的,不过这种直连的方式对服务消费方不是透明的,如果以后IP地址更换,也会影响调用方,所以最好是通过注册中心来隐蔽服务地址。同一个服务所部署在的多个节点上,也就对应对应着多个服务地址。另外,也可以对已经发布的服务进行控制,如修改访问控制、负载均衡相关配置内容等,可以通过上图中“消费者”查看服务消费方调用服务的情况,如图所示:
也在管理控制台可以对消费方进行管理控制。
Dubbo监控中心
Dubbo监控中心是以Dubbo服务的形式发布到注册中心,和普通的服务时一样的。例如,我这里下载了Dubbo自带的简易监控中心文件dubbo-monitor-simple-2.5.3-assembly.tar.gz,可以解压缩以后,修改配置文件~/dubbo-monitor-simple-2.5.3/conf/dubbo.properties的内容,如下所示:
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
dubbo.registry.address=zookeeper://zk1:2181?backup=zk2:2181,zk3:2181
dubbo.protocol.port=7070
dubbo.jetty.port=8087
dubbo.jetty.directory=${user.home}/monitor
dubbo.charts.directory=${dubbo.jetty.directory}/charts
dubbo.statistics.directory=${user.home}/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
然后启动简易监控中心,执行如下命令:
cd ~/dubbo-monitor-simple-2.5.3
bin/start.sh
这里使用了Jetty Web容器,访问地址
就可以查看监控中心,Applications选项卡页面包含了服务提供方和消费方的基本信息,如图所示:
上图主要列出了所有提供方发布的服务、消费方调用、服务依赖关系等内容。
接着,查看Services选项卡页面,包含了服务提供方提供的服务列表,如图所示:
点击上图中Providers链接就能看到服务提供方的基本信息,包括服务地址等,如图所示:
点击上图中Consumers链接就能看到服务消费方的基本信息,包括服务地址等,如图所示:
由于上面是Dubbo自带的一个简易监控中心,可能所展现的内容并不能满足我们的需要,所以可以根据需要开发自己的监控中心。Dubbo也提供了监控中心的扩展接口,如果想要实现自己的监控中心,可以实现接口com.alibaba.dubbo.monitor.MonitorFactory和com.alibaba.dubbo.monitor.Monitor,其中MonitorFactory接口定义如下所示:
* MonitorFactory. (SPI, Singleton, ThreadSafe)
* @author william.liangf
@SPI(&dubbo&)
public interface MonitorFactory {
* Create monitor.
* @param url
* @return monitor
@Adaptive(&protocol&)
Monitor getMonitor(URL url);
Monitor接口定义如下所示:
* Monitor. (SPI, Prototype, ThreadSafe)
* @see com.alibaba.dubbo.monitor.MonitorFactory#getMonitor(com.mon.URL)
* @author william.liangf
public interface Monitor extends Node, MonitorService {
具体定义内容可以查看MonitorService接口,不再累述。
Dubbo还提供了其他很多高级特性,如路由规则、参数回调、服务分组、服务降级等等,而且很多特性在给出内置实现的基础上,还给出了扩展的接口,我们可以给出自定义的实现,非常方便而且强大。更多可以参考Dubbo官网用户手册和开发人员手册。
附录:Dubbo使用Maven构建依赖配置
&properties&
&spring.version&3.2.8.RELEASE&/spring.version&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&/properties&
&dependencies&
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&dubbo&/artifactId&
&version&2.5.3&/version&
&exclusions&
&exclusion&
&groupId&org.springframework&/groupId&
&artifactId&spring&/artifactId&
&/exclusion&
&exclusion&
&groupId&org.apache.zookeeper&/groupId&
&artifactId&zookeeper&/artifactId&
&/exclusion&
&exclusion&
&groupId&org.jboss.netty&/groupId&
&artifactId&netty&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-beans&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context-support&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-api&/artifactId&
&version&1.6.2&/version&
&/dependency&
&dependency&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&version&1.2.16&/version&
&/dependency&
&dependency&
&groupId&org.javassist&/groupId&
&artifactId&javassist&/artifactId&
&version&3.15.0-GA&/version&
&/dependency&
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&hessian-lite&/artifactId&
&version&3.2.1-fixed-2&/version&
&/dependency&
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&fastjson&/artifactId&
&version&1.1.8&/version&
&/dependency&
&dependency&
&groupId&org.jvnet.sorcerer&/groupId&
&artifactId&sorcerer-javac&/artifactId&
&version&0.8&/version&
&/dependency&
&dependency&
&groupId&org.apache.zookeeper&/groupId&
&artifactId&zookeeper&/artifactId&
&version&3.4.5&/version&
&/dependency&
&dependency&
&groupId&com.github.sgroschupf&/groupId&
&artifactId&zkclient&/artifactId&
&version&0.1&/version&
&/dependency&
&dependency&
&groupId&org.jboss.netty&/groupId&
&artifactId&netty&/artifactId&
&version&3.2.7.Final&/version&
&/dependency&
&/dependencies&
相关 [dubbo 框架 服务] 推荐:
- 人月神话的BLOG
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和
Spring框架无缝集成. 它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合). 从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色.
- tangfl - ITeye论坛最新精华讨论帖
services with
invocations everyday, Dubbo becomes the key part of Alibaba&s SOA solution and has been deployed to the
Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式.
- 简单之美
有关Dubbo服务框架的简单使用,可以参考我的其他两篇文章(《基于Dubbo的Hessian协议实现远程调用》,《基于Dubbo的Hessian协议实现远程调用》,后面参考链接中已给出链接),这里主要围绕Dubbo分布式服务相关配置的使用来说明与实践. 首先,根据Dubbo文档,我们引用文档提供的一个架构图以及各组件关系说明,如下所示:.
- Arccode's blog
Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo自2011年开源后,已被许多非阿里系公司使用. 项目主页:
http://dubbo.io/Home-zh.htm.
- Linux - 操作系统 - ITeye博客
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的. 现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应. 大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡.
- 企业架构 - ITeye博客
随着快的业务的快速发展,我们逐步按照业务垂直划分,抽象出基础服务层. 基础业务的服务为上游业务的灵活发展提供支持. 服务应用本身无状态化,可以随着系统的负荷灵活伸缩来提供服务能. 服务的稳定性,可用性达到99%. dubbo来作为服务化中间件,dubbo作为一个RPC框架,大致的原理如下图. Registry: 注册中心;和服务的消费者,和服务提供者都建立长连接.
- 博客园_首页
dubbo服务发布之后,我们可以利用telnet命令进行调试、管理. Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以
Windows为例抛砖引玉一下:.
测试对应IP和端口下的dubbo服务是否连通,cmd命令如下.
正常情况下,进入telnet窗口,键入回车进入dubbo命令模式.
- ITeye博客
并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦
,只闻其声,不能见其物. 而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身
集成了监控中心,注册中心,负载集群...等等. 代码和整体的框架还是很优雅滴呀. github地址 /alibaba/dubbo.
- 博客园_首页
  Dubbo RPC服务框架支持丰富的传输协议、序列化方式等通讯相关的配置和扩展. 更多关于dubbo详细介绍请参照官方文档(
http://alibaba.github.io/dubbo-doc-static/Home-zh.htm).   1、支持常见的传输协议:RMI、Dubbo、Hessain、WebService、Http等,其中Dubbo和RMI协议基于TCP实现,Hessian和WebService基于HTTP实现.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。

我要回帖

更多关于 执行自定义数据源 的文章

 

随机推荐