ÕªÒª£º×÷ΪÒì²½ÎÞ×èÈûµÄÍøÂç¿ò¼Ü£¬Vert.xµÄ²ÎÕÕÎïÊÇNode.js£¬»ù±¾¿ÉÒÔÍê³ÉNode.jsÄÜÍê³ÉµÄËùÓÐÊÂÇé¡£ËüÊÇ×÷ÕßĿǰ¼û¹ý¹¦ÄÜ×îÇ¿´ó£¬ÒÀÀµµÚÈý·½¿â×îÉÙµÄJava¿ò¼Ü¡£±¾ÎĽ«´øÄãÉîÈëÁ˽âVert.x¡£
Vert.xµÄÓÉÀ´
Vert.xµ®ÉúÓÚ2011Ä꣬µ±Ê±½Ðnode.x£¬²»¹ýºóÀ´ÒòΪijЩÔÒò¸ÄÃûλVert.x¡£¾¹ýÈýÄê¶àµÄ·¢Õ¹£¬ÏÖÔÚÒѾµ½ÁË3.2°æ±¾£¬ÉçÇøÒ²Ô½À´Ô½»îÔ¾£¬ÔÚ×îеĹÙÍøVertx.ioÉÏ£¬×÷ÕßÓÃÒ»¾ä»°½éÉÜÁËËü£¬JVMÉϵÄReative¿ª·¢Ì×¼þ¡£Vert.xĿǰÊǼû¹ý×ÄÜ×îÇ¿´ó£¬µÚÈý·½¿âÒÀÀµ×îÉÙµÄJava¿ò¼Ü£¬ËüÖ»ÒÀÀµNetty4ÒÔ¼°Jacskon£¬ÁíÍâÈç¹ûÄãÐèÒª½¨Á¢·Ö²¼Ê½µÄVert.xÔòÔÙÒÀÀµHazelCastÕâ¸ö·Ö²¼Ê½¿ò¼Ü£¬×¢ÒâVert.x3±ØÐë»ùÓÚJava8¡£ÓÉÓÚ»ùÓÚJVM£¬ËùÒÔVert.x¿ÉÒÔÓÃÆäËûÓïÑÔÀ´ÊµÏÖÄãµÄÒµÎñ¡£Ä¬ÈϹٷ½Î¬»¤µÄÓïÑÔÊÇGroovy£¬JavaScriptÒÔ¼° JRuby¡£
Vert.xÊÇÒ»¸öÒì²½ÎÞ×èÈûµÄÍøÂç¿ò¼Ü£¬Æä²ÎÕÕÎïÊÇnode.js¡£»ù±¾ÉÏnode.jsÄܸɵÄÊÂÇ飬Vert.x¶¼Äܸɡ£Vert.xÀûÓÃNetty4µÄEventLoopÀ´×öµ¥Ï̵߳ÄʼþÑ»·£¬ËùÒÔÅÜÔÚVert.xÉϵÄÒµÎñ²»ÄÜ×öCPUÃܼ¯Ð͵ÄÔËË㣬ÕâÑù»áµ¼ÖÂÕû¸öÏ̱߳»×èÈû¡£
ͼ1ÊÇÒ»¸ö¼òµ¥µÄͨ¹ýVert.xÆðHTTP·þÎñµÄÀý×Ó(JavaʵÏÖ)¡£Äã¿ÉÒÔ´Ó¹Ù·½ÕÒµ½ÆäËûÓïÑÔʵÏÖ¡£

ͼ1 Vert.xʵÏÖHTTP·þÎñ
¸Õ²ÅÉÏÃæÌáµ½ÁËVert.xµÄ·Ö²¼Ê½£¬Vert.xÓënode.jsÓÐÒ»¸öºÜ´ó²»Í¬µã£¬ÔÚÓÚVert.xÖ§³Ö·Ö²¼Ê½£¬Óë¶àºËÀûÓá£Í¨¹ýHazelcast¹ÜÀí¸÷¸öVert.x½ÚµãµÄÐÅÏ¢£¬È»ºóͨ¹ýEventBusÔÚ½ÚµãÖ®¼ä»¥Ïà·¢ÏûÏ¢£¬ÓÚ´ËͬʱVert.x»¹ÄÜÖ§³ÖÓ¦Óõĸ߿ÉÓã¬Ö»Ðè¼òµ¥µÄÔÚÆô¶¯Ê±¼Ó²ÎÊý-ha¼´¿É¡£¾ßÌåµÄ¿ÉÒÔÈ¥¹ÙÍø²é¿´Ò»ÏÂÓ÷¨¡£ÏÂÃæÊÇVert.xÌṩµÄºËÐÄAPI¡£
HTTP/HTTPS Server/Client
Websocket SockJS
TCP/SSL Server/Client
UDP / DNS
Files / Timer
Json / Buffer / Flow Control
EventBus ( ¼¯Èº )
Distribution (Lock, Map, Counter)
Vert.xµÄÖ´Ðе¥Ôª½Ðverticle¡£¼´³ÌÐòµÄÈë¿Ú£¬Ã¿¸öÓïÑÔ¿ÉÄÜʵÏֵķ½Ê½²»Ò»Ñù£¬±ÈÈçJavaÐèÒª¼Ì³ÐÒ»¸öAbstractVerticle³éÏóÀ࣬¶øjavascriptÔòÖ±½Órequire(¡°vertx¡±)¾Í¿ÉÒÔÁË¡£
verticle·ÖÁ½ÖÖ£¬Ò»ÖÖÊÇ»ùÓÚEventLoopµÄÊʺÏI/OÃܼ¯Ð͵쬻¹ÓÐÒ»ÖÖÊÇÊʺÏCPUÃܼ¯Ð͵Äworker verticle¡£¶øverticleÖ®¼äÏ໥ͨÐÅÖ»ÄÜͨ¹ýEventbus£¬¿ÉÒÔÖ§³Öpoint to point µÄͨÐÅ£¬Ò²¿ÉÒÔÖ§³Öpublish & subscribeͨÐÅ·½Ê½¡£
ÎÒÃÇÖØµã˵һÏ»ùÓÚEventLoopµÄverticle¡£Õâ¸ö±¾ÖÊÉÏÊǸúnode.jsÒ»ÑùµÄ¡£ÏÂÃæµÄͼÆäʵ¾ÍÊÇnode.jsµÄ·°æ¡£

ͼ2 node.jsµÄ·°æ
ËùÓÐÒµÎñÂß¼Æäʵ¶¼»áÅÜÔÚNettyÀïµÄEventLoopÉÏ£¬¶øEventLoopͨ¹ýÑ»·Ê¼þ¶ÓÁÐÀ´Ö´ÐÐËùÓеÄÒµÎñÂß¼£¬ÕâÑù¿ÉÒÔ°ÑһЩI/O²Ù×÷Ƶ·±µÄʼþ¼°Ê±´ÓCPUÉϰþÀ뿪À´£¬×îºóͨ¹ý×¢²áÒ»¸ö»Øµ÷HandlerÀ´´¦ÀíËùÓеÄʼþ»Øµ÷¡£
ÁíÍâÒ»ÖÖworker verticle¡£Ö÷ÒªÊÇÓÃÀ´´¦Àíͬ²½´¦ÀíµÄ¡£±ÈÈçµÚÈý·½¿ò¼ÜûÓÐÒì²½½Ó¿Ú£¬×îµäÐ;ÍÊÇJDBC¡£ËùÒÔ¿ÉÒÔͨ¹ýworker verticleÀ´ÍË»¯µ½´«Í³µÄ»ùÓÚ¶àÏß³ÌÄ£Ð͵ÄʵÏÖ¡£ÕâÒ²ÊÇÆ¥ÅäһЩÔÏîÄ¿µÄÊֶΡ£
ͼ3ÊÇVert.xµÄÄÚ²¿ÕûÌå¼Ü¹¹
 ͼ3 Vert.xµÄÄÚ²¿ÕûÌå¼Ü¹¹
´ó¼Ò¿ÉÒÔ¿´µ½£¬ÎÒÃǵÄÒµÎñÂß¼Æäʵ¶¼ÊÇ»ùÓÚverticleÀ´ÊµÏֵģ¬È»ºóVert.x¿ò¼Ü»á½«ÄãµÄverticle°ó¶¨µ½Ïà¹ØµÄÏß³ÌÄ£ÐÍÉÏ£¬ÕâÀïverticle1,verticle2ÊÇI/OÃܼ¯ÐÍÏîÄ¿£¬ËùÓеÄÂß¼¶¼»áÅÜÔÚNIO WorkerÉÏ¡£¶øVerticle3»áÓÐһЩͬ²½µÄºÄʱµÄÇëÇó£¬Ôò»á±»°ó¶¨µ½WorkerÏß³ÌÄ£ÐÍÉÏ¡£ÁíÍâÁ½¸öVert.x½ÚµãÔòͨ¹ýEventBus»¥ÏàͨÐÅ£¬¶øEventBusͨ¹ýHazelCastÀ´»ñÈ¡Õû¸ö¼¯ÈºÀïµÄ½ÚµãÐÅÏ¢¡£×¢ÒâÕâÀïÿһ¸överticleÆäʵ¶¼ÊÇÒ»¸öÏß³Ì(Æô¶¯µÄʱºòÖ¸¶¨ÊµÀýÊýÄ¿²ÎÊý¼´¿É)£¬ÕâÑù¿ÉÒÔ³ä·ÖµÄÀûÓöàºË¡£¶ønode.jsÆäʵֻÄÜͨ¹ýClusterÀ´ÌáÉý¶àºËÀûÓá£
Vert.xµÄ²¿Ê𳡾°¼°¿ª·¢Í´µã
ͼ4ÊÇÒ»¸öµäÐ͵ÄVert.x²¿Ê𳡾°¡£
 ͼ4 Vert.x²¿Ê𳡾°
ÎÒÃÇ»á°ÑÂß¼²ð³ÉСµÄverticle¡£ÕâÀïÄã¿ÉÒÔ°ÑÕâЩСµÄverticle¿´³ÉÊÇ΢·þÎñ£¬È»ºóˮƽÀ©Õ¹ÕâЩ·þÎñ£¬Í¬Ê±Ò²¿ÉÒÔ°Ñ×Ô¼ºµÄÒµÎñ°´CPUÃܼ¯ÓëI/OÃܼ¯ÐͲð·Ö¡£·þÎñÓë·þÎñÖ®¼ä¿ÉÒÔͨ¹ýEventBus»¥Ïàµ÷Óã¬ÁíÍâVert.xµÄEventBusµ÷ÓÃÄ¿±êverticleµÄʱºò»á°´RoundRobinËã·¨À´×öbalance¡£
ÎÒÃÇÀ´¿´¿´Vert.x¿ª·¢µÄÍ´µã£¬ÕâÆäʵÊÇËùÓÐÒì²½¿ª·¢¶¼»áÓöµ½µÄÍ´µã£¬¾ÍÊÇCallback Hell¡£ÒòΪÄãËùÓеÄÒµÎñÂß¼¶¼»á±»²ð³ÉÒ»¸ö¸ö²»Á¬¹áµÄ´úÂë¿é£¬Ò²¾ÍÊÇ˵һ¸öÒµÎñÂß¼Èç¹ûÉæ¼°µ½I/O²Ù×÷Äã±ØÐëҪͨ¹ý»Øµ÷½Ó¿ÚÀ´¼ÌÐøÍê³É£¬ÕâÑù¾Í¶ªÊ§Á˾ֲ¿±äÁ¿£¬¶øÇÒÒì³£²¶»ñÒ²»á±äµÃ·Ç³£Âé·³¡£
ͼ5ÊÇÒ»¸öCallback HellµÄÀý×Ó
 ͼ5 Callback Hell´úÂëʾÀý
ÕâÀï´úÂëµÄº¬ÒåÊÇͨ¹ýEventBus¸øservice-address1·¢ËÍÒ»¸öÏûÏ¢£¬È»ºóµÈ´ý·µ»ØºóÔٰѽá¹û·¢Ë͸øservice-address2£¬Ôٵȴýservice-address2µÄ·µ»Ø½á¹û·¢Ë͸øservice-address3¡£ÕâÀïÐγÉÁ˵÷ÓÃÁ´£¬¼´ÏÂÒ»²½µÄÐÐΪÒÀÀµÉÏÒ»²½µÄ·µ»Ø½á¹û¡£Õâ¸öÔÚǰ¶ËÓÃAjaxµÄͬѧ¿Ï¶¨ºÜÊìϤ¡£
Äǽâ¾ö°ì·¨ÄØ£¬node.jsÀïÊÇÓÃpromise£¬¶øVert.x¿ÉÒÔʹÓÃJava8×Ô´øµÄCompletableFutureÀ´ÊµÏÖͬÑùµÄЧ¹û¡£Í¼6¾ÍÊÇÓÃCompletableFuture¸ÄдµÄÀý×Ó
 ͼ6 Callback Hell´úÂëʾÀý
´ó¼Ò¿ÉÒÔ·¢ÏÖ´úÂë±äµÃ¸ü±âƽÁË£¬Ã»ÓÐÄÇô¶àµÄǶÌ×£¬È»ºóͨ¹ýһЩ½é´Ê±ÈÈ磬then, whenµÈÀ´×éºÏ¸÷¸öÒì²½µÄÒµÎñÂß¼£¬×îºóÔÚÒ»¸öµØ·½Í³Ò»µÄ²¶»ñÒì³£¡£
ÕâÀï´óÁ¿ÓÃÁËJava8µÄй¦ÄÜ£¬±ÈÈçLambda±í´ïʽ£¬Èç¹û¾õµÃÆæ¹ÖµÄͬѧ£¬½¨ÒéÏÈÈ¥ÊìϤһÏÂJava8µÄLambda±í´ïʽ¡£
 ͼ7 CompletableFuture´úÂëʾÀý
ÄÇÓÐûÓиüºÃµÄʵÏÖ·½Ê½ÁËÄØ£¬Äܲ»Äܱä³Éͬ²½·½Ê½ÄØ¡£ÕâÀïVert.xÌṩÁËÒ»¸ö¿âvertx-sync¿ÉÒÔʵÏÖFiber¡£Í¨¹ýFiberÀ´·ÀÖ¹Ïß³ÌBlock£¬´Ó¶ø½«Òì²½´úÂëÍêÈ«µÄ±ä³Éͬ²½´úÂë¡£
ÕâÀï´úÂë˲¼ä±äµÃ·Ç³£ÇåÎú£¬ÍêÈ«ÊÇͬ²½µÄÑùʽ¡£vertx-syncÆäʵÊÇÒÀÀµÁËquasarÕâ¸öJava¿â£¬Ëüͨ¹ýÐÞ¸ÄJava×Ö½ÚÂëÀ´ÊµÏÖÏà¹ØµÄÂß¼£¬ÕâÀïÆäʵÊÇÔÚEventLoopÏß³ÌÀïÓÖ¿ª±ÙÁËÒ»¸öÏ̳߳أ¬ËùÓеÄÔÚEventLoopÀïµÄͬ²½µÄ·½·¨»á±»Õâ¸öÏ̳߳ؽӹܣ¬´¦ÀíÍêºó»áÔÙ·µ»Ø¸øEventLoopÏ̡߳£ÕâÑù¿ÉÒÔ±ÜÃâEventLoopÏ̱߳»×èÈû¡£
 ͼ8 vertx-sync´úÂëʾÀý
µ«ÊǸöÈ˲»ÍƼöÔÚÉú²ú»·¾³Ê¹ÓÃÕâ¸ö¿â£¬ÒòΪËü±Ï¾¹²»ÊÇÓïÑÔ¼¶±ðµÄÖ§³ÖFiber¡£ÐèÒªJVMÆô¶¯µÄʱºòͨ¹ýjavaAgentÀ´¼ÓÔØÏà¹ØµÄquasar¿â¡£
ÕâÀﻹÓÐÒ»¸ö¿â£¬ÔÚ½ñÌìÌØ±ðµÄ»ð¡ª¡ªRxJava¡£Õâ¸öÆäʵÊÇReactiveµÄJavaʵÏÖ£¬¹Ù·½Ò²ÌṩÁËÏà¹ØµÄÖ§³Ö£¬µ«ÊÇReactive±È½Ï¸´ÔÓ£¬³ý·ÇµÄÒµÎñÉæ¼°ºÜ¶àµÄÁ÷ʽ²Ù×÷£¬·ñÔò²»½¨ÒéÄãʹÓá£ÏÂÃæÊǹٷ½µÄÒ»¸öÀý×Ó¡£
¼òµ¥ËµÃ÷һϣ¬ÕâÀﶨÒåÁËÒ»¸öEventBus£¬ÓÃÀ´½ÓÊÜ·¢¸øheat-sensorµÄÏûÏ¢£¬È»ºóÿ¸ô1ÃëÖÓ¶ÔÀÛ»ýµÄÏûÏ¢½øÐÐÒ»´ÎÅú´¦Àí£¬ÕâÀïͨ¹ýJava8µÄStream½Ó¿Ú×öÁËÒ»´ÎÇ󯽾ùÖµ£¬×îºó½«½á¹ûͨ¹ýEventBus·¢¸ønews-feedÕâ¸överticle×ö½øÒ»²½µÄ´¦Àí¡£
ÕâÀï´ó¼Ò¿ÉÒÔ·¢ÏÖRxJava¿ÉÒÔ×ö¸ü¶àµÄÊÂÇ飬ǰÌáÊÇ´ó¼ÒÒª¶ÔFRP±à³Ì˼ÏëÄܹ»½ÓÊÜ¡£
Vert.x3³£Óù¤¾ß
×îºóÔÚÌáһϼ¸¸öVert.x3µÄһЩС¹¤¾ß¡£
Ò»¸öÊÇmetrics¡£Õâ¸ö¿ÉÒÔÓÃÀ´Í³¼ÆÕû¸öVert.xÄÚ²¿µÄһЩָ±êÐÅÏ¢£¬±ÈÈçHTTPÇëÇóÊý£¬TCP½ÓÊÜ»òÕß·¢Ë͵ÄÁ÷Á¿µÈµÈ£¬¾ßÌå¿ÉÒÔ¿´¹Ù·½Îĵµ£¬Í¨¹ýÕâ¸ö½Ó¿ÚÎÒÃÇ¿ÉÒÔʵʱµÄͳ¼ÆVert.xÄÚ²¿ÐÔÄÜÐÅÏ¢¡£
ÁíÍâVert.xÌṩÁËרÃÅÕë¶ÔÒì²½´úÂëµÄµ¥Ôª²âÊÔ¿ò¼Üvertx-test-unit¡£
ͨ¹ýredeployÕâ¸ö²ÎÊý¿ÉÒÔ¶¯Ì¬µÄÈȲ¿ÊðÕû¸överticle£¬Õâ¸ö¶Ô¿ª·¢µ÷ÊÔʱ·Ç³£ÓÐÓá£
×îÖØÒªµÄÊÇVert.x3ÄÚÖÃÁËEventLoopCheckerÕâ¸ö¶¯Ì¬¼à²âËùÓÐEventLoopÏ̵߳Ť¾ß£¬Ä¬ÈÏEventLoop±»×èÈûÁË2ÃëÖÓµÄʱºò»á´¥·¢±¨¾¯£¬Èç¹û³ÖÐø×èÈûÔò»áÖ±½Ó´òÓ¡ÄÇÒ»¿éµÄÒì³£Õ»µ½ÈÕÖ¾À·Ç³£·½±ã¿ª·¢ÕßÀ´¼ì²é×Ô¼ºµÄÒì²½´úÂë¡£
Vert.xĿǰÔÚ¹úÄÚ»¹²»ÊǺܻ𣬵«ÊÇÔÚ¹úÍâÒѾÓкܶàÆóÒµÔÚʹÓÃÁË£¬±È½Ï×¢Ã÷µÄ±ÈÈçÓ¢æÚ½ÌÓý¡¢Hulu¡¢ÒÔ¼°×öJVM¼à¿ØµÄÒ»¼Ò¹«Ë¾jClarityµÈ¡£
×÷Õß¼ò½é
ÁõСϪ£¬Maxleap.com ¸ß¼¶¿ª·¢¹¤³Ìʦ¡£Vert.xÉçÇøÒ»Ô±£¬¹±Ï×vert.xµÄClojureʵÏÖ£¬Í¬Ê±À©Õ¹ÁËVert.xµÄ·Ö²¼Ê½ÊµÏÖ¡£Ä¿Ç°ÔÚMaxleap.comÍÆ½ø»ùÓÚVert.xµÄ΢·þÎñ»¯£¬ÈÝÆ÷»¯Ïà¹Ø¼¼Êõ¡£
|