Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
»ùÓÚDubbo¿ò¼Ü¹¹½¨·Ö²¼Ê½·þÎñ
 
×÷ÕߣºYanjun À´Ô´£º¼òµ¥Ö®ÃÀ   ·¢²¼ÓÚ 2015-8-17
  4328  次浏览      27
 

DubboÊÇAlibaba¿ªÔ´µÄ·Ö²¼Ê½·þÎñ¿ò¼Ü£¬ÎÒÃÇ¿ÉÒԷdz£ÈÝÒ×µØÍ¨¹ýDubboÀ´¹¹½¨·Ö²¼Ê½·þÎñ£¬²¢¸ù¾Ý×Ô¼ºÊµ¼ÊÒµÎñÓ¦Óó¡¾°À´Ñ¡ÔñºÏÊʵļ¯ÈºÈÝ´íģʽ£¬Õâ¸ö¶ÔÓںܶàÓ¦Óö¼ÊÇÆÈÇÐÏ£ÍûµÄ£¬Ö»ÐèҪͨ¹ý¼òµ¥µÄÅäÖþÍÄܹ»ÊµÏÖ·Ö²¼Ê½·þÎñµ÷Óã¬Ò²¾ÍÊÇ˵·þÎñÌṩ·½£¨Provider£©·¢²¼µÄ·þÎñ¿ÉÒÔÌìÈ»¾ÍÊǼ¯Èº·þÎñ£¬±ÈÈ磬ÔÚʵʱÐÔÒªÇóºÜ¸ßµÄÓ¦Óó¡¾°Ï£¬¿ÉÄÜÏ£ÍûÀ´×ÔÏû·Ñ·½£¨Consumer£©µÄµ÷ÓÃÏìӦʱ¼ä×î¶Ì£¬Ö»ÐèҪѡÔñDubboµÄForking ClusterģʽÅäÖ㬾ͿÉÒÔ¶ÔÒ»¸öµ÷ÓÃÇëÇó²¢Ðз¢Ë͵½¶ą̀¶ÔµÈµÄÌṩ·½£¨Provider£©·þÎñËùÔڵĽڵãÉÏ£¬Ö»Ñ¡Ôñ×î¿ìÒ»¸ö·µ»ØÏìÓ¦µÄ£¬È»ºó½«µ÷Óýá¹û·µ»Ø¸ø·þÎñÏû·Ñ·½£¨Consumer£©£¬ÏÔÈ»ÕâÖÖ·½Ê½ÊÇÒÔÈßÓà·þÎñΪ»ù´¡µÄ£¬ÐèÒªÏûºÄ¸ü¶àµÄ×ÊÔ´£¬µ«ÊÇÄܹ»Âú×ã¸ßʵʱӦÓõÄÐèÇó¡£

ÓйØDubbo·þÎñ¿ò¼ÜµÄ¼òµ¥Ê¹Ó㬿ÉÒԲο¼Î񵀮äËûÁ½ÆªÎÄÕ£¨¡¶»ùÓÚDubboµÄHessianЭÒéʵÏÖÔ¶³Ìµ÷Óá·£¬¡¶»ùÓÚDubboµÄHessianЭÒéʵÏÖÔ¶³Ìµ÷Óá·£¬ºóÃæ²Î¿¼Á´½ÓÖÐÒѸø³öÁ´½Ó£©£¬ÕâÀïÖ÷ÒªÎ§ÈÆDubbo·Ö²¼Ê½·þÎñÏà¹ØÅäÖõÄʹÓÃÀ´ËµÃ÷Óëʵ¼ù¡£

Dubbo·þÎñ¼¯ÈºÈÝ´í

¼ÙÉèÎÒÃÇʹÓõÄÊǵ¥»úģʽµÄDubbo·þÎñ£¬Èç¹ûÔÚ·þÎñÌṩ·½£¨Provider£©·¢²¼·þÎñÒԺ󣬷þÎñÏû·Ñ·½£¨Consumer£©·¢³öÒ»´Îµ÷ÓÃÇëÇó£¬Ç¡ºÃÕâ´ÎÓÉÓÚÍøÂçÎÊÌâµ÷ÓÃʧ°Ü£¬ÄÇôÎÒÃÇ¿ÉÒÔÅäÖ÷þÎñÏû·Ñ·½ÖØÊÔ²ßÂÔ£¬¿ÉÄÜÏû·Ñ·½µÚ¶þ´ÎÖØÊÔµ÷ÓÃÊdzɹ¦µÄ£¨ÖØÊÔ²ßÂÔÖ»ÐèÒªÅäÖü´¿É£¬ÖØÊÔ¹ý³ÌÊÇ͸Ã÷µÄ£©£»µ«ÊÇ£¬Èç¹û·þÎñÌṩ·½·¢²¼·þÎñËùÔڵĽڵ㷢Éú¹ÊÕÏ£¬ÄÇôÏû·Ñ·½ÔÙÔõÃ´ÖØÊÔµ÷Óö¼ÊÇʧ°ÜµÄ£¬ËùÒÔÎÒÃÇÐèÒª²ÉÓü¯ÈºÈÝ´íģʽ£¬ÕâÑùÈç¹ûµ¥¸ö·þÎñ½ÚµãÒò¹ÊÕÏÎÞ·¨Ìṩ·þÎñ£¬»¹¿ÉÒÔ¸ù¾ÝÅäÖõļ¯ÈºÈÝ´íģʽ£¬µ÷ÓÃÆäËû¿ÉÓõķþÎñ½Úµã£¬Õâ¾ÍÌá¸ßÁË·þÎñµÄ¿ÉÓÃÐÔ¡£

Ê×ÏÈ£¬¸ù¾Ý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"
2
cluster="failover" retries="2" timeout="100" ref="chatRoomOnlineUserCounterService" protocol="dubbo" >
3
<dubbo:method name="queryRoomUserCount" timeout="80" retries="2" />
4
</dubbo:service>

ÉÏÊöÅäÖÃʹÓÃFailover Clusterģʽ£¬Èç¹ûµ÷ÓÃʧ°ÜÒ»´Î£¬¿ÉÒÔÔÙ´ÎÖØÊÔ2´Îµ÷Ó㬷þÎñ¼¶±ðµ÷Óó¬Ê±Ê±¼äΪ100ms£¬µ÷Ó÷½·¨queryRoomUserCountµÄ³¬Ê±Ê±¼äΪ80ms£¬ÔÊÐíÖØÊÔ2´Î£¬×Çé¿öµ÷Óû¨·Ñʱ¼ä160ms¡£Èç¹û¸Ã·þÎñ½Ó¿Úorg.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService»¹ÓÐÆäËûµÄ·½·¨¿É¹©µ÷Óã¬ÔòÆäËû·½·¨Ã»ÓÐÏÔʽÅäÖÃÔò»á¼Ì³ÐʹÓÃdubbo:serviceÅäÖõÄÊôÐÔÖµ¡£

Failfast Clusterģʽ

ÅäÖÃֵΪfailfast¡£ÕâÖÖģʽ³ÆÎª¿ìËÙʧ°Üģʽ£¬µ÷ÓÃÖ»Ö´ÐÐÒ»´Î£¬Ê§°ÜÔòÁ¢¼´±¨´í¡£ÕâÖÖģʽÊÊÓÃÓÚ·ÇÃݵÈÐÔ²Ù×÷£¬Ã¿´Îµ÷Óõĸ±×÷ÓÃÊDz»Í¬µÄ£¬Èçд²Ù×÷£¬±ÈÈç½»Ò×ϵͳÎÒÃÇҪ϶©µ¥£¬Èç¹ûÒ»´Îʧ°Ü¾ÍÓ¦¸ÃÈÃËüʧ°Ü£¬Í¨³£ÓÉ·þÎñÏû·Ñ·½¿ØÖÆÊÇ·ñÖØÐ·¢Æð϶©µ¥²Ù×÷ÇëÇó£¨ÁíÒ»¸öÐµĶ©µ¥£©¡£

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)
02
public interface Cluster {
03

04
/**
05
* Merge the directory invokers to a virtual invoker.
06
* @param <T>
07
* @param directory
08
* @return cluster invoker
09
* @throws RpcException
10
*/
11
@Adaptive
12
<T> Invoker<T> join(Directory<T> directory) throws RpcException;
13

14
}

¹ØÓÚÈçºÎʵÏÖÒ»¸ö×Ô¶¨ÒåµÄ¼¯ÈºÈÝ´íģʽ£¬¿ÉÒԲο¼DubboÔ´ÂëÖÐÄÚÖÃÖ§³ÖµÄ¼³È¡ÄãÈÝ´íģʽµÄʵÏÖ£¬6ÖÖģʽ¶ÔÓ¦µÄʵÏÖÀàÈçÏÂËùʾ£º

com.alibaba.dubbo.rpc.cluster.support.FailoverCluster
2
com.alibaba.dubbo.rpc.cluster.support.FailfastCluster
3
com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster
4
com.alibaba.dubbo.rpc.cluster.support.FailbackCluster
5
com.alibaba.dubbo.rpc.cluster.support.ForkingCluster
6
com.alibaba.dubbo.rpc.cluster.support.AvailableCluster

¿ÉÄÜÎÒÃdzõ´Î½Ó´¥Dubboʱ£¬²»ÖªµÀÈçºÎÔÚʵ¼Ê¿ª·¢¹ý³ÌÖÐʹÓÃDubboµÄ¼¯ÈºÄ£Ê½£¬ºóÃæÎÒÃÇ»áÒÔFailover ClusterģʽΪÀý¿ª·¢ÎÒÃǵķֲ¼Ê½Ó¦Óã¬ÔÙ½øÐÐÏêϸµÄ½éÉÜ¡£

Dubbo·þÎñ¸ºÔؾùºâ

Dubbo¿ò¼ÜÄÚÖÃÌṩ¸ºÔؾùºâµÄ¹¦ÄÜÒÔ¼°À©Õ¹½Ó¿Ú£¬ÎÒÃÇ¿ÉÒÔ͸Ã÷µØÀ©Õ¹Ò»¸ö·þÎñ»ò·þÎñ¼¯Èº£¬¸ù¾ÝÐèÒª·Ç³£ÈÝÒ×µØÔö¼Ó/ÒÆ³ý½Úµã£¬Ìá¸ß·þÎñµÄ¿ÉÉìËõÐÔ¡£Dubbo¿ò¼ÜÄÚÖÃÌṩÁË4ÖÖ¸ºÔؾùºâ²ßÂÔ£¬ÈçÏÂËùʾ£º

Random LoadBalance£ºËæ»ú²ßÂÔ£¬ÅäÖÃֵΪrandom¡£¿ÉÒÔÉèÖÃÈ¨ÖØ£¬ÓÐÀûÓÚ³ä·ÖÀûÓ÷þÎñÆ÷µÄ×ÊÔ´£¬¸ßÅäµÄ¿ÉÒÔÉèÖÃÈ¨ÖØ´óһЩ£¬µÍÅäµÄ¿ÉÒÔÉÔ΢СһЩ

RoundRobin LoadBalance£ºÂÖѯ²ßÂÔ£¬ÅäÖÃֵΪroundrobin¡£

LeastActive LoadBalance£ºÅäÖÃֵΪleastactive¡£¸ù¾ÝÇëÇóµ÷ÓõĴÎÊý¼ÆÊý£¬´¦ÀíÇëÇó¸üÂýµÄ½Úµã»áÊܵ½¸üÉÙµÄÇëÇó

ConsistentHash LoadBalance£ºÒ»ÖÂÐÔHash²ßÂÔ£¬¾ßÌåÅäÖ÷½·¨¿ÉÒԲο¼DubboÎĵµ¡£Ïàͬµ÷ÓòÎÊýµÄÇëÇó»á·¢Ë͵½Í¬Ò»¸ö·þÎñÌṩ·½½ÚµãÉÏ£¬Èç¹ûij¸ö½Úµã·¢Éú¹ÊÕÏÎÞ·¨Ìṩ·þÎñ£¬Ôò»á»ùÓÚÒ»ÖÂÐÔHashËã·¨Ó³Éäµ½ÐéÄâ½ÚµãÉÏ£¨ÆäËû·þÎñÌṩ·½£©

ÔÚʵ¼ÊʹÓÃÖУ¬Ö»ÐèҪѡÔñºÏÊʵĸºÔؾùºâ²ßÂÔÖµ£¬ÅäÖü´¿É£¬ÏÂÃæÊÇÉÏÊöËÄÖÖ¸ºÔؾùºâ²ßÂÔÅäÖõÄʾÀý£º

<dubbo:service interface="org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService" version="1.0.0"
2
cluster="failover" retries="2" timeout="100" loadbalance="random"
3
ref="chatRoomOnlineUserCounterService" protocol="dubbo" >
4
<dubbo:method name="queryRoomUserCount" timeout="80" retries="2" loadbalance="leastactive" />
5
</dubbo:service>

ÉÏÊöÅäÖã¬Ò²ÌåÏÖÁËDubboÅäÖõļ̳ÐÐÔÌØµã£¬Ò²¾ÍÊÇdubbo:serviceÔªËØÅäÖÃÁËloadbalance=¡±random¡±£¬Ôò¸ÃÔªËØµÄ×ÓÔªËØdubbo:methodÈç¹ûûÓÐÖ¸¶¨¸ºÔؾùºâ²ßÂÔ£¬ÔòĬÈÏΪloadbalance=¡±random¡±£¬·ñÔòÈç¹ûdubbo:methodÖ¸¶¨ÁËloadbalance=¡±leastactive¡±£¬ÔòʹÓÃ×ÓÔªËØÅäÖõĸºÔؾùºâ²ßÂÔ¸²¸ÇÁ˸¸ÔªËØÖ¸¶¨µÄ²ßÂÔ£¨ÕâÀïµ÷ÓÃqueryRoomUserCount·½·¨Ê¹ÓÃleastactive¸ºÔؾùºâ²ßÂÔ£©¡£

µ±È»£¬Dubbo¿ò¼ÜÒ²ÌṩÁËʵÏÖ×Ô¶¨Òå¸ºÔØ¾ùºâ²ßÂԵĽӿڣ¬¿ÉÒÔʵÏÖcom.alibaba.dubbo.rpc.cluster.LoadBalance½Ó¿Ú£¬½Ó¿Ú¶¨ÒåÈçÏÂËùʾ£º

/**
02
* LoadBalance. (SPI, Singleton, ThreadSafe)
03
*
04
* <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">Load-Balancing</a>
05
*
06
* @see com.alibaba.dubbo.rpc.cluster.Cluster#join(Directory)
07
* @author qian.lei
08
* @author william.liangf
09
*/
10
@SPI(RandomLoadBalance.NAME)
11
public interface LoadBalance {
12

13
/**
14
* select one invoker in list.
15
* @param invokers invokers.
16
* @param url refer url
17
* @param invocation invocation.
18
* @return selected invoker.
19
*/
20
@Adaptive("loadbalance")
21
<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
22

23
}

ÈçºÎʵÏÖÒ»¸ö×Ô¶¨Òå¸ºÔØ¾ùºâ²ßÂÔ£¬¿ÉÒԲο¼Dubbo¿ò¼ÜÄÚÖõÄʵÏÖ£¬ÈçÏÂËùʾµÄ3¸öʵÏÖÀࣺ

com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
2
com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
3
com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance

Dubbo·þÎñ¼¯ÈºÈÝ´íʵ¼ù

ÊÖ»úÓ¦ÓÃÊÇÒÔÁÄÌìÊÒΪ»ù´¡µÄ£¬ÎÒÃÇÐèÒªÊÕ¼¯Óû§µÄ²Ù×÷ÐÐΪ£¬È»ºó¼ÆËãÁÄÌìÊÒÖÐÔÚÏßÈËÊý£¬²¢ÊµÊ±ÔÚÊÖ»úÓ¦ÓöËÏÔʾÈËÊý£¬Õû¸öϵͳµÄ¼Ü¹¹ÈçͼËùʾ£º

ÉÏͼÖУ¬Ö÷Òª°üÀ¨ÁËÁ½´óÖ÷ÒªÁ÷³Ì£ºÈÕÖ¾ÊÕ¼¯²¢ÊµÊ±´¦ÀíÁ÷³Ì¡¢µ÷ÓöÁȡʵʱ¼ÆËã½á¹ûÁ÷³Ì£¬ÎÒÃÇʹÓûùÓÚDubbo¿ò¼Ü¿ª·¢µÄ·þÎñÀ´Ìṩʵʱ¼ÆËã½á¹û¶ÁÈ¡ÁÄÌìÈËÊýµÄ¹¦ÄÜ¡£ÉÏͼÖУ¬Êµ¼ÊÉÏÒµÎñ½Ó¿Ú·þÎñÆ÷¼¯ÈºÒ²¿ÉÒÔ»ùÓÚDubbo¿ò¼Ü¹¹½¨·þÎñ£¬¾Í¿´ÎÒÃÇÏëÒª¹¹½¨Ê²Ã´ÑùµÄϵͳÀ´Âú×ãÎÒÃǵÄÐèÒª¡£

Èç¹û²»Ê¹ÓÃ×¢²áÖÐÐÄ£¬·þÎñÏû·Ñ·½Ò²Äܹ»Ö±½Óµ÷Ó÷þÎñÌṩ·½·¢²¼µÄ·þÎñ£¬ÕâÑùÐèÒª·þÎñÌṩ·½½«·þÎñµØÖ·±©Â¶¸ø·þÎñÏû·Ñ·½£¬¶øÇÒÒ²ÎÞ·¨Ê¹ÓÃ¼à¿ØÖÐÐĵŦÄÜ£¬ÕâÖÖ·½Ê½³ÉΪֱÁ¬¡£

Èç¹ûÎÒÃÇʹÓÃ×¢²áÖÐÐÄ£¬·þÎñÌṩ·½½«·þÎñ·¢²¼µ½×¢²áÖÐÐÄ£¬¶ø·þÎñÏû·Ñ·½¿ÉÒÔͨ¹ý×¢²áÖÐÐĶ©ÔÄ·þÎñ£¬½ÓÊÕ·þÎñÌṩ·½·þÎñ±ä¸ü֪ͨ£¬ÕâÖÖ·½Ê½¿ÉÒÔÒþ²Ø·þÎñÌṩ·½µÄϸ½Ú£¬°üÀ¨·þÎñÆ÷µØÖ·µÈÃô¸ÐÐÅÏ¢£¬¶ø·þÎñÏû·Ñ·½Ö»ÄÜͨ¹ý×¢²áÖÐÐÄÀ´»ñÈ¡µ½ÒÑ×¢²áµÄÌṩ·½·þÎñ£¬¶ø²»ÄÜÖ±½Ó¿ç¹ý×¢²áÖÐÐÄÓë·þÎñÌṩ·½Ö±½ÓÁ¬½Ó¡£ÕâÖÖ·½Ê½µÄºÃ´¦ÊÇ»¹¿ÉÒÔʹÓÃ¼à¿ØÖÐÐÄ·þÎñ£¬Äܹ»¶Ô·þÎñµÄµ÷ÓÃÇé¿ö½øÐÐ¼à¿Ø·ÖÎö£¬»¹ÄÜʹÓÃDubbo·þÎñ¹ÜÀíÖÐÐÄ£¬·½±ã¹ÜÀí·þÎñ£¬ÎÒÃÇÔÚÕâÀïʹÓõÄÊÇÕâÖÖ·½Ê½£¬Ò²ÍƼöʹÓÃÕâÖÖ·½Ê½¡£Ê¹ÓÃ×¢²áÖÐÐĵÄDubbo·Ö²¼Ê½·þÎñÏà¹Ø×é¼þ½á¹¹£¬ÈçÏÂͼËùʾ£º

ÏÂÃæ£¬¿ª·¢²¿ÊðÎÒÃǵÄÓ¦Óã¬Í¨¹ýÈçÏÂ4¸ö²½ÖèÀ´Íê³É£º

·þÎñ½Ó¿Ú¶¨Òå

·þÎñ½Ó¿Ú½«·þÎñÌṩ·½£¨Provider£©ºÍ·þÎñÏû·Ñ·½£¨Consumer£©Á¬½ÓÆðÀ´£¬·þÎñÌṩ·½ÊµÏÖ½Ó¿ÚÖж¨ÒåµÄ·þÎñ£¬¼´¸ø³ö·þÎñµÄʵÏÖ£¬¶ø·þÎñÏû·Ñ·½¸ºÔðµ÷Ó÷þÎñ¡£ÎÒÃǽӿÚÖиø³öÁË2¸ö·½·¨£¬Ò»¸öÊÇʵʱ²éѯ»ñÈ¡µ±Ç°ÁÄÌìÊÒÄÚÈËÊý£¬ÁíÒ»¸öÊDzéѯһÌìÖÐij¸ö/ijЩÁÄÌìÊÒÖÐÔÚÏßÈËÊý·åÖµ£¬½Ó¿Ú¶¨ÒåÈçÏÂËùʾ£º

package org.shirdrn.dubbo.api;
02

03
import java.util.List;
04

05
public interface ChatRoomOnlineUserCounterService {
06

07
String queryRoomUserCount(String rooms);
08

09
List<String> getMaxOnlineUserCount(List<String> rooms, String date, String dateFormat);
10
}

½Ó¿ÚÊÇ·þÎñÌṩ·½ºÍ·þÎñÏû·Ñ·½¹«¹²×ñÊØµÄЭÒ飬һ°ãÇé¿öÏÂÊÇ·þÎñÌṩ·½½«½Ó¿Ú¶¨ÒåºÃºóÌṩ¸ø·þÎñÏû·Ñ·½¡£

·þÎñÌṩ·½

·þÎñÌṩ·½ÊµÏÖ½Ó¿ÚÖж¨ÒåµÄ·þÎñ£¬ÆäʵÏÖºÍÆÕͨµÄ·þÎñÃ»Ê²Ã´Çø±ð£¬ÎÒÃǵÄʵÏÖÀàΪChatRoomOnlineUserCounterServiceImpl£¬´úÂëÈçÏÂËùʾ£º

package org.shirdrn.dubbo.provider.service;
02

03
import java.util.List;
04

05
import org.apache.commons.logging.Log;
06
import org.apache.commons.logging.LogFactory;
07
import org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService;
08
import org.shirdrn.dubbo.common.utils.DateTimeUtils;
09

10
import redis.clients.jedis.Jedis;
11
import redis.clients.jedis.JedisPool;
12

13
import com.alibaba.dubbo.common.utils.StringUtils;
14
import com.google.common.base.Strings;
15
import com.google.common.collect.Lists;
16

17
public class ChatRoomOnlineUserCounterServiceImpl implements ChatRoomOnlineUserCounterService {
18

19
private static final Log LOG = LogFactory.getLog(ChatRoomOnlineUserCounterServiceImpl.class);
20
private JedisPool jedisPool;
21
private static final String KEY_USER_COUNT = "chat::room::play::user::cnt";
22
private static final String KEY_MAX_USER_COUNT_PREFIX = "chat::room::max::user::cnt::";
23
private static final String DF_YYYYMMDD = "yyyyMMdd";
24

25
public String queryRoomUserCount(String rooms) {
26
LOG.info("Params[Server|Recv|REQ] rooms=" + rooms);
27
StringBuffer builder = new StringBuffer();
28
if(!Strings.isNullOrEmpty(rooms)) {
29
Jedis jedis = null;
30
try {
31
jedis = jedisPool.getResource();
32
String[] fields = rooms.split(",");
33
List<String> results = jedis.hmget(KEY_USER_COUNT, fields);
34
builder.append(StringUtils.join(results, ","));
35
} catch (Exception e) {
36
LOG.error("", e);
37
} finally {
38
if(jedis != null) {
39
jedis.close();
40
}
41
}
42
}
43
LOG.info("Result[Server|Recv|RES] " + builder.toString());
44
return builder.toString();
45
}
46

47
@Override
48
public List<String> getMaxOnlineUserCount(List<String> rooms, String date, String dateFormat) {
49
// HGETALL chat::room::max::user::cnt::20150326
50
LOG.info("Params[Server|Recv|REQ] rooms=" + rooms + ",date=" + date + ",dateFormat=" + dateFormat);
51
String whichDate = DateTimeUtils.format(date, dateFormat, DF_YYYYMMDD);
52
String key = KEY_MAX_USER_COUNT_PREFIX + whichDate;
53
StringBuffer builder = new StringBuffer();
54
if(rooms != null && !rooms.isEmpty()) {
55
Jedis jedis = null;
56
try {
57
jedis = jedisPool.getResource();
58
return jedis.hmget(key, rooms.toArray(new String[rooms.size()]));
59
} catch (Exception e) {
60
LOG.error("", e);
61
} finally {
62
if(jedis != null) {
63
jedis.close();
64
}
65
}
66
}
67
LOG.info("Result[Server|Recv|RES] " + builder.toString());
68
return Lists.newArrayList();
69
}
70

71
public void setJedisPool(JedisPool jedisPool) {
72
this.jedisPool = jedisPool;
73
}
74

75
}

´úÂëÖÐͨ¹ý¶ÁÈ¡RedisÖÐÊý¾ÝÀ´Íê³Éµ÷Óã¬Âß¼­±È½Ï¼òµ¥¡£¶ÔÓ¦µÄMaven POMÒÀÀµÅäÖã¬ÈçÏÂËùʾ£º

<dependencies>
02
<dependency>
03
<groupId>org.shirdrn.dubbo</groupId>
04
<artifactId>dubbo-api</artifactId>
05
<version>0.0.1-SNAPSHOT</version>
06
</dependency>
07
<dependency>
08
<groupId>org.shirdrn.dubbo</groupId>
09
<artifactId>dubbo-commons</artifactId>
10
<version>0.0.1-SNAPSHOT</version>
11
</dependency>
12
<dependency>
13
<groupId>redis.clients</groupId>
14
<artifactId>jedis</artifactId>
15
<version>2.5.2</version>
16
</dependency>
17
<dependency>
18
<groupId>org.apache.commons</groupId>
19
<artifactId>commons-pool2</artifactId>
20
<version>2.2</version>
21
</dependency>
22
<dependency>
23
<groupId>org.jboss.netty</groupId>
24
<artifactId>netty</artifactId>
25
<version>3.2.7.Final</version>
26
</dependency>
27
</dependencies>

ÓйضÔDubbo¿ò¼ÜµÄһЩÒÀÀµ£¬ÎÒÃǵ¥¶À·Åµ½Ò»¸öͨÓõÄMaven ModuleÖУ¨Ïê¼ûºóÃæ¡°¸½Â¼£ºDubboʹÓÃMaven¹¹½¨ÒÀÀµÅäÖá±£©£¬ÕâÀï²»ÔÙ¶à˵¡£·þÎñÌṩ·½ÊµÏÖ£¬×î¹Ø¼üµÄ¾ÍÊÇ·þÎñµÄÅäÖã¬ÒòΪDubbo»ùÓÚSpringÀ´¹ÜÀíÅäÖúÍʵÀý£¬ËùÒÔͨ¹ýÅäÖÿÉÒÔÖ¸¶¨·þÎñÊÇ·ñÊÇ·Ö²¼Ê½·þÎñ£¬ÒÔ¼°Í¨¹ýÅäÖÃÔö¼ÓºÜ¶àÆäËüÌØÐÔ¡£ÎÒÃǵÄÅäÖÃÎļþΪprovider-cluster.xml£¬ÄÚÈÝÈçÏÂËùʾ£º

<?xml version="1.0" encoding="UTF-8"?>
02

03
<beans xmlns="http://www.springframework.org/schema/beans"
04
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
05
xmlns:p="http://www.springframework.org/schema/p"
06
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
07
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
08

09
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
10
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
11
<property name="ignoreResourceNotFound" value="true" />
12
<property name="locations">
13
<list>
14
<value>classpath*:jedis.properties</value>
15
</list>
16
</property>
17
</bean>
18

19
<dubbo:application name="chatroom-cluster-provider" />
20
<dubbo:registry address="zookeeper://zk1:2181?backup=zk2:2181,zk3:2181" />
21

22
<dubbo:protocol name="dubbo" port="20880" />
23

24
<dubbo:service interface="org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService" version="1.0.0"
25
cluster="failover" retries="2" timeout="1000" loadbalance="random" actives="100" executes="200"
26
ref="chatRoomOnlineUserCounterService" protocol="dubbo" >
27
<dubbo:method name="queryRoomUserCount" timeout="500" retries="2" loadbalance="roundrobin" actives="50" />
28
</dubbo:service>
29

30
<bean id="chatRoomOnlineUserCounterService" class="org.shirdrn.dubbo.provider.service.ChatRoomOnlineUserCounterServiceImpl" >
31
<property name="jedisPool" ref="jedisPool" />
32
</bean>
33

34
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
35
<constructor-arg index="0">
36
<bean class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
37
<property name="maxTotal" value="${redis.pool.maxTotal}" />
38
<property name="maxIdle" value="${redis.pool.maxIdle}" />
39
<property name="minIdle" value="${redis.pool.minIdle}" />
40
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" />
41
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
42
<property name="testOnReturn" value="${redis.pool.testOnReturn}" />
43
<property name="testWhileIdle" value="true" />
44
</bean>
45
</constructor-arg>
46
<constructor-arg index="1" value="${redis.host}" />
47
<constructor-arg index="2" value="${redis.port}" />
48
<constructor-arg index="3" value="${redis.timeout}" />
49
</bean>
50

51
</beans>

ÉÏÃæÅäÖÃÖУ¬Ê¹ÓÃdubboЭÒ飬¼¯ÈºÈÝ´íģʽΪfailover£¬·þÎñ¼¶±ð¸ºÔؾùºâ²ßÂÔΪrandom£¬·½·¨¼¶±ð¸ºÔؾùºâ²ßÂÔΪroundrobin£¨Ëü¸²¸ÇÁË·þÎñ¼¶±ðµÄÅäÖÃÄÚÈÝ£©£¬ÆäËûһЩÅäÖÃÄÚÈÝ¿ÉÒԲο¼DubboÎĵµ¡£ÎÒÃÇÕâÀïÊÇ´ÓRedis¶ÁÈ¡Êý¾Ý£¬ËùÒÔʹÓÃÁËRedisÁ¬½Ó³Ø¡£

Æô¶¯·þÎñʾÀý´úÂëÈçÏÂËùʾ£º

package org.shirdrn.dubbo.provider;
02

03
import org.shirdrn.dubbo.provider.common.DubboServer;
04

05
public class ChatRoomClusterServer {
06

07
public static void main(String[] args) throws Exception {
08
DubboServer.startServer("classpath:provider-cluster.xml");
09
}
10

11
}

ÉÏÃæµ÷ÓÃÁËDubboServerÀàµÄ¾²Ì¬·½·¨startServer£¬ÈçÏÂËùʾ£º

	public static void startServer(String config) {
02
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
03
try {
04
context.start();
05
System.in.read();
06
} catch (IOException e) {
07
e.printStackTrace();
08
} finally {
09
context.close();
10
}
11
}

·½·¨ÖÐÖ÷ÒªÊdzõʼ»¯Spring IoCÈÝÆ÷£¬È«²¿¶ÔÏó¶¼½»ÓÉÈÝÆ÷À´¹ÜÀí¡£

·þÎñÏû·Ñ·½

·þÎñÏû·Ñ·½¾ÍÈÝÒ×ÁË£¬Ö»ÐèÒªÖªµÀ×¢²áÖÐÐĵØÖ·£¬²¢ÒýÓ÷þÎñÌṩ·½ÌṩµÄ½Ó¿Ú£¬Ïû·Ñ·½µ÷Ó÷þÎñʵÏÖÈçÏÂËùʾ£º

package org.shirdrn.dubbo.consumer;
02

03
import java.util.Arrays;
04
import java.util.List;
05

06
import org.apache.commons.logging.Log;
07
import org.apache.commons.logging.LogFactory;
08
import org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService;
09
import org.springframework.context.support.AbstractXmlApplicationContext;
10
import org.springframework.context.support.ClassPathXmlApplicationContext;
11

12
public class ChatRoomDubboConsumer {
13

14
private static final Log LOG = LogFactory.getLog(ChatRoomDubboConsumer.class);
15

16
public static void main(String[] args) throws Exception {
17
AbstractXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:consumer.xml");
18
try {
19
context.start();
20
ChatRoomOnlineUserCounterService chatRoomOnlineUserCounterService = (ChatRoomOnlineUserCounterService) context.getBean("chatRoomOnlineUserCounterService");
21
getMaxOnlineUserCount(chatRoomOnlineUserCounterService);
22
getRealtimeOnlineUserCount(chatRoomOnlineUserCounterService);
23
System.in.read();
24
} finally {
25
context.close();
26
}
27

28
}
29

30
private static void getMaxOnlineUserCount (ChatRoomOnlineUserCounterService liveRoomOnlineUserCountService) {
31
List<String> maxUserCounts = liveRoomOnlineUserCountService.getMaxOnlineUserCount(
32
Arrays.asList(new String[] {"1482178010" , "1408492761", "1430546839", "1412517075", "1435861734"}), "20150327", "yyyyMMdd");
33
LOG.info("After getMaxOnlineUserCount invoked: maxUserCounts= " + maxUserCounts);
34
}
35

36
private static void getRealtimeOnlineUserCount(ChatRoomOnlineUserCounterService liveRoomOnlineUserCountService)
37
throws InterruptedException {
38
String rooms = "1482178010,1408492761,1430546839,1412517075,1435861734";
39
String onlineUserCounts = liveRoomOnlineUserCountService.queryRoomUserCount(rooms);
40
LOG.info("After queryRoomUserCount invoked: onlineUserCounts= " + onlineUserCounts);
41
}
42
}

¶ÔÓ¦µÄÅäÖÃÎļþΪconsumer.xml£¬ÄÚÈÝÈçÏÂËùʾ£º

<?xml version="1.0" encoding="UTF-8"?>
02

03
<beans xmlns="http://www.springframework.org/schema/beans"
04
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
05
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
06
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
07

08
<dubbo:application name="chatroom-consumer" />
09
<dubbo:registry address="zookeeper://zk1:2181?backup=zk2:2181,zk3:2181" />
10

11
<dubbo:reference id="chatRoomOnlineUserCounterService" interface="org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService" version="1.0.0">
12
<dubbo:method name="queryRoomUserCount" retries="2" />
13
</dubbo:reference>
14

15
</beans>

Ò²¿ÉÒÔ¸ù¾ÝÐèÒªÅäÖÃdubbo:referenceÏà¹ØµÄÊôÐÔÖµ£¬Ò²¿ÉÒÔÅäÖÃdubbo:methodÖ¸¶¨µ÷Óõķ½·¨µÄÅäÖÃÐÅÏ¢£¬ÏêϸÅäÖÃÊôÐÔ¿ÉÒԲο¼Dubbo¹Ù·½Îĵµ¡£

²¿ÊðÓëÑéÖ¤
¿ª·¢Íê³ÉÌṩ·½·þÎñºó£¬ÔÚ±¾µØ¿ª·¢µ÷ÊÔµÄʱºò¿ÉÒÔÔõô¼òµ¥Ôõô×ö£¬Èç¹ûÊÇÒª²¿Êðµ½Éú²ú»·¾³£¬ÔòÐèÒª´ò°üºó½øÐв¿Ê𣬿ÉÒԲο¼ÏÂÃæµÄMaven POMÅäÖãº

<build>
02
<plugins>
03
<plugin>
04
<groupId>org.apache.maven.plugins</groupId>
05
<artifactId>maven-shade-plugin</artifactId>
06
<version>1.4</version>
07
<configuration>
08
<createDependencyReducedPom>true</createDependencyReducedPom>
09
</configuration>
10
<executions>
11
<execution>
12
<phase>package</phase>
13
<goals>
14
<goal>shade</goal>
15
</goals>
16
<configuration>
17
<transformers>
18
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
19
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
20
<mainClass>org.shirdrn.dubbo.provider.ChatRoomClusterServer</mainClass>
21
</transformer>
22
</transformers>
23
</configuration>
24
</execution>
25
</executions>
26
</plugin>
27
</plugins>
28
</build>

ÕâÀïÒ²¸ø³öMaven POMÒÀÀµµÄ¼òµ¥ÅäÖãº

<dependencies>
2
<dependency>
3
<groupId>org.shirdrn.dubbo</groupId>
4
<artifactId>dubbo-api</artifactId>
5
<version>0.0.1-SNAPSHOT</version>
6
</dependency>
7
</dependencies>

ÎÒÃÇ¿ª·¢µÄ·þÎñÓ¦¸ÃÊÇ·Ö²¼Ê½µÄ£¬Ê×ÏÈÊÇͨ¹ýÅäÖÃÄÚÈÝÀ´¾ö¶¨£¬ÀýÈçÉèÖü¯ÈºÄ£Ê½¡¢ÉèÖøºÔؾùºâģʽµÈ£¬È»ºóÔÚ²¿ÊðµÄʱºò£¬¿ÉÒÔÔÚ¶à¸ö½ÚµãÉÏͬһ¸ö·þÎñ£¬ÕâÑù¶à¸ö·þÎñ¶¼»á×¢²áµ½Dubbo×¢²áÖÐÐÄ£¬Èç¹ûij¸ö½ÚµãÉϵķþÎñ²»¿ÉÓÃÁË£¬¿ÉÒÔ¸ù¾ÝÎÒÃÇÅäÖõIJßÂÔÀ´Ñ¡ÔñÆäËû½ÚµãÉϵĿÉÓ÷þÎñ£¬ºóÃæÍ¨¹ýDubbo·þÎñ¹ÜÀíÖÐÐÄºÍ¼à¿ØÖÐÐľÍÄܸü¼ÓÇå³þÃ÷ÁË¡£

Dubbo·þÎñ¹ÜÀíÓë¼à¿Ø

ÎÒÃÇÐèÒªÔÚ°²×°ºÃ¹ÜÀíÖÐÐÄºÍ¼à¿ØÖÐÐÄÒÔºó£¬ÔÙ½«ÉÏÃæµÄ¿ª·¢µÄÌṩ·½·þÎñ²¿Êðµ½ÎïÀí½ÚµãÉÏ£¬È»ºó¾ÍÄܹ»Í¨¹ý¹ÜÀíÖÐÐÄºÍ¼à¿ØÖÐÐÄÀ´²é¿´¶ÔÓ¦µÄÏêϸÇé¿ö¡£

Dubbo·þÎñ¹ÜÀíÖÐÐÄ
°²×°Dubbo·þÎñ¹ÜÀíÖÐÐÄ£¬ÐèҪѡÔñÒ»¸öWebÈÝÆ÷£¬ÎÒÃÇʹÓÃTomcat·þÎñÆ÷¡£Ê×ÏÈÏÂÔØDubbo¹ÜÀíÖÐÐݲװÎļþdubbo-admin-2.5.3.war£¬»òÕßÖ±½Ó´ÓÔ´Âë¹¹½¨µÃµ½¸ÃWARÎļþ¡£ÕâÀÎÒÃÇÒѾ­¹¹½¨ºÃ¶ÔÓ¦µÄWARÎļþ£¬È»ºó½øÐа²×°£¬Ö´ÐÐÈçÏÂÃüÁ

cd apache-tomcat-6.0.35
2
rm -rf webapps/ROOT
3
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
2
dubbo.admin.root.password=root
3
dubbo.admin.guest.password=guest

È»ºó£¬¸ù¾ÝÐèÒªÐÞ¸Ä~/apache-tomcat-6.0.35/conf/server.xmlÅäÖÃÎļþ£¬Ö÷ÒªÊÇTomcat HTTP ¶Ë¿ÚºÅ£¨ÎÒÕâÀïʹÓÃ8083¶Ë¿Ú£©£¬Íê³Éºó¿ÉÒÔÖ±½ÓÆô¶¯Tomcat·þÎñÆ÷£º

cd ~/apache-tomcat-6.0.35/
2
bin/catalina.sh start

È»ºó·ÃÎʵØÖ·http://10.10.4.130:8083/¼´¿É£¬¸ù¾ÝÅäÖÃÎļþÖ¸¶¨µÄrootÓû§ÃÜÂ룬¾Í¿ÉÒԵǼDubbo¹ÜÀí¿ØÖÆÌ¨¡£
ÎÒÃǽ«ÉÏÃæ¿ª·¢µÄ·þÎñÌṩ·½·þÎñ£¬²¿Êðµ½2¸ö¶ÀÁ¢µÄ½ÚµãÉÏ£¨192.168.14.1ºÍ10.10.4.125£©£¬È»ºó¿ÉÒÔͨ¹ýDubbo¹ÜÀíÖÐÐIJ鿴¶ÔÓ¦·þÎñµÄ×´¿ö£¬ÈçͼËùʾ£º
dubbo-admin-providers
ÉÏͼÖпÉÒÔ¿´³ö£¬¸Ã·þÎñÓÐÁ½¸ö¶ÀÁ¢µÄ½Úµã¿ÉÒÔÌṩ£¬ÒòΪÅäÖõļ¯ÈºÄ£Ê½Îªfailover£¬Èç¹ûij¸ö½ÚµãµÄ·þÎñ·¢Éú¹ÊÕÏÎÞ·¨Ê¹Óã¬Ôò»á×Ô¶¯Í¸Ã÷µØÖØÊÔÁíÒ»¸ö½ÚµãÉϵķþÎñ£¬ÕâÑù¾Í²»ÖÁÓÚ³öÏ־ܾø·þÎñµÄÇé¿ö¡£Èç¹ûÏëÒª²é¿´Ìṩ·½Ä³¸ö½ÚµãÉϵķþÎñÏêÇ飬¿ÉÒÔµã»÷¶ÔÓ¦µÄIP:PortÁ´½Ó£¬Ê¾ÀýÈçͼËùʾ£º
dubbo-admin-providers-detail
ÉÏͼ¿ÉÒÔ¿´µ½·þÎñµØÖ·£º

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=1427793652814&version=1.0.0

Èç¹ûÎÒÃÇÖ±½Ó±©Â¶¸ÃµØÖ·Ò²ÊÇ¿ÉÒԵ쬲»¹ýÕâÖÖÖ±Á¬µÄ·½Ê½¶Ô·þÎñÏû·Ñ·½²»ÊÇ͸Ã÷µÄ£¬Èç¹ûÒÔºóIPµØÖ·¸ü»»£¬Ò²»áÓ°Ïìµ÷Ó÷½£¬ËùÒÔ×îºÃÊÇͨ¹ý×¢²áÖÐÐÄÀ´Òþ±Î·þÎñµØÖ·¡£Í¬Ò»¸ö·þÎñËù²¿ÊðÔڵĶà¸ö½ÚµãÉÏ£¬Ò²¾Í¶ÔÓ¦¶ÔÓ¦×Ŷà¸ö·þÎñµØÖ·¡£ÁíÍ⣬Ҳ¿ÉÒÔ¶ÔÒѾ­·¢²¼µÄ·þÎñ½øÐпØÖÆ£¬ÈçÐ޸ķÃÎÊ¿ØÖÆ¡¢¸ºÔؾùºâÏà¹ØÅäÖÃÄÚÈݵȣ¬¿ÉÒÔͨ¹ýÉÏͼÖС°Ïû·ÑÕß¡±²é¿´·þÎñÏû·Ñ·½µ÷Ó÷þÎñµÄÇé¿ö£¬ÈçͼËùʾ£º
dubbo-admin-consumers
Ò²ÔÚ¹ÜÀí¿ØÖÆÌ¨¿ÉÒÔ¶ÔÏû·Ñ·½½øÐйÜÀí¿ØÖÆ¡£

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
02
dubbo.application.name=simple-monitor
03
dubbo.application.owner=
04
dubbo.registry.address=zookeeper://zk1:2181?backup=zk2:2181,zk3:2181
05
dubbo.protocol.port=7070
06
dubbo.jetty.port=8087
07
dubbo.jetty.directory=${user.home}/monitor
08
dubbo.charts.directory=${dubbo.jetty.directory}/charts
09
dubbo.statistics.directory=${user.home}/monitor/statistics
10
dubbo.log4j.file=logs/dubbo-monitor-simple.log
11
dubbo.log4j.level=WARN

È»ºóÆô¶¯¼òÒ×¼à¿ØÖÐÐÄ£¬Ö´ÐÐÈçÏÂÃüÁ

cd ~/dubbo-monitor-simple-2.5.3
2
bin/start.sh

ÕâÀïʹÓÃÁËJetty WebÈÝÆ÷£¬·ÃÎʵØÖ·http://10.10.4.130:8087/¾Í¿ÉÒԲ鿴¼à¿ØÖÐÐÄ£¬ApplicationsÑ¡Ïî¿¨Ò³Ãæ°üº¬ÁË·þÎñÌṩ·½ºÍÏû·Ñ·½µÄ»ù±¾ÐÅÏ¢£¬ÈçͼËùʾ£º
dubbo-monitor-applications
ÉÏͼÖ÷ÒªÁгöÁËËùÓÐÌṩ·½·¢²¼µÄ·þÎñ¡¢Ïû·Ñ·½µ÷ÓᢷþÎñÒÀÀµ¹ØÏµµÈÄÚÈÝ¡£
½Ó×Å£¬²é¿´ServicesÑ¡Ïî¿¨Ò³Ãæ£¬°üº¬ÁË·þÎñÌṩ·½ÌṩµÄ·þÎñÁÐ±í£¬ÈçͼËùʾ£º
dubbo-monitor-services
µã»÷ÉÏͼÖÐProvidersÁ´½Ó¾ÍÄÜ¿´µ½·þÎñÌṩ·½µÄ»ù±¾ÐÅÏ¢£¬°üÀ¨·þÎñµØÖ·µÈ£¬ÈçͼËùʾ£º
dubbo-monitor-providers
µã»÷ÉÏͼÖÐConsumersÁ´½Ó¾ÍÄÜ¿´µ½·þÎñÏû·Ñ·½µÄ»ù±¾ÐÅÏ¢£¬°üÀ¨·þÎñµØÖ·µÈ£¬ÈçͼËùʾ£º
dubbo-monitor-consumers
ÓÉÓÚÉÏÃæÊÇDubbo×Ô´øµÄÒ»¸ö¼òÒ×¼à¿ØÖÐÐÄ£¬¿ÉÄÜËùÕ¹ÏÖµÄÄÚÈݲ¢²»ÄÜÂú×ãÎÒÃǵÄÐèÒª£¬ËùÒÔ¿ÉÒÔ¸ù¾ÝÐèÒª¿ª·¢×Ô¼ºµÄ¼à¿ØÖÐÐÄ¡£DubboÒ²ÌṩÁË¼à¿ØÖÐÐĵÄÀ©Õ¹½Ó¿Ú£¬Èç¹ûÏëҪʵÏÖ×Ô¼ºµÄ¼à¿ØÖÐÐÄ£¬¿ÉÒÔʵÏÖ½Ó¿Úcom.alibaba.dubbo.monitor.MonitorFactoryºÍcom.alibaba.dubbo.monitor.Monitor£¬ÆäÖÐMonitorFactory½Ó¿Ú¶¨ÒåÈçÏÂËùʾ£º

/**
02
* MonitorFactory. (SPI, Singleton, ThreadSafe)
03
*
04
* @author william.liangf
05
*/
06
@SPI("dubbo")
07
public interface MonitorFactory {
08

09
/**
10
* Create monitor.
11
* @param url
12
* @return monitor
13
*/
14
@Adaptive("protocol")
15
Monitor getMonitor(URL url);
16

17
}

Monitor½Ó¿Ú¶¨ÒåÈçÏÂËùʾ£º

/**
2
* Monitor. (SPI, Prototype, ThreadSafe)
3
*
4
* @see com.alibaba.dubbo.monitor.MonitorFactory#getMonitor(com.alibaba.dubbo.common.URL)
5
* @author william.liangf
6
*/
7
public interface Monitor extends Node, MonitorService {
8

9
}

¾ßÌ嶨ÒåÄÚÈÝ¿ÉÒԲ鿴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>
13
<groupId>org.springframework</groupId>
14
<artifactId>spring</artifactId>
15
</exclusion>
16
<exclusion>
17
<groupId>org.apache.zookeeper</groupId>
18
<artifactId>zookeeper</artifactId>
19
</exclusion>
20
<exclusion>
21
<groupId>org.jboss.netty</groupId>
22
<artifactId>netty</artifactId>
23
</exclusion>
24
</exclusions>
25
</dependency>
26
<dependency>
27
<groupId>org.springframework</groupId>
28
<artifactId>spring-core</artifactId>
29
<version>${spring.version}</version>
30
</dependency>
31
<dependency>
32
<groupId>org.springframework</groupId>
33
<artifactId>spring-beans</artifactId>
34
<version>${spring.version}</version>
35
</dependency>
36
<dependency>
37
<groupId>org.springframework</groupId>
38
<artifactId>spring-context</artifactId>
39
<version>${spring.version}</version>
40
</dependency>
41
<dependency>
42
<groupId>org.springframework</groupId>
43
<artifactId>spring-context-support</artifactId>
44
<version>${spring.version}</version>
45
</dependency>
46
<dependency>
47
<groupId>org.springframework</groupId>
48
<artifactId>spring-web</artifactId>
49
<version>${spring.version}</version>
</dependency>
<dependency>
53
<groupId>org.slf4j</groupId>
54
<artifactId>slf4j-api</artifactId>
55
<version>1.6.2</version>
56
</dependency>
57
<dependency>
58
<groupId>log4j</groupId>
59
<artifactId>log4j</artifactId>
60
<version>1.2.16</version>
61
</dependency>
62
<dependency>
63
<groupId>org.javassist</groupId>
64
<artifactId>javassist</artifactId>
65
<version>3.15.0-GA</version>
66
</dependency>
67
<dependency>
68
<groupId>com.alibaba</groupId>
69
<artifactId>hessian-lite</artifactId>
70
<version>3.2.1-fixed-2</version>
71
</dependency>
72
<dependency>
73
<groupId>com.alibaba</groupId>
74
<artifactId>fastjson</artifactId>
75
<version>1.1.8</version>
76
</dependency>
77
<dependency>
78
<groupId>org.jvnet.sorcerer</groupId>
79
<artifactId>sorcerer-javac</artifactId>
80
<version>0.8</version>
81
</dependency>
82
<dependency>
83
<groupId>org.apache.zookeeper</groupId>
84
<artifactId>zookeeper</artifactId>
85
<version>3.4.5</version>
86
</dependency>
87
<dependency>
88
<groupId>com.github.sgroschupf</groupId>
89
<artifactId>zkclient</artifactId>
90
<version>0.1</version>
91
</dependency>
92
<dependency>
93
<groupId>org.jboss.netty</groupId>
94
<artifactId>netty</artifactId>
<version>3.2.7.Final</version>
</dependency> </dependencies>
   
4328 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

¶àά·½·¨À´¿ª·¢ÓлúµÄÒµÎñÁ÷³Ì¼Ü¹¹
SCA Ó¦ÓóÌÐò¿ª·¢
BPM ºÍ SOA ÐÔÄÜ×î¼Ñʵ¼ù
ʵÏÖÆóÒµ·þÎñ×ÜÏßģʽ
Ïà¹ØÎĵµ

SCA½éÉܼ°Ó¦ÓÃʵÀý
»ùÓÚSOA¼Ü¹¹µÄESBƽ̨£ºInfomagic
SCA¼Ü¹¹
SOAµÄ»ù±¾¸ÅÄî
Ïà¹Ø¿Î³Ì

ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

»ùÓÚSOAµÄ¹¤×÷Á÷£¨WF£©ÕûºÏ
SOA 100ÎÊ - ÎÊÓë´ð
SOAP Ó¦ÓÃģʽ:´¦ÀíÓëÐÔÄÜ
ESB¼Ü¹¹Ö®Æóҵʵʩ°¸Àý
»ùÓÚSOA¼Ü¹¹µÄÆóÒµ¼¯³Éϵͳ
»ùÓÚSOAµÄÌåϵ¼Ü¹¹Éè¼Æ


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


ijµÚÈý·½µç×ÓÖ§¸¶ÆóÒµ SOA¼Ü¹¹Éè¼Æ
ijµç×ÓÆóÒµ SOAÓ¦ÓÃ
ÖйúÒÆ¶¯ SOAÅàѵ
±±¾©´óѧ SOA¼Ü¹¹Éè¼ÆÊµ¼ù
ÓѰÏÕ SOA¼Ü¹¹Éè¼Æ
ÉϺ£ SOA¼Ü¹¹Êµ¼ù
ɽ¶«Òƶ¯Í¨ÐÅ SOAÌåϵ½á¹¹Êµ¼ù