1. ʲôÊÇDubbo£¿ ¹ÙÍø£ºhttp://dubbo.io/£¬DUBBOÊÇÒ»¸ö·Ö²¼Ê½·þÎñ¿ò¼Ü£¬ÖÂÁ¦ÓÚÌṩ¸ßÐÔÄܺÍ͸Ã÷»¯µÄRPCÔ¶³Ì·þÎñµ÷Ó÷½°¸£¬ÒÔ¼°×÷ΪSOA·þÎñÖÎÀíµÄ·½°¸£¬ËüÊǰ¢Àï°Í°ÍSOA·þÎñ»¯ÖÎÀí·½°¸µÄºËÐÄ¿ò¼Ü£¬Ã¿ÌìΪ2,000+¸ö·þÎñÌṩ3,000,000,000+´Î·ÃÎÊÁ¿Ö§³Ö£¬²¢±»¹ã·ºÓ¦ÓÃÓÚ°¢Àï°Í°Í¼¯Íŵĸ÷³ÉÔ±Õ¾µã¡£<ĿǰµÄdubboÉçÇøÒÑֹͣά»¤ºÍ¸üÐÂ>£¬ËüµÄºËÐŦÄܰüÀ¨£º #remoting:Ô¶³ÌͨѶ»ù´¡£¬Ìṩ¶Ô¶àÖÖNIO¿ò¼Ü³éÏó·â×°£¬°üÀ¨¡°Í¬²½×ªÒì²½¡±ºÍ¡°ÇëÇó-ÏìÓ¦¡±Ä£Ê½µÄÐÅÏ¢½»»»·½Ê½¡£ #cluster: ·þÎñ¿ò¼ÜºËÐÄ£¬Ìṩ»ùÓÚ½Ó¿Ú·½·¨µÄÔ¶³Ì¹ý³Ìµ÷Ó㬰üÀ¨¶àÐÒéÖ§³Ö£¬²¢ÌṩÈí¸ºÔØ¾ùºâºÍÈÝ´í»úÖÆµÄ¼¯ÈºÖ§³Ö¡£ #registry: ·þÎñ×¢²áÖÐÐÄ£¬Ê¹·þÎñÏû·Ñ·½Äܶ¯Ì¬µÄ²éÕÒ·þÎñÌṩ·½£¬Ê¹µØÖ·Í¸Ã÷£¬Ê¹·þÎñÌṩ·½¿ÉÒÔÆ½»¬Ôö¼Ó»ò¼õÉÙ»úÆ÷¡£
2. dubboÊÇÈçºÎʹÓÃÀ´Ìṩ·þÎñµÄ£¿

webÓ¦Óüܹ¹µÄ·¢Õ¹£¬´Óµ¥Ò»µÄORM¼Ü¹¹£¨Ò»¸öÓ¦Ó㬽«ËùÓй¦Äܲ¿ÊðÔÚÒ»Æð£¬¼õÉÙ²¿ÊðµÄ½ÚµãºÍ³É±¾£©µ½MVC¼Ü¹¹£¨²ð·Ö³ö»¥Ï಻Ïà¸ÉµÄ¼¸¸öÓ¦Óã©£¬ÔÙ´ÓMVC¿ò¼Üµ½RPC¿ò¼Ü£¨½«ÒµÎñÖеĺËÐÄÒµÎñ³éÈ¡³öÀ´£¬×öΪ¶ÀÁ¢µÄ·þÎñ£¬½¥½¥ÐγɷþÎñÖÐÐÄ£©£¬´ÓRPC¼Ü¹¹µ½SOA¼Ü¹¹£¨Ôö¼ÓÒ»¸öµ÷¶ÈÖÐÐÄ»ùÓÚ·ÃÎÊѹÁ¦ÊµÊ±¹ÜÀí¼¯ÈºÈÝÁ¿£¬Ìá¸ß¼¯ÈºÀûÓÃÂÊ£©¡£ DubboÓÐ×Ô¼ºµÄ·þÎñÖÐÐÄ£¬Ð´ºÃµÄ·þÎñ¿ÉÒÔ×¢²áµ½·þÎñÖÐÐÄ£¬¿Í»§¶Ë´Ó·þÎñÖÐÐÄѰÕÒ·þÎñ£¬È»ºóÔÙµ½ÏàÓ¦µÄ·þÎñÌṩÕß»úÆ÷»ñÈ¡·þÎñ¡£Í¨¹ý·þÎñÖÐÐÄ¿ÉÒÔʵÏÖ¼¯Èº¡¢¸ºÔؾùºâ¡¢¸ß¿ÉÓÃ(ÈÝ´í)
µÈÖØÒª¹¦ÄÜ¡£·þÎñÖÐÐÄÒ»°ãʹÓÃzookeeperʵÏÖ£¬Ò²ÓÐredisºÍÆäËûһЩ·½Ê½¡£ÒÔʹÓÃzookeeper×÷Ϊ·þÎñÖÐÐÄΪÀý£¬·þÎñÌṩÕ߯ô¶¯ºó»áÔÚzookeeperµÄ/dubbo½ÚµãÏ´´½¨ÌṩµÄ·þÎñ½Úµã£¬°üº¬·þÎñÌṩÕßip¡¢portµÈÐÅÏ¢¡£·þÎñÌṩÕ߹رÕʱ»á´ÓzookeeperÖÐÒÆ³ý¶ÔÓ¦µÄ·þÎñ¡£·þÎñʹÓÃÕß»á´Ó×¢²áÖÐÐÄzookeeperÖÐѰÕÒ·þÎñ£¬Í¬Ò»¸ö·þÎñ¿ÉÄÜ»áÓжà¸öÌṩÕߣ¬Dubbo»á°ïÎÒÃÇÕÒµ½ºÏÊʵķþÎñÌṩÕß¡£
3. dubboÊÇÈçºÎ×ö¼¯ÈºÈÝ´íµÄ£¿ µ±·þÎñµ÷ÓÃʧ°Üʱ£¨±ÈÈçÏìÓ¦³¬Ê±£©£¬¸ù¾ÝÎÒÃǵÄÒµÎñ²»Í¬£¬¿ÉÒÔʹÓò»Í¬µÄ²ßÂÔÀ´Ó¦¶ÔÕâÖÖʧ°Ü¡£±ÈÈçÎÒÃǵ÷ÓõķþÎñÊÇÒ»¸ö²éѯ·þÎñ£¬²»»áÐÞ¸ÄÊý¾Ý¿â£¬ÄÇô¿ÉÒÔ¸ø¸Ã·þÎñÉèÖÃÈÝ´í·½Ê½Îªfailover
<ʧ°ÜÖØÊÔ·½Ê½>£¬µ±µ÷ÓÃʧ°Üʱ£¬×Ô¶¯Çл»µ½ÆäËû·þÎñÌṩÕßÈ¥µ÷Ó㬵±Ê§°Ü´ÎÊý³¬¹ýÖ¸¶¨ÖØÊÔ´ÎÊý£¬ÄÇô¾ÍÅ׳ö´íÎó¡£Èç¹û·þÎñÊǸüÐÂÊý¾ÝµÄ·þÎñ£¬ÄǾͲ»ÄÜʹÓÃʧ°ÜÖØÊԵķ½Ê½ÁË£¬
ÒòΪÕâÑù¿ÉÄܲúÉúÊý¾ÝÖØ¸´Ð޸ĵÄÎÊÌ⣬±ÈÈçµ÷ÓÃÌṩÕßAµÄ²åÈëÓû§·½·¨£¬µ«ÊǸ÷½·¨ÒµÎñÂß¼¸´ÔÓ£¬Ö´Ðйý³ÌºÜÂý£¬µ¼ÖÂÏìÓ¦³¬Ê±£¬ÄÇô´ËʱÈç¹ûÔÙÈ¥µ÷ÓÃÁíÍâÒ»¸ö·þÎñÌṩÕߵIJåÈëÓû§·½·¨£¬½«»áÓÖÖØ¸´²åÈëͬһ¸öÓû§¡£¶ÔÓÚÕâÖÖÀàÐ͵ķþÎñ£¬¿ÉÒÔʹÓÃÈÝ´í·½Ê½Îªfailfast£¬Èç¹ûµÚÒ»´Îµ÷ÓÃʧ°Ü£¬Á¢¼´±¨´í£¬²»ÐèÒªÖØÊÔ¡£
ÁíÍ⻹ÓÐÏÂÃæ¼¸ÖÖÈÝ´íÀàÐÍ£¬failsafe ³öÏÖ´íÎó£¬Ö±½ÓºöÂÔ£¬²»ÖØÊÔÒ²²»±¨´í; failback
ʧ°Üºó²»±¨´í£¬»á½«¸Ãʧ°ÜÇëÇ󣬶¨Ê±ÖØ·¢£¬ÊʺÏÏûϢ֪ͨÀàÐ͵ķþÎñ¡£forking£¬²¢Ðе÷Óöà¸ö·þÎñÆ÷£¬Ö»ÒªÔÚijһ̨ÌṩÕßÉÏÃæ³É¹¦£¬ÄÇô·½·¨·µ»Ø£¬ÊʺÏʵʱÐÔÒªÇó½Ï¸ßµÄ²éѯ·þÎñ£¬µ«ÊÇÒªÎþÉüÐÔÄÜ¡£ÒòΪÿ̨·þÎñÆ÷»á×öͬһ¸ö²Ù×÷£»broadcast
¹ã²¥µ÷ÓÃËùÓзþÎñÌṩÕߣ¬Öð¸öµ÷Óã¬ÈÎÒâһ̨±¨´íÔò±¨´í¡£ÊʺÏÓë¸üÐÂÿ̨ÌṩÕßÉÏÃæµÄ»º´æ£¬ÕâÖÖÀàÐ͵ķþÎñ¡£
°¸Àý£ºÎÒÃÇÔÚµãÎҰɵÄAPPÏûÏ¢ÍÆË;ÍÊDzÉÓõÄfailback·½Ê½£¬µãÎҰɵĶÌÐÅ֪ͨÔò²ÉÓõÄÊÇfailover·½Ê½¡£
4. dubboÊÇÈçºÎ×ö¸ºÔؾùºâµÄ£¿{¼¸ÖÖ¸ºÔؾùºâµÄ²ßÂÔ} µ±Í¬Ò»¸ö·þÎñÓжà¸öÌṩÕßÔÚÌṩ·þÎñʱ£¬ ¿Í»§¶ËÈçºÎÕýÈ·µÄÑ¡ÔñÌṩÕßʵÏÖ¸ºÔؾùºâdubboÒ²¸øÎÒÃÇÌṩÁ˼¸ÖÖ·½°¸£ºrandom£¬Ëæ»úÑ¡ÌṩÕߣ¬²¢¿ÉÒÔ¸øÌṩÕßÉèÖÃÈ¨ÖØ£»roundrobin£¬ÂÖѯѡÔñÌṩÕߣ¬leastactive£¬×îÉÙ»îÔ¾µ÷ÓÃÊý£¬Ïàͬ»îÔ¾ÊýµÄËæ»ú£¬»îÔ¾ÊýÖ¸µ÷ÓÃǰºó¼ÆÊý²î¡£Ê¹ÂýµÄÌṩÕßÊÕµ½¸üÉÙÇëÇó£¬ÒòΪԽÂýµÄÌṩÕߵĵ÷ÓÃǰºó¼ÆÊý²î»áÔ½´ó¡£consistenthash
Ò»ÖÂÐÔhash£¬Ïàͬ²ÎÊýµÄÇëÇó·¢µ½Í¬Ò»Ì¨»úÆ÷ÉÏ¡£ ¹ØÓÚÒ»ÖÂÐÔhashµÄ¼¸µãѧϰ£¬ÎÒÃÇÖªµÀÆÕͨµÄ¹þÏ£Ëã·¨ÔÚÉ¢ÁеÄʱºò£¬¿ÉÄܲúÉú¼ä¸ô£¬²¢²»ÄÜʹÊý¾Ý¾ùÓë·Ö²¼¿ªÀ´¡£Ò»ÖÂÐÔ¹þÏ£Ëã·¨ÕýÊÇ»ùÓÚ¹þÏ£Ëã·¨µÄȱµãËùÒýÈëµÄ½â¾ö·½°¸¡£Ò»ÖÂÐÔhashËã·¨Ìá³öÁËÔÚ¶¯Ì¬±ä»¯µÄCache»·¾³ÖУ¬Åж¨¹þÏ£Ëã·¨ºÃ»µµÄËĸö¶¨Ò壺1¡¢Æ½ºâÐÔ(Balance)£ºÆ½ºâÐÔÊÇÖ¸¹þÏ£µÄ½á¹ûÄܹ»¾¡¿ÉÄÜ·Ö²¼µ½ËùÓеĻº³åÖÐÈ¥£¬ÕâÑù¿ÉÒÔʹµÃËùÓеĻº³å¿Õ¼ä¶¼µÃµ½ÀûÓ᣺ܶà¹þÏ£Ëã·¨¶¼Äܹ»Âú×ãÕâÒ»Ìõ¼þ¡£2¡¢µ¥µ÷ÐÔ(Monotonicity)£ºµ¥µ÷ÐÔÊÇÖ¸Èç¹ûÒѾÓÐһЩÄÚÈÝͨ¹ý¹þÏ£·ÖÅɵ½ÁËÏàÓ¦µÄ»º³åÖУ¬ÓÖÓÐÐµĻº³å¼ÓÈ뵽ϵͳÖС£¹þÏ£µÄ½á¹ûÓ¦Äܹ»±£Ö¤ÔÓÐÒÑ·ÖÅäµÄÄÚÈÝ¿ÉÒÔ±»Ó³Éäµ½ÔÓеĻòÕßÐµĻº³åÖÐÈ¥£¬¶ø²»»á±»Ó³Éäµ½¾ÉµÄ»º³å¼¯ºÏÖÐµÄÆäËû»º³åÇø¡£3¡¢·ÖÉ¢ÐÔ(Spread)£ºÔÚ·Ö²¼Ê½»·¾³ÖУ¬ÖÕ¶ËÓпÉÄÜ¿´²»µ½ËùÓеĻº³å£¬¶øÊÇÖ»ÄÜ¿´µ½ÆäÖеÄÒ»²¿·Ö¡£µ±ÖÕ¶ËÏ£Íûͨ¹ý¹þÏ£¹ý³Ì½«ÄÚÈÝÓ³Éäµ½»º³åÉÏʱ£¬ÓÉÓÚ²»Í¬ÖÕ¶ËËù¼ûµÄ»º³å·¶Î§ÓпÉÄܲ»Í¬£¬´Ó¶øµ¼Ö¹þÏ£µÄ½á¹û²»Ò»Ö£¬×îÖյĽá¹ûÊÇÏàͬµÄÄÚÈݱ»²»Í¬µÄÖÕ¶ËÓ³Éäµ½²»Í¬µÄ»º³åÇøÖС£ÕâÖÖÇé¿öÏÔÈ»ÊÇÓ¦¸Ã±ÜÃâµÄ£¬ÒòΪËüµ¼ÖÂÏàͬÄÚÈݱ»´æ´¢µ½²»Í¬»º³åÖÐÈ¥£¬½µµÍÁËϵͳ´æ´¢µÄЧÂÊ¡£·ÖÉ¢ÐԵ͍Òå¾ÍÊÇÉÏÊöÇé¿ö·¢ÉúµÄÑÏÖØ³Ì¶È¡£ºÃµÄ¹þÏ£Ëã·¨Ó¦Äܹ»¾¡Á¿±ÜÃâ²»Ò»ÖµÄÇé¿ö·¢Éú£¬Ò²¾ÍÊǾ¡Á¿½µµÍ·ÖÉ¢ÐÔ¡£4¡¢¸ºÔØ(Load)£º¸ºÔØÎÊÌâʵ¼ÊÉÏÊÇ´ÓÁíÒ»¸ö½Ç¶È¿´´ý·ÖÉ¢ÐÔÎÊÌâ¡£¼ÈÈ»²»Í¬µÄÖÕ¶Ë¿ÉÄܽ«ÏàͬµÄÄÚÈÝÓ³Éäµ½²»Í¬µÄ»º³åÇøÖУ¬ÄÇô¶ÔÓÚÒ»¸öÌØ¶¨µÄ»º³åÇø¶øÑÔ£¬Ò²¿ÉÄܱ»²»Í¬µÄÓû§Ó³ÉäΪ²»Í¬
µÄÄÚÈÝ¡£Óë·ÖÉ¢ÐÔÒ»Ñù£¬ÕâÖÖÇé¿öÒ²ÊÇÓ¦µ±±ÜÃâµÄ£¬Òò´ËºÃµÄ¹þÏ£Ëã·¨Ó¦Äܹ»¾¡Á¿½µµÍ»º³åµÄ¸ººÉ¡£ÔÚ·Ö²¼Ê½¼¯ÈºÖУ¬¶Ô»úÆ÷µÄÌí¼Óɾ³ý£¬»òÕß»úÆ÷¹ÊÕϺó×Ô¶¯ÍÑÀ뼯ȺÕâЩ²Ù×÷ÊÇ·Ö²¼Ê½¼¯Èº¹ÜÀí×î»ù±¾µÄ¹¦ÄÜ¡£Èç¹û²ÉÓó£ÓõÄhash(object)%NËã·¨£¬ÄÇôÔÚÓлúÆ÷Ìí¼Ó»òÕßɾ³ýºó£¬ºÜ¶àÔÓеÄÊý¾Ý¾ÍÎÞ·¨ÕÒµ½ÁË£¬ÕâÑùÑÏÖØµÄÎ¥·´Á˵¥µ÷ÐÔÔÔò¡£½ÓÏÂÀ´Ö÷Òª½²½âÒ»ÏÂÒ»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎÉè¼ÆµÄ£º
ÈçÉÏͼËùʾ£¬ÊÇ»·ÐεÄhash¿Õ¼ä£¬°´ÕÕ³£ÓõÄhashËã·¨À´½«¶ÔÓ¦µÄkey¹þÏ£µ½Ò»¸ö¾ßÓÐ2^32´Î·½¸öͰµÄ¿Õ¼äÖУ¬¼´0~(2^32)-1µÄÊý×Ö¿Õ¼äÖС£ÏÖÔÚÎÒÃÇ¿ÉÒÔ½«ÕâЩÊý×ÖͷβÏàÁ¬£¬ÏëÏó³ÉÒ»¸ö±ÕºÏµÄ»·ÐΡ£ÎÒÃǰÑÊý¾Ýͨ¹ýhashËã·¨´¦ÀíºóÓ³Éäµ½»·ÉÏ£¬ÏÖÔÚÎÒÃǽ«object1¡¢object2¡¢object3¡¢object4Ëĸö¶ÔÏóͨ¹ýÌØ¶¨µÄHashº¯Êý¼ÆËã³ö¶ÔÓ¦µÄkeyÖµ£¬È»ºóÉ¢Áе½Hash»·ÉÏ¡£Hash(object1)
= key1£»Hash(object2) = key2£»Hash(object3) = key3£»Hash(object4)
= key4£»
ÆÕͨhashÇóÓàËã·¨×îΪ²»Í׵ĵط½¾ÍÊÇÔÚÓлúÆ÷µÄÌí¼Ó»òÕßɾ³ýÖ®ºó»áÕճɴóÁ¿µÄ¶ÔÏó´æ´¢Î»ÖÃʧЧ£¬ÕâÑù¾Í´ó´óµÄ²»Âú×ãµ¥µ÷ÐÔÁË¡£ÏÂÃæÀ´·ÖÎöÒ»ÏÂÒ»ÖÂÐÔ¹þÏ£Ëã·¨ÊÇÈçºÎ´¦ÀíµÄ£¿Ëüͨ¹ý°´Ë³Ê±ÕëÇ¨ÒÆµÄ¹æÔò£¬Ê×Ïȱ£Ö¤ÆäËü¶ÔÏó»¹±£³ÖÔÓеĴ洢λÖᣵ±Í¨¹ý½ÚµãµÄÌí¼ÓºÍɾ³ýµÄʱºò£¬Ò»ÖÂÐÔ¹þÏ£Ëã·¨ÔÚ±£³ÖÁ˵¥µ÷ÐÔµÄͬʱ£¬»¹ÊÇÊý¾ÝµÄÇ¨ÒÆ´ïµ½ÁË×îС£¬ÕâÑùµÄËã·¨¶Ô·Ö²¼Ê½¼¯ÈºÀ´ËµÊǷdz£ºÏÊʵ쬱ÜÃâÁË´óÁ¿Êý¾ÝÇ¨ÒÆ£¬¼õСÁË·þÎñÆ÷µÄµÄѹÁ¦¡£
5. dubboµÄ¶àÐÒ鷽ʽ£¿ dubboÌṩÁ˶àÖÖÐÒ鏸Óû§Ñ¡Ôñ£¬Èçdubbo¡¢hessian¡¢rmi ¡£²¢¿ÉΪÿ¸ö·þÎñÖ¸¶¨²»Í¬µÄ´«ÊäÐÒ飬Á£¶È¿ÉÒÔϸ»¯µ½·½·¨£¬²»Í¬·þÎñÔÚÐÔÄÜÉÏÊÊÓò»Í¬ÐÒé½øÐд«Ê䣬±ÈÈç´óÊý¾ÝÓöÌÁ¬½ÓÐÒ飬СÊý¾Ý´ó²¢·¢Óó¤Á¬½ÓÐÒé¡£ ʹÓÃDubbo½øÐÐÔ¶³Ìµ÷ÓÃʵÏÖ·þÎñ½»»¥£¬ËüÖ§³Ö¶àÖÖÐÒ飬ÈçHessian¡¢HTTP¡¢RMI¡¢Memcached¡¢Redis¡¢ThriftµÈµÈ¡£ÓÉÓÚDubbo½«ÕâЩÐÒéµÄʵÏÖ½øÐÐÁË·â×°ÁË£¬ÎÞÂÛÊÇ·þÎñ¶Ë£¨¿ª·¢·þÎñ£©»¹Êǿͻ§¶Ë£¨µ÷Ó÷þÎñ£©£¬¶¼²»ÐèÒª¹ØÐÄÐÒéµÄϸ½Ú£¬Ö»ÐèÒªÔÚÅäÖÃÖÐÖ¸¶¨Ê¹ÓõÄÐÒé¼´¿É£¬´Ó¶ø±£Ö¤ÁË·þÎñÌṩ·½Óë·þÎñÏû·Ñ·½Ö®¼äµÄ͸Ã÷¡£ÁíÍ⣬Èç¹ûÎÒÃÇʹÓÃDubboµÄ·þÎñ×¢²áÖÐÐÄ×é¼þ£¬ÕâÑù·þÎñÌṩ·½½«·þÎñ·¢²¼µ½×¢²áµÄÖÐÐÄ£¬Ö»Êǽ«·þÎñµÄÃû³Æ±©Â¶¸øÍⲿ£¬¶ø·þÎñÏû·Ñ·½Ö»ÐèÒªÖªµÀ×¢²áÖÐÐĺͷþÎñÌṩ·½ÌṩµÄ·þÎñÃû³Æ£¬¾ÍÄܹ»Í¸Ã÷µØµ÷Ó÷þÎñ£¬ºóÃæÎÒÃǻῴµ½¾ßÌåÌṩ·þÎñºÍÏû·Ñ·þÎñµÄÅäÖÃÄÚÈÝ£¬Ê¹µÃË«·½Ö®¼ä½»»¥µÄ͸Ã÷»¯¡£
ÈçͼËùʾµÄÓ¦Óó¡¾°£¬·þÎñ·½Ìṩһ¸öËÑË÷·þÎñ£¬¶Ô·þÎñ·½À´Ëµ£¬Ëü»ùÓÚSolrCloud¹¹½¨ÁËËÑË÷·þÎñ£¬°üº¬Á½¸ö¼¯Èº£¬ZooKeeper¼¯ÈººÍSolr¼¯Èº£¬È»ºóÔÚǰ¶Ëͨ¹ýNginxÀ´½øÐз´Ïò´úÀí£¬´ïµ½¸ºÔؾùºâµÄÄ¿µÄ¡£·þÎñÏû·Ñ·½¾ÍÊǵ÷Ó÷þÎñ½øÐвéѯ£¬¸ø³ö²éѯÌõ¼þ¡£ »ùÓÚÉÏÃæµÄʾÀý³¡¾°£¬ÎÒÃÇ´òËãʹÓÃZooKeeper¼¯Èº×÷Ϊ·þÎñ×¢²áÖÐÐÄ¡£×¢²áÖÐÐĻᱩ¶¸ø·þÎñÌṩ·½ºÍ·þÎñÏû·Ñ·½£¬ËùÒÔ×¢²á·þÎñµÄʱºò£¬·þÎñÏÈÌṩ·½Ö»ÐèÒªÌṩNginxµÄµØÖ·¸ø×¢²áÖÐÐÄ£¬µ«ÊÇ×¢²áÖÐÐIJ¢²»»á°ÑÕâ¸öµØÖ·±©Â¶¸ø·þÎñÏû·Ñ·½¡£
public interface SolrSearchService { String search(String collection, String q, ResponseType type, int start, int rows); public enum ResponseType {JSON, XML} } |
ÆäÖУ¬providerµÄ·þÎñÉè¼Æ£ºproviderËù·¢²¼µÄ·þÎñ×é¼þ£¬°üº¬ÁËÒ»¸öSolrCloud¼¯Èº£¬ÔÚSolrCloud¼¯ÈºÇ°¶ËÓÖ¼ÓÁËÒ»¸ö·´Ïò´úÀí²ã£¬Ê¹ÓÃNginxÀ´¾ùºâ¸ºÔØ¡£ProviderµÄËÑË÷·þÎñϵͳ£¬Éè¼ÆÈçÏÂͼËùʾ£º
ÈçͼËùʾ£¬Êµ¼ÊnginxÖн«ÇëÇóÖ±½Óת·¢µ½ÄÚ²¿µÄWeb ServersÉÏ£¬ÔÚÕâ¸ö¹ý³ÌÖУ¬Ê¹ÓÃZooKeeperÀ´½øÐÐе÷£º´Ó¶à¸ö·ÖƬ£¨Shard£©·þÎñÆ÷Éϲ¢ÐÐËÑË÷£¬×îºóºÏ²¢½á¹û¡£Ò»¹²ÅäÖÃÁË3̨Solr·þÎñÆ÷£¬ÒòΪSolrCloud¼¯ÈºÖÐÿһ¸ö½Úµã¶¼¿ÉÒÔ½ÓÊÕËÑË÷ÇëÇó£¬È»ºóÓÉÕû¸ö¼¯ÈºÈ¥²¢ÐÐËÑË÷¡£×îºó£¬ÎÒÃÇҪͨ¹ýDubbo·þÎñ¿ò¼ÜÀ´»ùÓÚÒÑÓеÄϵͳÀ´¿ª·¢ËÑË÷·þÎñ£¬²¢Í¨¹ýDubboµÄ×¢²áÖÐÐÄÀ´·¢²¼·þÎñ¡£Ê×Ñ¡ÐèҪʵÏÖ·þÎñ½Ó¿Ú£¬ÊµÏÖ´úÂëÈçÏÂËùʾ£º
package org.shirdrn.platform.dubbo.service.rpc.server;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService;
import org.shirdrn.platform.dubbo.service.rpc.utils.QueryPostClient;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SolrSearchServer implements SolrSearchService
{
private static final Log LOG = LogFactory.getLog(SolrSearchServer.class);
private String baseUrl;
private final QueryPostClient postClient;
private static final Map<ResponseType, FormatHandler>
handlers = new HashMap<ResponseType, FormatHandler>(0);
static {
handlers.put(ResponseType.XML, new FormatHandler()
{
public String format() {
return "&wt=xml";
}
});
handlers.put(ResponseType.JSON, new FormatHandler()
{
public String format() {
return "&wt=json";
}
});
}
public SolrSearchServer() {
super();
postClient = QueryPostClient.newIndexingClient(null);
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public String search(String collection, String
q, ResponseType type,
int start, int rows) {
StringBuffer url = new StringBuffer();
¡¡¡¡¡¡¡¡¡¡¡¡ url.append(baseUrl).append(collection).append("/select?").append(q);
¡¡¡¡¡¡¡¡¡¡¡¡ url.append("&start=").append(start).append("&rows=").append(rows);
url.append(handlers.get(type).format());
LOG.info("[REQ] " + url.toString());
return postClient.request(url.toString());
}
interface FormatHandler {
String format();
}
public static void main(String[] args) throws
IOException {
String config = SolrSearchServer.class.getPackage().getName().replace('.',
'/') + "/search-provider.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
context.start();
System.in.read();
}
} |
¶ÔÓ¦µÄDubboÅäÖÃÎļþΪsearch-provider.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="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="search-provider" /> <dubbo:registry address="zookeeper://slave1:2188?backup=slave3:2188,slave4:2188" /> <dubbo:protocol name="dubbo" port="20880" /> <bean id="searchService" class="org.shirdrn.platform.dubbo.service.rpc.server.SolrSearchServer"> <property name="baseUrl" value="http://nginx-lbserver/solr-cloud/" /> </bean> <dubbo:service interface="org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService" ref="searchService" /> </beans> |
ÉÏÃæ£¬Dubbo·þÎñ×¢²áÖÐÐÄÖ¸¶¨ZooKeeperµÄµØÖ·£ºzookeeper://slave1:2188?backup=slave3:2188,slave4:2188£¬Ê¹ÓÃDubboÐÒé¡£ÅäÖ÷þÎñ½Ó¿ÚµÄʱºò£¬¿ÉÒÔ°´ÕÕSpringµÄBeanµÄÅäÖ÷½Ê½À´ÅäÖã¬×¢ÈëÐèÒªµÄÄÚÈÝ£¬ÎÒÃÇÕâÀïÖ¸¶¨ÁËËÑË÷¼¯ÈºµÄNginx·´Ïò´úÀíµØÖ·http://nginx-lbserver/solr-cloud/¡£
6. dubboµÄʹÓÃÌØµã£¿ dubbo²ÉÓÃÈ«SpringÅäÖ÷½Ê½£¬Í¸Ã÷»¯½ÓÈëÓ¦Ó㬶ÔÓ¦ÓÃûÓÐÈκÎAPIÇÖÈ룬ֻÐèÓÃSpring¼ÓÔØDubboµÄÅäÖü´¿É£¬Dubbo»ùÓÚSpringµÄSchemaÀ©Õ¹½øÐмÓÔØ¡£
7. ×ܽá dubboÊǸßÐÔÄܵķֲ¼Ê½·þÎñ¿ò¼Ü£¬ËüÌṩÁË·þÎñÖÎÀíµÄ½â¾ö·½°¸¡£ËüÊÊÓÃÓÚ£¨¹«Ë¾ÄÚ²¿£©¿ç²¿ÃÅ¿çÏîĿԶ³Ìµ÷Óõij¡¾°£¬

dubboÎȶ¨¶ø¸ßЧ£¬²»½öÖ§³Ö´ó¹æÄ£·þÎñ¼¯ÈºµÄ¶¯Ì¬À©Õ¹£¬Æ½»¬Éý¼¶£¬¶øÇÒÖ§³Öload balance£¬fail
over,Ö§³Ö·þÎñÖÊÁ¿·Ö¼¶¹ÜÀí£¬dubbo¼ò»¯ÁË·þÎñÅäÖ㬼õÉÙDBÁ¬½ÓÊý¡£ dubbo¿ÉÒÔ×öʲô£¬dubboÊÇ»ùÓÚNIOºÍ³¤Á¬½ÓµÄÔ¶³Ìµ÷ÓÃʵÏÖ£¬dubboÌṩµÄ·þÎñ±©Â¶ºÍµ¼È룬¶ÔÓ¦Ó÷½µÄ´úÂëÎÞÇÖÈëÐÔ£¬dubboÌṩ¶àÐÒéÖ§³Ö£¬ÈçRMI¡¢Hessian¡¢tbrµÈ£¬dubboÌṩÁËfail
over»úÖÆ£¬µ±Ä³¸öprovider³öÏÖÒì³£ºó£¬»á×Ô¶¯Çл»provider£¬dubboÌṩÁËload balance»úÖÆ£¬²ÉÓÃÁËÈ¨ÖØ+Ëæ»ú»òÂÖѯËã·¨£¬·þÎñÁÐ±í¶¯Ì¬¸üУ¬Èç²½ÖèÈý¡£dubbo½â¾öÁË·þÎñÖÎÀíÎÊÌ⣬°üÀ¨providerºÍconsumerÖ®¼äµÄÆ¥ÅäÎÊÌ⣬dubboÌṩÁË·þÎñµÄ×¢²áºÍ¶©ÔŦÄÜ£¬dubboµÄÁé»îµÄ·ÓɹæÔòÉèÖã¬ÇÒÖ§³Ö·þÎñÁÐ±í¶¯Ì¬ÍÆË͹¦ÄÜ£¬ÇÒÌṩÁË»ùÓÚwebµÄ¹ÜÀí¹¦ÄÜ¡£
/* * ʹÓÃDubbo·þÎñ½Ó¿Ú */
// Ê×ÏÈ£¬ÔÚAPI°üÖж¨Òå·þÎñ½Ó¿Ú£¬Í¬Ê±²¿ÊðÓÚProvider¶ËºÍConsumer¶Ë
public interface HelloService {
public String sayHello();
}
// Æä´Î£¬ÔÚ·þÎñ¶ËµÄProviderʵÏÖ´úÂë
public class HelloServiceImpl implements HelloService
{
public String sayHello() {
return "Welcome to dubbo!";
}
}
// ÅäÖãºÌṩÕß±©Â¶·þÎñ;Ïû·ÑÕßÏû·Ñ·þÎñ
/*provider¶Ë·þÎñʵÏÖÀà*/
<bean id="helloService" class="com.alibaba.hello.impl.HelloServiceImpl"
/>
/*provider¶Ë±©Â¶·þÎñ*/
<dubbo:service interface="com.alibaba.hello.HelloService"
version="1.0.0" ref="helloService"/>
/*consumer¶ËÒýÈë·þÎñ*/
<dubbo:reference id="helloService"
interface="com.alibaba.hello.HelloService"
version="1.0.0" />
/*consumer¶ËʹÓ÷þÎñ*/
<bean id="xxxAction" class="com.alibaba.xxx.XxxAction"
><property name="helloService"
ref="helloService" /></bean> |
ÎÒÃǶÔdubboµÄÐÔÄÜ×ö³ö²âÊÔ£¬ÈçÏ£º
|