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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Vert.x3Òì²½¿ò¼Üʵս
 
×÷ÕߣºÁõСϪ À´Ô´:¡¶³ÌÐòÔ±¡·µç×Ó¿¯   ·¢²¼ÓÚ 2015-12-25
  7153  次浏览      29
 

ÕªÒª£º×÷ΪÒì²½ÎÞ×èÈûµÄÍøÂç¿ò¼Ü£¬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µÄ΢·þÎñ»¯£¬ÈÝÆ÷»¯Ïà¹Ø¼¼Êõ¡£

 

   
7153 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Óû§¹ÊÊÂÓëÓÃÀý
½»»¥Éè¼ÆÊ¦Ö®¾«Òæ»­²¼Æª
Êý¾Ý·ÖÎöÖ®Óû§»­Ïñ·½·¨Óëʵ¼ù
ÈçºÎ¿ìËÙ½¨Á¢Óû§Ä£ÐÍ£¿
 
Ïà¹ØÎĵµ

Óû§½çÃæÉè¼Æ
¸øÆóÒµ×ö´óÊý¾Ý¾«×¼Óû§»­Ïñ
Óû§ÌåÑéºÍ½»»¥Éè¼Æ
´óÊý¾ÝϵÄÓû§»­Ïñ
Ïà¹Ø¿Î³Ì

Óû§ÌåÑé&½çÃæÉè¼Æ
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
Óû§Ñо¿ÓëÓû§½¨Ä£
Óû§ÌåÑéµÄÈí¼þUIÉè¼Æ×î¼Ñʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

´ÓÊÖ»úµÇÂ¼Ò³ÃæÉè¼ÆÏëµ½µÄ
ÈçºÎ°ÑÎÞÒâʶÒýÈë½»»¥Éè¼ÆÖÐ
½»»¥Éè¼ÆµÄÕæÏà
µ±ÊÓ¾õÉè¼ÆÊ¦ÓöÉϲúÆ·¾­Àí
ÊÖ»ú½»»¥Éè¼ÆÔ­Ôò
Óû§ÌåÑéÖ®ÍøÒ³°å¿éÉè¼Æ

ÒÔÓû§ÎªÖÐÐĵÄÉè¼Æ
¿ÉÓÃÐÔÆÀ¹À
Desktop¼°Web-basedÊÓ¾õÉè¼Æ
ÈÏÖªÔ­ÀíÓëÉè¼ÆÓ¦ÓÃ
ÊÖ»úÓû§½çÃæÉè¼Æ

±±¾© ÒÔÓû§ÎªÖÐÐĵĽçÃæÉè¼Æ
±±¾© Óû§ÌåÑé& ½çÃæÉè¼Æ
ÉϺ£ »ªÎª Óû§ÌåÑé& ½çÃæÉè¼Æ
ÉîÛÚ Óû§ÌåÑé& ½çÃæÉè¼Æ
°®Á¢ÐÅ ÒÔÓû§ÎªÖÐÐĵÄÉè¼Æ
±±¾© Óû§ÌåÑéÓë½çÃæÉè¼Æ
¸£ÖÝ ÒÔÓû§ÎªÖÐÐĵĽçÃæÉè¼Æ