¸üÐÂʱ¼ä:2018Äê06ÔÂ07ÈÕ14ʱ27·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:

¿ª·¢µ¥ÌåʽӦÓÃ
¼ÙÉèÄãÕý×¼±¸¿ª·¢Ò»¿îÓëUberºÍHailo¾ºÕùµÄ³ö×â³µµ÷¶ÈÈí¼þ£¬¾¹ý³õ²½»áÒéºÍÐèÇó·ÖÎö£¬Äã¿ÉÄÜʹÓô«Í³µÄ³ÌÐò¿ò¼ÜÀ´Éú³ÉÄãµÄÏîÄ¿£¬×îÖյijÌÐò¼Ü¹¹ÈçÏÂͼËùʾ£º

¾¡¹ÜÒ²ÊÇÄ£¿é»¯Âß¼£¬µ«ÊÇ×îÖÕËü»¹ÊÇ»á´ò°ü²¢²¿ÊðΪµ¥ÌåʽӦÓ᣾ßÌåµÄ¸ñʽÒÀÀµÓÚÓ¦ÓÃÓïÑԺͿò¼Ü¡£×îÖÕ³ÌÐò·¢²¼µÄʱºòÒ²»á±»´ò°ü³Éµ¥Ò»µÄ³ÌÐò·¢²¼³öÀ´¡£
µ¥ÌåʽӦÓõIJ»×ã
²»ÐÒµÄÊÇ£¬ÕâÖÖ¼òµ¥·½·¨È´ÓкܴóµÄ¾ÖÏÞÐÔ¡£Ò»¸ö¼òµ¥µÄÓ¦ÓûáËæ×Åʱ¼äÍÆÒÆÖð½¥±ä´ó¡£ÔÚÿ´ÎµÄsprintÖУ¬¿ª·¢ÍŶӶ¼»áÃæ¶ÔГ¹ÊÊ”£¬È»ºó¿ª·¢Ðí¶àдúÂë¡£¼¸Äêºó£¬Õâ¸öС¶ø¼òµ¥µÄÓ¦Óûá±ä³ÉÁËÒ»¸ö¾Þ´óµÄ¹ÖÎï¡£Õâ¶ùÓÐÒ»¸öÀý×Ó£¬ÎÒ×î½üºÍÒ»¸ö¿ª·¢ÕßÌÖÂÛ£¬ËûÕýÔÚдһ¸ö¹¤¾ß£¬ÓÃÀ´·ÖÎöËûÃÇÒ»¸öÓµÓÐÊý°ÙÍòÐдúÂëµÄÓ¦ÓÃÖÐJARÎļþÖ®¼äµÄÒÀÀµ¹ØÏµ¡£ÎÒºÜÈ·ÐÅÕâ¸ö´úÂëÕýÊǺܶ࿪·¢Õß¾¹ý¶àÄêŬÁ¦¿ª·¢³öÀ´µÄÒ»¸ö¹ÖÎï¡£
Ò»µ©ÄãµÄÓ¦Óñä³ÉÒ»¸öÓÖ´óÓÖ¸´ÔӵĹÖÎÄÇ¿ª·¢ÍŶӿ϶¨ºÜÍ´¿à¡£Ãô½Ý¿ª·¢ºÍ²¿Êð¾Ù²½Î¬¼è£¬ÆäÖÐ×îÖ÷ÒªÎÊÌâ¾ÍÊÇÕâ¸öÓ¦ÓÃÌ«¸´ÔÓ£¬ÒÔÖÁÓÚÈκε¥¸ö¿ª·¢Õß¶¼²»¿ÉÄܸ㶮Ëü¡£Òò´Ë£¬ÐÞÕýbugºÍÕýÈ·µÄÌí¼Óй¦ÄܱäµÄ·Ç³£À§ÄÑ£¬²¢ÇҺܺÄʱ¡£ÁíÍ⣬ÍŶÓÊ¿ÆøÒ²»á×ßÏÂÆÂ·¡£Èç¹û´úÂëÄÑÓÚÀí½â£¬¾Í²»¿ÉÄܱ»ÕýÈ·µÄÐ޸ġ£×îÖÕ»á×ßÏò¾Þ´óµÄ¡¢²»¿ÉÀí½âµÄÄà̶¡£
ÁíÍ⣬¸´ÔÓ¶ø¾Þ´óµÄµ¥ÌåʽӦÓÃÒ²²»ÀûÓÚ³ÖÐøÐÔ¿ª·¢¡£½ñÌ죬SaaSÓ¦Óó£Ì¬¾ÍÊÇÿÌì»á¸Ä±äºÜ¶à´Î£¬¶øÕâ¶ÔÓÚµ¥ÌåʽӦÓÃģʽ·Ç³£À§ÄÑ¡£ÁíÍ⣬ÕâÖֱ仯´øÀ´µÄÓ°Ï첢ûÓкܺõı»Àí½â£¬ËùÒÔ²»µÃ²»×öºÜ¶àÊÖ¹¤²âÊÔ¡£ÄÇô½ÓÏÂÀ´£¬³ÖÐø²¿ÊðÒ²»áºÜ¼èÄÑ¡£
µ¥ÌåʽӦÓÃÁíÍâÒ»¸öÎÊÌâÊǿɿ¿ÐÔ¡£ÒòΪËùÓÐÄ£¿é¶¼ÔËÐÐÔÚÒ»¸ö½ø³ÌÖУ¬ÈκÎÒ»¸öÄ£¿éÖеÄÒ»¸öbug£¬±ÈÈçÄÚ´æÐ¹Â¶£¬½«»áÓпÉÄÜŪ¿åÕû¸ö½ø³Ì¡£³ý´ËÖ®Í⣬ÒòΪËùÓÐÓ¦ÓÃʵÀý¶¼ÊÇΨһµÄ£¬Õâ¸öbug½«»áÓ°Ïìµ½Õû¸öÓ¦ÓõĿɿ¿ÐÔ¡£
×îºó£¬µ¥ÌåʽӦÓÃʹµÃ²ÉÓÃмܹ¹ºÍÓïÑԷdz£À§ÄÑ¡£±ÈÈ磬ÉèÏëÄãÓÐÁ½°ÙÍòÐвÉÓÃXYZ¿ò¼ÜдµÄ´úÂë¡£Èç¹ûÏë¸Ä³ÉABC¿ò¼Ü£¬ÎÞÂÛÊÇʱ¼ä»¹Êdzɱ¾¶¼ÊǷdz£°º¹óµÄ£¬¼´Ê¹ABC¿ò¼Ü¸üºÃ¡£Òò´Ë£¬ÕâÊÇÒ»¸öÎÞ·¨ÓâÔ½µÄºè¹µ¡£Äã²»µÃ²»ÔÚ×î³õÑ¡ÔñÃæÇ°µÍÍ·¡£
ÄÇôÈçºÎÓ¦¶ÔÄØ?
΢´¦Àí¼Ü¹¹——´¦Àí¸´ÔÓÊÂÎï
Ðí¶à¹«Ë¾£¬±ÈÈçAmazon¡¢eBayºÍNetFlix£¬Í¨¹ý²ÉÓÃ΢´¦Àí½á¹¹Ä£Ê½½â¾öÁËÉÏÊöÎÊÌâ¡£Æä˼·²»ÊÇ¿ª·¢Ò»¸ö¾Þ´óµÄµ¥ÌåʽµÄÓ¦Ó㬶øÊǽ«Ó¦Ó÷ֽâΪСµÄ¡¢»¥ÏàÁ¬½ÓµÄ΢·þÎñ¡£
Ò»¸ö΢·þÎñÒ»°ãÍê³Éij¸öÌØ¶¨µÄ¹¦ÄÜ£¬±ÈÈçϵ¥¹ÜÀí¡¢¿Í»§¹ÜÀíµÈµÈ¡£Ã¿Ò»¸ö΢·þÎñ¶¼ÊÇ΢ÐÍÁù½ÇÐÎÓ¦Ó㬶¼ÓÐ×Ô¼ºµÄÒµÎñÂß¼ºÍÊÊÅäÆ÷¡£Ò»Ð©Î¢·þÎñ»¹»á·¢²¼API¸øÆäËü΢·þÎñºÍÓ¦Óÿͻ§¶ËʹÓá£ÆäËü΢·þÎñÍê³ÉÒ»¸öWeb UI£¬ÔËÐÐʱ£¬Ã¿Ò»¸öʵÀý¿ÉÄÜÊÇÒ»¸öÔÆVM»òÕßÊÇDockerÈÝÆ÷¡£
±ÈÈ磬һ¸öÇ°ÃæÃèÊöϵͳ¿ÉÄܵķֽâÈçÏ£º

ÿһ¸öÓ¦Óù¦ÄÜÇø¶¼Ê¹ÓÃ΢·þÎñÍê³É£¬ÁíÍ⣬WebÓ¦Óûᱻ²ð·Ö³ÉһϵÁмòµ¥µÄWebÓ¦ÓÃ(±ÈÈçÒ»¸ö¶Ô³Ë¿Í£¬Ò»¸ö¶Ô³ö×â³µ¼ÝʻԱ)¡£ÕâÑùµÄ²ð·Ö¶ÔÓÚ²»Í¬Óû§¡¢É豸ºÍÌØÊâÓ¦Óó¡¾°²¿Ê𶼸üÈÝÒס£
ÿһ¸öºǫ́·þÎñ¿ª·ÅÒ»¸öREST API£¬Ðí¶à·þÎñ±¾ÉíÒ²²ÉÓÃÁËÆäËü·þÎñÌṩµÄAPI¡£±ÈÈ磬¼ÝʻԱ¹ÜÀíʹÓÃÁ˸æÖª¼ÝʻԱһ¸öDZÔÚÐèÇóµÄ֪ͨ·þÎñ¡£UI·þÎñ¼¤»îÆäËü·þÎñÀ´¸üÐÂWebÒ³Ãæ¡£ËùÓзþÎñ¶¼ÊDzÉÓÃÒì²½µÄ£¬»ùÓÚÏûÏ¢µÄͨѶ¡£
΢·þÎñ¼Ü¹¹µÄºÃ´¦
΢·þÎñ¼Ü¹¹Ä£Ê½ÓкܶàºÃ´¦¡£Ê×ÏÈ£¬Í¨¹ý·Ö½â¾Þ´óµ¥ÌåʽӦÓÃΪ¶à¸ö·þÎñ·½·¨½â¾öÁ˸´ÔÓÐÔÎÊÌâ¡£ÔÚ¹¦Äܲ»±äµÄÇé¿öÏ£¬Ó¦Óñ»·Ö½âΪ¶à¸ö¿É¹ÜÀíµÄ·ÖÖ§»ò·þÎñ¡£Ã¿¸ö·þÎñ¶¼ÓÐÒ»¸öÓÃRPC-»òÕßÏûÏ¢Çý¶¯API¶¨ÒåÇå³þµÄ±ß½ç¡£Î¢·þÎñ¼Ü¹¹Ä£Ê½¸ø²ÉÓõ¥Ìåʽ±àÂ뷽ʽºÜÄÑʵÏֵŦÄÜÌṩÁËÄ£¿é»¯µÄ½â¾ö·½°¸£¬ÓÉ´Ë£¬µ¥¸ö·þÎñºÜÈÝÒ׿ª·¢¡¢Àí½âºÍά»¤¡£
µÚ¶þ£¬ÕâÖּܹ¹Ê¹µÃÿ¸ö·þÎñ¶¼¿ÉÒÔÓÐרÃÅ¿ª·¢ÍŶÓÀ´¿ª·¢¡£¿ª·¢Õß¿ÉÒÔ×ÔÓÉÑ¡Ôñ¿ª·¢¼¼Êõ£¬ÌṩAPI·þÎñ¡£µ±È»£¬Ðí¶à¹«Ë¾ÊÔͼ±ÜÃâ»ìÂÒ£¬Ö»ÌṩijЩ¼¼ÊõÑ¡Ôñ¡£È»ºó£¬ÕâÖÖ×ÔÓÉÒâζ×Å¿ª·¢Õß²»ÐèÒª±»ÆÈʹÓÃijÏîÄ¿¿ªÊ¼Ê±²ÉÓõĹýʱ¼¼Êõ£¬ËûÃÇ¿ÉÒÔÑ¡ÔñÏÖÔڵļ¼Êõ¡£ÉõÖÁÓÚ£¬ÒòΪ·þÎñ¶¼ÊÇÏà¶Ô¼òµ¥£¬¼´Ê¹ÓÃÏÖÔÚ¼¼ÊõÖØÐ´ÒÔǰ´úÂëÒ²²»ÊǺÜÀ§ÄѵÄÊÂÇé¡£
µÚÈý£¬Î¢·þÎñ¼Ü¹¹Ä£Ê½ÊÇÿ¸ö΢·þÎñ¶ÀÁ¢µÄ²¿Ê𡣿ª·¢Õß²»ÔÙÐèҪе÷ÆäËü·þÎñ²¿Êð¶Ô±¾·þÎñµÄÓ°Ïì¡£ÕâÖָıä¿ÉÒԼӿ첿ÊðËÙ¶È¡£UIÍŶӿÉÒÔ²ÉÓÃAB²âÊÔ£¬¿ìËٵIJ¿Êð±ä»¯¡£Î¢·þÎñ¼Ü¹¹Ä£Ê½Ê¹µÃ³ÖÐø»¯²¿Êð³ÉΪ¿ÉÄÜ¡£
×îºó£¬Î¢·þÎñ¼Ü¹¹Ä£Ê½Ê¹µÃÿ¸ö·þÎñ¶ÀÁ¢À©Õ¹¡£Äã¿ÉÒÔ¸ù¾Ýÿ¸ö·þÎñµÄ¹æÄ£À´²¿ÊðÂú×ãÐèÇóµÄ¹æÄ£¡£ÉõÖÁÓÚ£¬Äã¿ÉÒÔʹÓøüÊʺÏÓÚ·þÎñ×ÊÔ´ÐèÇóµÄÓ²¼þ¡£
΢·þÎñ¼Ü¹¹µÄÌØÐÔ
1. µ¥Ò»Ö°Ôð
΢·þÎñ¼Ü¹¹ÖеÄÿ¸ö·þÎñ£¬¶¼ÊǾßÓÐÒµÎñÂß¼µÄ£¬·ûºÏ¸ßÄÚ¾Û¡¢µÍñîºÏÔÔòÒÔ¼°µ¥Ò»Ö°ÔðÔÔòµÄµ¥Ôª£¬²»Í¬µÄ·þÎñͨ¹ý“¹ÜµÀ”µÄ·½Ê½Áé»î×éºÏ£¬´Ó¶ø¹¹½¨³öÅÓ´óµÄϵͳ¡£
2. ÇáÁ¿¼¶Í¨ÐÅ
·þÎñÖ®¼äͨ¹ýÇáÁ¿¼¶µÄͨÐÅ»úÖÆÊµÏÖ»¥Í¨»¥Áª£¬¶øËùνµÄÇáÁ¿¼¶£¬Í¨³£Ö¸ÓïÑÔÎ޹ء¢Æ½Ì¨Î޹صĽ»»¥·½Ê½¡£

¶ÔÓÚÇáÁ¿¼¶Í¨Ðŵĸñʽ¶øÑÔ£¬ÎÒÃÇÊìϤµÄ XML ºÍ JSON£¬ËüÃÇÊÇÓïÑÔÎ޹ء¢Æ½Ì¨Î޹صÄ;¶ÔÓÚͨÐŵÄÐÒé¶øÑÔ£¬Í¨³£»ùÓÚ HTTP£¬ÄÜÈ÷þÎñ¼äµÄͨÐűäµÃ±ê×¼»¯¡¢ÎÞ״̬»¯¡£Ä¿Ç°´ó¼ÒÊìϤµÄ REST(Representational State Transfer)ÊÇʵÏÖ·þÎñ¼ä»¥ÏàÐ×÷µÄÇáÁ¿¼¶Í¨ÐÅ»úÖÆÖ®Ò»¡£Ê¹ÓÃÇáÁ¿¼¶Í¨ÐÅ»úÖÆ£¬¿ÉÒÔÈÃÍŶÓÑ¡Ôñ¸üÊʺϵÄÓïÑÔ¡¢¹¤¾ß»òÕ߯½Ì¨À´¿ª·¢·þÎñ±¾Éí¡£
3. ¶ÀÁ¢ÐÔ
ÿ¸ö·þÎñÔÚÓ¦Óý»¸¶¹ý³ÌÖУ¬¶ÀÁ¢µØ¿ª·¢¡¢²âÊԺͲ¿Êð¡£
ÔÚµ¥¿é¼Ü¹¹ÖÐËùÓй¦Äܶ¼ÔÚͬһ¸ö´úÂë¿â£¬¹¦ÄܵĿª·¢²»¾ßÓжÀÁ¢ÐÔ;µ±²»Í¬Ð¡×éÍê³É¶à¸ö¹¦Äܺó£¬ÐèÒª¾¹ý¼¯³ÉºÍ»Ø¹é²âÊÔ£¬²âÊÔ¹ý³ÌÒ²²»¾ßÓжÀÁ¢ÐÔ;µ±²âÊÔÍê³Éºó£¬Ó¦Óñ»¹¹½¨³ÉÒ»¸ö°ü£¬Èç¹ûij¸ö¹¦ÄÜ´æÔÚ bug£¬½«µ¼ÖÂÕû¸ö²¿Êðʧ°Ü»òÕ߻عö¡£

ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ã¿¸ö·þÎñ¶¼ÊǶÀÁ¢µÄÒµÎñµ¥Ôª£¬ÓëÆäËû·þÎñ¸ß¶È½âñֻÐèÒª¸Ä±äµ±Ç°·þÎñ±¾Éí£¬¾Í¿ÉÒÔÍê³É¶ÀÁ¢µÄ¿ª·¢¡¢²âÊԺͲ¿Êð¡£

4. ½ø³Ì¸ôÀë
ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ã¿¸ö·þÎñ¶¼ÊǶÀÁ¢µÄÒµÎñµ¥Ôª£¬ÓëÆäËû·þÎñ¸ß¶È½âñֻÐèÒª¸Ä±äµ±Ç°·þÎñ±¾Éí£¬¾Í¿ÉÒÔÍê³É¶ÀÁ¢µÄ¿ª·¢¡¢²âÊԺͲ¿Êð¡£ÓÐʱºòÎÒÃÇ»á½«ÖØ¸´µÄ´úÂë³éÈ¡³öÀ´·â×°³É×é¼þ£¬ÔÚµ¥¿é¼Ü¹¹ÖУ¬×é¼þͨ³£µÄÐÎ̬½Ð×ö¹²Ïí¿â(Èç jar °ü»òÕß DLL)£¬µ«Êǵ±³ÌÐòÔËÐÐʱ£¬ËùÓÐ×é¼þ×îÖÕÒ²»á±»¼ÓÔØµ½Í¬Ò»½ø³ÌÖÐÔËÐС£

ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ó¦ÓóÌÐòÓɶà¸ö·þÎñ×é³É£¬Ã¿¸ö·þÎñ¶¼ÊǸ߶È×ÔÖεĶÀÁ¢ÒµÎñʵÌ壬¿ÉÒÔÔËÐÐÔÚ¶ÀÁ¢µÄ½ø³ÌÖУ¬²»Í¬µÄ·þÎñÄܷdz£ÈÝÒ׵ز¿Êðµ½²»Í¬µÄÖ÷»úÉÏ¡£

¼ÈȻҪ½éÉÜ΢·þÎñ£¬¾Í²»µÃ²»½éÉÜÒ»ÏÂÓë΢·þÎñÏà¹ØµÄ¼¼Êõ¡£ÄÇô£¬½ÓÏÂÀ´£¬ÎÒÃÇÒ»Ò»×öÒ»ÏÂÏêϸ½²½â¡£
protoBuf(GoogleÆìÏÂÆ½Ì¨ÓïÑÔÎÞ¹ØÐòÁл¯Êý¾ÝÐÒé)

protobufÊÇgoogleÆìϵÄÒ»¿îƽ̨Î޹أ¬ÓïÑÔÎ޹أ¬¿ÉÀ©Õ¹µÄÐòÁл¯½á¹¹Êý¾Ý¸ñʽ¡£ËùÒÔºÜÊʺÏÓÃ×öÊý¾Ý´æ´¢ºÍ×÷Ϊ²»Í¬Ó¦Ó㬲»Í¬ÓïÑÔÖ®¼äÏ໥ͨÐŵÄÊý¾Ý½»»»¸ñʽ£¬Ö»ÒªÊµÏÖÏàͬµÄÐÒé¸ñʽ¼´Í¬Ò» protoÎļþ±»±àÒë³É²»Í¬µÄÓïÑÔ°æ±¾£¬¼ÓÈëµ½¸÷×ԵŤ³ÌÖÐÈ¥¡£ÕâÑù²»Í¬ÓïÑԾͿÉÒÔ½âÎöÆäËûÓïÑÔͨ¹ý protobufÐòÁл¯µÄÊý¾Ý¡£Ä¿Ç°¹ÙÍøÌṩÁË C++,Python,JAVA,GOµÈÓïÑÔµÄÖ§³Ö¡£
protobufÓï·¨¶¨Òå
ÒªÏëʹÓà protobuf±ØÐëµÃÏȶ¨Òå protoÎļþ¡£ËùÒÔµÃÏÈÊìϤ protobufµÄÏûÏ¢¶¨ÒåµÄÏà¹ØÓï·¨¡£ÏÂÃæ¾ÍÀ´½éÉÜ¡£
Ê×ÏÈÎÒÃÇÏȶ¨ÒåÒ»¸ö protoÎļþ£¬½á¹¹ÈçÏ£º
message Article {
required int32 article_id=1;
optional string article_excerpt=2;
repeated string article_picture=3;
}
ÉÏÃæÎÒÃÇÖ÷Òª¶¨ÒåÁËÒ»¸öÏûÏ¢£¬Õâ¸öÏûÏ¢°üÀ¨ÎÄÕ ID£¬ÎÄÕÂÕªÒª£¬ÎÄÕÂͼƬ¡£ÏÂÃæ¸ø³öÏûÏ¢¶¨ÒåµÄÏà¹ØËµÃ÷ £º
n messageÊÇÏûÏ¢¶¨ÒåµÄ¹Ø¼ü×Ö¡£
a) required±íʾÊÇÒ»¸ö±ØÐë×ֶΣ¬±ØÐëÏà¶ÔÓÚ·¢ËÍ·½£¬ÔÚ·¢ËÍÏûϢ֮ǰ±ØÐëÉèÖøÃ×ֶεÄÖµ£¬¶ÔÓÚ½ÓÊÕ·½£¬±ØÐëÄܹ»Ê¶±ð¸Ã×ֶεÄÒâ˼¡£·¢ËÍ֮ǰûÓÐÉèÖÃrequired×ֶλòÕßÎÞ·¨Ê¶±ðrequired×ֶζ¼»áÒý·¢±à½âÂëÒì³££¬µ¼ÖÂÏûÏ¢±»¶ªÆú¡£
b) Optional£º±íʾÊÇÒ»¸ö¿ÉÑ¡×ֶΣ¬¿ÉÑ¡¶ÔÓÚ·¢ËÍ·½£¬ÔÚ·¢ËÍÏûϢʱ£¬¿ÉÒÔÓÐÑ¡ÔñÐÔµÄÉèÖûòÕß²»ÉèÖøÃ×ֶεÄÖµ¡£¶ÔÓÚ½ÓÊÕ·½£¬Èç¹ûÄܹ»Ê¶±ð¿ÉÑ¡×ֶξͽøÐÐÏàÓ¦µÄ´¦Àí£¬Èç¹ûÎÞ·¨Ê¶±ð£¬ÔòºöÂÔ¸Ã×ֶΣ¬ÏûÏ¢ÖÐµÄÆäËü×Ö¶ÎÕý³£´¦Àí¡£---ÒòΪoptional×ֶεÄÌØÐÔ£¬ºÜ¶à½Ó¿ÚÔÚÉý¼¶°æ±¾Öж¼°ÑºóÀ´Ìí¼ÓµÄ×ֶζ¼Í³Ò»µÄÉèÖÃΪoptional×ֶΣ¬ÕâÑùÀϵİ汾ÎÞÐèÉý¼¶³ÌÐòÒ²¿ÉÒÔÕý³£µÄÓëеÄÈí¼þ½øÐÐͨÐÅ£¬Ö»²»¹ýеÄ×Ö¶ÎÎÞ·¨Ê¶±ð¶øÒÑ£¬ÒòΪ²¢²»ÊÇÿ¸ö½Úµã¶¼ÐèÒªÐµĹ¦ÄÜ£¬Òò´Ë¿ÉÒÔ×öµ½°´ÐèÉý¼¶ºÍƽ»¬¹ý¶É¡£
c) Repeated£º±íʾ¸Ã×ֶοÉÒÔ°üº¬0~N¸öÔªËØ¡£ÆäÌØÐÔºÍoptionalÒ»Ñù£¬µ«ÊÇÿһ´Î¿ÉÒÔ°üº¬¶à¸öÖµ¡£¿ÉÒÔ¿´×÷ÊÇÔÚ´«µÝÒ»¸öÊý×éµÄÖµ
d) int32ºÍstringÊÇ×ֶεÄÀàÐÍ¡£ºóÃæÊÇÎÒÃǶ¨ÒåµÄ×Ö¶ÎÃû¡£×îºóµÄ 1£¬2£¬3ÔòÊÇ´ú±íÿ¸ö×ֶεÄÒ»¸öΨһµÄ±àºÅ±êÇ©£¬ÔÚͬһ¸öÏûÏ¢Àï²»¿ÉÒÔÖØ¸´¡£ÕâЩ±àºÅ±êÇ©ÓÃÓëÔÚÏûÏ¢¶þ½øÖƸñʽÖбêʶÄãµÄ×ֶΣ¬²¢ÇÒÏûÏ¢Ò»µ©¶¨Òå¾Í²»Äܸü¸Ä¡£ÐèҪ˵Ã÷µÄÊDZêÇ©ÔÚ 1µ½15·¶Î§µÄ²ÉÓÃÒ»¸ö×Ö½Ú½øÐбàÂë¡£ËùÒÔͨ³£½«±êÇ© 1µ½15ÓÃÓÚÆµ·±·¢ÉúµÄÏûÏ¢×ֶΡ£±àºÅ±êÇ©´óСµÄ·¶Î§ÊÇ1µ½229 – 1¡£´ËÍâ²»ÄÜʹÓÃprotobufϵͳԤÁôµÄ±àºÅ±êÇ©(19000 -19999)
µ±È» protobufÖ§³Ö¸ü¶àµÄÀàÐÍ£¬±ÈÈç bool,double,float£¬Ã¶¾Ù£¬Ò²¿ÉÒÔÊÇÆäËû¶¨Òå¹ýµÄÏûÏ¢ÀàÐÍÆ©ÈçÇ°ÃæµÄÏûÏ¢ Article¡£Ö§³ÖµÄ»ù±¾ÀàÐÍÈçÏ£º

Ò»°ãÔÚÎÒÃǵÄÏîÄ¿Öп϶¨»áÓкܶàÏûÏ¢ÀàÐÍ¡£ÎÒÃÇ×ܲ»Äܶ¼¶¨ÒåÔÚÒ»¸öÎļþÖС£µ±Ò»¸ö protoÎļþÐèÒªÁíÒ»¸ö protoÎļþµÄʱºò£¬ÎÒÃÇ¿ÉÒÔͨ¹ý importµ¼È룬¾ÍÏñÏÂÃæÕâÑù£º
import "article.proto";
message Book {
//¶¨ÒåÏûÏ¢Ìå
}
protoBufʹÓÃ
protobufµÄʹÓ÷½·¨Êǽ«Êý¾Ý½á¹¹Ð´Èëµ½ .protoÎļþÖУ¬Ê¹Óà protoc±àÒëÆ÷±àÒë(¼ä½ÓʹÓÃÁ˲å¼þ)µÃµ½Ò»¸öÐ嵀 go°ü£¬ÀïÃæ°üº¬ goÖпÉÒÔʹÓõÄÊý¾Ý½á¹¹ºÍһЩ¸¨Öú·½·¨¡£
Golang & protoBuf
1. $GOPATH/src/´´½¨ myprotoÎļþ¼Ð
2. myprotoÎļþ¼ÐÖд´½¨ test.protoÎļþ (protobufÐÒéÎļþ )
syntax = “proto2”;
package myproto;
enum FOO {X = 17;};
message Test {
required string label = 1;
optional int32 type = 2 [default=77];
repeated int64 reps = 3;
optional group OptionalGroup = 4 {
required string RequiredFiled = 5;
}
}
3. ±àÒë :Ö´ÐÐ
protoc --go_out=. *.proto
Éú³É test.pb.goÎļþ
4. ʹÓà protobuf×öÊý¾Ý¸ñʽת»»
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"myproto"
)
func main() {
test := &myproto.Test{
Label: proto.String("hello"),
Type: proto.Int32(17),
Reps: []int64{1, 2, 3},
Optionalgroup: &myproto.Test_OptionalGroup{
RequiredFiled: proto.String("good bye"),
},
}
//½«Struct test ת»»³É protobuf
data, err := proto.Marshal(test)
if err != nil {
fmt.Println("marshaling error: ", err)
}
//µÃµ½Ò»¸öеÄTest½á¹¹Ìå newTest
newTest := &myproto.Test{}
//½« data ת»»³É Test½á¹¹Ìå
err = proto.Unmarshal(data, newTest)
if err != nil {
fmt.Println("unmarshaling error: ", err)
}
//½«newTestµÄ×Ö·û´®ÐòÁл¯´ò³ö
fmt.Println(newTest.String())
//µÃµ½type×Ö¶Î
if test.GetType() != newTest.GetType() {
fmt.Println("type is not equal")
}
//...
}
gRPC(Google¶¨ÒåµÄPRCÐÒé±ê×¼)

gRPCÊÇʲô?
ÔÚ gRPCÀï¿Í»§¶ËÓ¦ÓÿÉÒÔÏñµ÷Óñ¾µØ¶ÔÏóÒ»ÑùÖ±½Óµ÷ÓÃÁíһ̨²»Í¬µÄ»úÆ÷ÉÏ·þÎñ¶ËÓ¦Óõķ½·¨£¬Ê¹µÃÄúÄܹ»¸üÈÝÒ׵ش´½¨·Ö²¼Ê½Ó¦ÓúͷþÎñ¡£ÓëÐí¶à RPCϵͳÀàËÆ£¬ gRPCÒ²ÊÇ»ùÓÚÒÔÏÂÀíÄ¶¨ÒåÒ»¸ö·þÎñ£¬Ö¸¶¨ÆäÄܹ»±»Ô¶³Ìµ÷Óõķ½·¨(°üº¬²ÎÊýºÍ·µ»ØÀàÐÍ)¡£ÔÚ·þÎñ¶ËʵÏÖÕâ¸ö½Ó¿Ú£¬²¢ÔËÐÐÒ»¸ö gRPC·þÎñÆ÷À´´¦Àí¿Í»§¶Ëµ÷Óá£ÔÚ¿Í»§¶ËÓµÓÐÒ»¸ö´æ¸ùÄܹ»Ïñ·þÎñ¶ËÒ»ÑùµÄ·½·¨¡£ gRPC¿Í»§¶ËºÍ·þÎñ¶Ë¿ÉÒÔÔÚ¶àÖÖ»·¾³ÖÐÔËÐкͽ»»¥ -´Ó googleÄÚ²¿µÄ·þÎñÆ÷µ½Äã×Ô¼ºµÄ±Ê¼Ç±¾£¬²¢ÇÒ¿ÉÒÔÓÃÈκΠgRPCÖ§³ÖµÄÓïÑÔ À´±àд¡£ËùÒÔ£¬Äã¿ÉÒÔºÜÈÝÒ×µØÓà Java´´½¨Ò»¸ö gRPC·þÎñ¶Ë£¬Óà Go¡¢ Python¡¢RubyÀ´´´½¨¿Í»§¶Ë¡£´ËÍ⣬ Google×îРAPI½«ÓÐ gRPC°æ±¾µÄ½Ó¿Ú£¬Ê¹ÄãºÜÈÝÒ׵ؽ« GoogleµÄ¹¦Äܼ¯³Éµ½ÄãµÄÓ¦ÓÃÀï¡£

ʹÓà protocol buffers
gRPCĬÈÏʹÓÃprotoBuf£¬ÕâÊÇ Google¿ªÔ´µÄÒ»Ì׳ÉÊìµÄ½á¹¹Êý¾ÝÐòÁл¯»úÖÆ(µ±È»Ò²¿ÉÒÔʹÓÃÆäËûÊý¾Ý¸ñʽÈç JSON)¡£ÕýÈçÄ㽫ÔÚÏ·½Àý×ÓÀïËù¿´µ½µÄ£¬ÄãÓà proto files´´½¨ gRPC·þÎñ£¬Óà protoBufÏûÏ¢ÀàÐÍÀ´¶¨Òå·½·¨²ÎÊýºÍ·µ»ØÀàÐÍ¡£Äã¿ÉÒÔÔÚ Protocol BuffersÎĵµÕÒµ½¸ü¶à¹ØÓÚ protoBufµÄ×ÊÁÏ¡£
ËäÈ»Äã¿ÉÒÔʹÓà proto2 (µ±Ç°Ä¬È쵀 protocol buffers°æ±¾ )£¬ÎÒÃÇͨ³£½¨ÒéÄãÔÚ gRPCÀïʹÓà proto3£¬ÒòΪÕâÑùÄã¿ÉÒÔʹÓà gRPCÖ§³ÖÈ«²¿·¶Î§µÄµÄÓïÑÔ£¬²¢ÇÒÄܱÜÃâ proto2¿Í»§¶ËÓë proto3·þÎñ¶Ë½»»¥Ê±³öÏֵļæÈÝÐÔÎÊÌ⣬·´Ö®ÒàÈ»¡£
ÄãºÃ gRPC
ÏÖÔÚÄãÒѾ¶Ô gRPCÓÐËùÁ˽⣬Á˽âÆä¹¤×÷»úÖÆ×î¼òµ¥µÄ·½·¨ÊÇ¿´Ò»¸ö¼òµ¥µÄÀý×Ó¡£ Hello World½«´øÁìÄã´´½¨Ò»¸ö¼òµ¥µÄ¿Í»§¶Ë —— ·þÎñ¶ËÓ¦Óã¬ÏòÄãչʾ£º
n ͨ¹ýÒ»¸öprotoBufģʽ£¬¶¨ÒåÒ»¸ö¼òµ¥µÄ´øÓÐ Hello World·½·¨µÄ RPC·þÎñ¡£
n ÓÃÄã×îϲ»¶µÄÓïÑÔ (Èç¹û¿ÉÓõϰ )À´´´½¨Ò»¸öʵÏÖÁËÕâ¸ö½Ó¿ÚµÄ·þÎñ¶Ë¡£
n ÓÃÄã×îϲ»¶µÄ (»òÕ߯äËûÄãÔ¸ÒâµÄ )ÓïÑÔÀ´·ÃÎÊÄãµÄ·þÎñ¶Ë¡£
goÓïÑÔʵÏÖ gRPCÔ¶³Ìµ÷ÓÃ
´´½¨Ò»¸ö protobuf package,È磺 my_rpc_proto; ÔÚ$GOPATH/src/Ï´´½¨ go_lession/gRPC_test/my_rpc_proto/Îļþ¼ÐÀïÃæ´´½¨ protobufÐÒéÎļþ helloServer.proto
syntax = "proto3";
package my_rpc_proto;
// The HelloServer service definition.
service HelloServer {
// µÚÒ»¸öÔ¶³Ìµ÷ÓýӿÚ
rpc SayHello (HelloRequest) returns (HelloReply) {}
// µÚ¶þ¸öÔ¶³Ìµ÷ÓýӿÚ
rpc GetHelloMsg (HelloRequest) returns (HelloMessage) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
message HelloMessage {
string msg = 1;
}
ÔÚµ±Ç°ÎļþÏ£¬±àÒë helloServer.protoÎļþ
protoc –go_out=plugins=grpc:./ *.proto
µÃµ½ helloServer.pb.goÎļþ
1. gRPC-Server±àд
package main
import (
"fmt"
"net"
pb "go_lession/gRPC_test/my_rpc_proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
port = ":18881"
)
type server struct{}
//ʵÏÖRPC SayHello ½Ó¿Ú
func (this *server) SayHello(ctx context.Context, in *pb.HelloRe
quest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "hello" + in.Name}, nil
}
//ʵÏÖRPC GetHelloMsg ½Ó¿Ú
func (this *server) GetHelloMsg(ctx context.Context, in *pb.Hell
oRequest) (*pb.HelloMessage, error) {
return &pb.HelloMessage{Msg: "this is from server HAHA!"}, nil
}
func main() {
listen, err := net.Listen("tcp", port)
if err != nil {
fmt.Println("failed to listen : ", err)
return
}
//µÃµ½Ò»¸ögRPC ·þÎñ¾ä±ú
srv := grpc.NewServer()
//½« server ½á¹¹Ìå×¢²áµ½ gRPC ·þÎñ
pb.RegisterHelloServerServer(srv, &server{})
//Æô¶¯¼àÌýgRPC·þÎñ
if err := srv.Serve(listen); err != nil {
fmt.Println("failed to serve, ", err)
return
}
}
2. gRPC-Client±àд
package main
import (
"fmt"
pb "go_lession/gRPC_test/my_rpc_proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
address = "localhost:18881"
clientName = "GreenHat"
)
func main() {
//Á˿ͻ§¶ËÁ¬½Ó·þÎñÆ÷
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
fmt.Println("did not connetc : ", err)
return
}
defer conn.Close()
//»ñȡһ¸ö gRPC ¾ä±ú
c := pb.NewHelloServerClient(conn)
//Ô¶³Ìµ÷Óà SayHello½Ó¿Ú
r1, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: clientName})
if err != nil {
fmt.Println("cloud not get Hello server ..", err)
return
}
fmt.Println("HelloServer resp: ", r1.Message)
//Ô¶³Ìµ÷Óà GetHelloMsg½Ó¿Ú
r2, err := c.GetHelloMsg(context.Background(), &pb.HelloRequest{Name: clientName})
if err != nil {
fmt.Println("cloud not get hello msg ..", err)
return
}
fmt.Println("HelloServer resp: ", r2.Msg)
}
ÔËÐÐ server£¬ÔÚÔËÐÐ client
µÃµ½ÒÔÏÂÊä³ö½á¹û:
HelloServer resp: helloGreenHat
HelloServer resp: this is from server HAHA!
Consul(»ùÓÚGoµÄ·þÎñ·¢ÏÖ¹¤¾ß)

Consul¼ò½é
ConsulÊÇʲô
ConsulÊÇHashiCorp¹«Ë¾ÍƳöµÄ¿ªÔ´¹¤¾ß£¬ÓÃÓÚʵÏÖ·Ö²¼Ê½ÏµÍ³µÄ·þÎñ·¢ÏÖÓëÅäÖᣠConsulÊÇ·Ö²¼Ê½µÄ¡¢¸ß¿ÉÓõġ¢¿ÉºáÏòÀ©Õ¹µÄ¡£Ëü¾ß±¸ÒÔÏÂÌØÐÔ :
l service discovery£ºconsulͨ¹ýDNS»òÕßHTTP½Ó¿Úʹ·þÎñ×¢²áºÍ·þÎñ·¢ÏÖ±äµÄºÜÈÝÒ×£¬Ò»Ð©Íⲿ·þÎñ£¬ÀýÈçsaasÌṩµÄÒ²¿ÉÒÔÒ»Ñù×¢²á¡£
l health checking£º½¡¿µ¼ì²âʹconsul¿ÉÒÔ¿ìËٵĸ澯ÔÚ¼¯ÈºÖеIJÙ×÷¡£ºÍ·þÎñ·¢Ïֵɣ¬¿ÉÒÔ·ÀÖ¹·þÎñת·¢µ½¹ÊÕϵķþÎñÉÏÃæ¡£
l key/value storage£ºÒ»¸öÓÃÀ´´æ´¢¶¯Ì¬ÅäÖõÄϵͳ¡£Ìṩ¼òµ¥µÄHTTP½Ó¿Ú£¬¿ÉÒÔÔÚÈκεط½²Ù×÷¡£
l multi-datacenter£ºÎÞÐ踴ÔÓµÄÅäÖ㬼´¿ÉÖ§³ÖÈÎÒâÊýÁ¿µÄÇøÓò¡£
ʲôÊÇ·þÎñ·¢ÏÖ
΢·þÎñµÄ¿ò¼ÜÌåϵÖУ¬·þÎñ·¢ÏÖÊDz»Äܲ»ÌáµÄÒ»¸öÄ£¿é¡£ÎÒÏàÐÅÁ˽â»òÕßÊìϤ΢·þÎñµÄͯЬӦ¸Ã¶¼ÖªµÀËüµÄÖØÒªÐÔ¡£ÕâÀïÎÒÖ»ÊǼòµ¥µÄÌáһϣ¬±Ï¾¹Õâ²»ÊÇÎÒÃǵÄÖØµã¡£ÎÒÃÇ¿´ÏÂÃæµÄÒ»·ùͼƬ£º

ͼÖУ¬¿Í»§¶ËµÄÒ»¸ö½Ó¿Ú£¬ÐèÒªµ÷Ó÷þÎñA-N¡£¿Í»§¶Ë±ØÐëÒªÖªµÀËùÓзþÎñµÄÍøÂçλÖõģ¬ÒÔÍùµÄ×ö·¨ÊÇÅäÖÃÊÇÅäÖÃÎļþÖУ¬»òÕßÓÐЩÅäÖÃÔÚÊý¾Ý¿âÖС£ÕâÀï¾Í´ø³ö¼¸¸öÎÊÌ⣺
· ÐèÒªÅäÖÃN¸ö·þÎñµÄÍøÂçλÖ㬼ӴóÅäÖõĸ´ÔÓÐÔ
· ·þÎñµÄÍøÂçλÖñ仯£¬¶¼ÐèÒª¸Ä±äÿ¸öµ÷ÓÃÕßµÄÅäÖÃ
· ¼¯ÈºµÄÇé¿öÏ£¬ÄÑÒÔ×ö¸ºÔØ(·´Ïò´úÀíµÄ·½Ê½³ýÍâ)

Óë֮ǰһÕŲ»Í¬µÄÊÇ£¬¼ÓÁ˸ö·þÎñ·¢ÏÖÄ£¿é¡£Í¼±È½Ï¼òµ¥£¬Õâ±ßÎÄ×ÖÃèÊöÏ¡£·þÎñA-N°Ñµ±Ç°×Ô¼ºµÄÍøÂçλÖÃ×¢²áµ½·þÎñ·¢ÏÖÄ£¿é(ÕâÀï×¢²áµÄÒâ˼¾ÍÊǸæËß)£¬·þÎñ·¢ÏÖ¾ÍÒÔK-VµÄ·½Ê½¼Ç¼Ï£¬KÒ»°ãÊÇ·þÎñÃû£¬V¾ÍÊÇIP:PORT¡£·þÎñ·¢ÏÖÄ£¿é¶¨Ê±µÄÂÖѯ²é¿´ÕâЩ·þÎñÄܲ»ÄÜ·ÃÎʵÄÁË(Õâ¾ÍÊǽ¡¿µ¼ì²é)¡£¿Í»§¶ËÔÚµ÷Ó÷þÎñA-NµÄʱºò£¬¾ÍÅÜÈ¥·þÎñ·¢ÏÖÄ£¿éÎÊÏÂËüÃǵÄÍøÂçλÖã¬È»ºóÔÙµ÷ÓÃËüÃǵķþÎñ¡£ÕâÑùµÄ·½Ê½ÊDz»ÊǾͿÉÒÔ½â¾öÉÏÃæµÄÎÊÌâÁËÄØ?¿Í»§¶ËÍêÈ«²»ÐèÒª¼Ç¼ÕâЩ·þÎñÍøÂçλÖ㬿ͻ§¶ËºÍ·þÎñ¶ËÍêÈ«½âñî!

ÏÂÃæµÄÀý×ÓÓпÉÄܸüÓÐÖúÓÚÎÒÃÇÀí½â·þÎñ·¢ÏÖµÄÐÎʽ£º
ÀýÈçÓʵÝԱȥij¹«Ë¾Ò»¶°´ó¥ͶµÝ¿ì¼þ£¬ÏòÃÅÎÀѯÎÊÔ±¹¤¼×ÔÚÄÄÒ»¸ö·¿¼ä£¬ÃÅÎÀÄÃÆð×ÀÉϵÄͨѶ¼²éѯ£¬¸æÖªÓʵÝÔ±Ô±¹¤¼×ÔÚ¾ßÌåʲôλÖ᣼ÙÈ繫˾À´ÁËÒ»¸öÔ±¹¤ÒÒ£¬ËûÏëÈÃÓʵÝÔ±Ë͹ýÀ´£¬¾ÍÒªÏÈÈÃÃÅÎÀÖªµÀ×Ô¼ºÔÚÄÄÒ»¸ö·¿¼ä£¬ÐèҪȥÃÅÎÀÄDZߵǼǣ¬Ô±¹¤ÒҵǼǺ󣬵±ÓʵÝÔ±ÏòÃÅÎÀѯÎÊʱ£¬ÃÅÎÀ¾Í¿ÉÒÔ¸æËßÓʵÝÔ±Ô±¹¤ÒҵľßÌåλÖá£ÃÅÎÀÖªµÀÔ±¹¤ÒҵľßÌåλÖõĹý³Ì¾ÍÊÇ·þÎñ·¢ÏÖ£¬Ô±¹¤ÒÒµÄλÖÃÐÅÏ¢¿ÉÒÔ±»¿´×÷·þÎñÐÅÏ¢£¬ÃÅÎÀµÄͨѶ¼¾ÍÊÇÉÏÎÄÖÐÌáµ½µÄÊý¾Ý½»»»¸ñʽ£¬´ËÀýÖÐÔ±¹¤ÒÒ¾ÍÊÇÉÏÎĵÄÒÑ·½£¬ÃÅÎÀ¾ÍÊÇ·þÎñ·¢ÏÖµÄÌṩÕß¡£
ÒÔµ÷ÊÔģʽÆô¶¯consul:
$ conusl agent –dev –bind=0.0.0.0
go_micro(»ùÓÚGoµÄ΢·þÎñ¿ò¼Ü)

ÒÀÀµ
ÎÒÃÇÐèÒªÒ»¸ö·¢ÏÖ·þÎñÆ÷£¬ÕâÀï microĬÈÏʹÓÃµÄ Consul£¬ÎÒÃÇÕâÀïÓÃ֮ǰ°²×°²¿ÊðºÃµÄ consul£¬ÓÃÀ´×ö goµÄmicro·þÎñ·¢ÏÖ
protoBuf×÷ΪServer¶ËºÍClient¶ËµÄÊý¾Ý½»»»¸ñʽ¡£
ÏÂÔØ micro
go get github.com/micro/micro
hello micro
¸Ï½ôÍê³ÉÒ»¸ögo_microµÄ΢·þÎñ°É ~
microΪÎÒÃÇÌṩµÄ΢·þÎñ¿ò¼ÜÈçÏÂ
ÕâÀïÃæÓкܶà½ÇÉ«£¬ Micro API, Customer API, Customer ServiceµÈµÈ ...
ÆäÖÐ Micro APIÊÇmicro¸øÎÒÃÇÌṩµÄÒ»¸ö¹¤¾ß£¬ÊÇͨ¹ý RPCµ÷ÓÃÎÒÃÇÄ£¿éµÄ APIºÍ×öһЩ¸ºÔؾùºâµÄ×÷Óã¬Êµ¼ÊÉÏ Customer API, Customer ServiceÊÇÒ»×é΢·þÎñ£¬ Customer APIÊÕµ½ Micro APIת·¢µÄÇëÇóºó£¬½« RESTfulת»»³É protobufͨ¹ý gRPCµ÷Ó÷¢Ë͸ø Customer Service×ö·þÎñ´¦Àí£¬È»ºóÓÖ½«·µ»Ø protobufÊý¾Ýת»»³É RESTful·µ»Ø¸øÓû§¡£
ÔÚ΢·þÎñ¼Ü¹¹ÖÐÒ»°ã³Æ APIΪRPC GateWay
GRPC Gateway
´ËÖ¸ÄϰïÖúÎÒÃÇʹÓà go-micro΢·þÎñÖÐµÄ grpc gateway¡£
grpc-gatewayÊÇÒ»¸ö protocµÄÒ»¸ö²å¼þ¡£Ëü»ùÓÚ gRPC·þÎñ¶¨Ò壬²¢ÇÒÌṩһ
¸ö½« RESTful JSON APIת»»³É gRPCÐÒéµÄ·´Ïì´úÀí·þÎñ¡£
ÎÒÃÇʹÓà go-grpcÈ¥Íê³Éºǫ́·þÎñ£¬ go-grpcÊÇÒ»¸öΪ client/server½«go-micro
ºÍgRPC½áºÏµÄÒ»¸ö°ü¹ü¡£
´úÂë°¸Àý
examples/grpc.
Create service proto-´´½¨·þÎñ¶Ëprotobuf
ÕâÀÎÒÃǵÄprotoÎļþ¶¨ÒåÈçÏ£º
syntax = "proto3";
service Greeter {
rpc Hello(HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string greeting = 2;
}
Write the service
1¡¢ ʵÏÖ×Ô¶¨Òå½Ó¿Ú
2¡¢ ³õʼ»¯Ò»¸ö΢·þÎñ
3¡¢ ×¢²áGreeter ¾ä±ú
4¡¢ Æô¶¯·þÎñ
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "github.com/micro/examples/service/proto"
)
type Greeter struct{}
func (g *Greeter) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
rsp.Greeting = "Hello " + req.Name
return nil
}
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(
micro.Name("greeter"),
)
// Init will parse the command line flags.
service.Init()
// Register handler
proto.RegisterGreeterHandler(service.Server(), new(Greeter))
// Run the server
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
Run service
go run examples/service/main.go
Output
2016/03/14 10:59:14 Listening on [::]:50137
2016/03/14 10:59:14 Broker Listening on [::]:50138
2016/03/14 10:59:14 Registering node: greeter-ca62b017-e9d3-11e5-9bbb-68a86d0d36b6
Define a client-±àд¿Í»§¶Ë
ÏÂÃæÊǿͻ§¶Ë·ÃÎÊ΢·þÎñµÄ´úÂ룺
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "github.com/micro/examples/service/proto"
)
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(micro.Name("greeter.client"))
service.Init()
// Create new greeter client
greeter := proto.NewGreeterClient("greeter", service.Client())
// Call the greeter
rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
if err != nil {
fmt.Println(err)
}
// Print response
fmt.Println(rsp.Greeting)
}
Run the client
go run client.go
Output
Hello John
QA
1 GoÓïÑÔ³ýÁËÄÜ¿ª·¢Çø¿éÁ´»¹ÄÜ¿ª·¢ÄÄЩÁìÓò?
GoÓïÑÔ×÷Ϊһ¸ö¿ª·¢Ð§Âʸߣ¬ÌìÉúÖ§³Ö¸ß²¢·¢£¬Í¬Ê±Ó־߱¸æÇÃÀCÓïÑÔÐÔÄܵÄÓïÑÔ£¬ÔÚδÀ´Ò»¶¨ÊǺó¶Ë¿ª·¢ÓïÑÔµÄ×î¾ßÓÐDZÁ¦µÄ±à³ÌÓïÑÔ¡£Ä¿Ç°ºÜ¶àÆóÒµµÄ·þÎñÆ÷¼Ü¹¹Ò²Öð²½ÔÚÓÃGoÓïÑÔÖØ¹¹¡£
GoÓïÑÔĿǰÖ÷񻃾¼°µÄÁìÓòÓУº¸ß²¢·¢·þÎñÆ÷¿ª·¢¡¢·Ö²¼Ê½¿ª·¢¡¢Î¢·þÎñ¿ª·¢¡¢Web¿ò¼Ü¼°Ó¦Óÿª·¢¡¢ºÍÇø¿éÁ´¿ª·¢¡£
¸ß²¢·¢·þÎñÆ÷¿ª·¢£º
²»ÓýâÊÍÁË£¬GoÌìÉúÓï·¨µÄ²¢·¢Ö§³ÖºÍGoroutineг̵ÄÇáÁ¿¼¶Óëµ÷¶ÈÆ÷µÄÓÅ»¯£¬Ä¿Ç°ºÜ¶àÓÎÏ·¹«Ë¾Ö÷Òª·þÎñ¿ª·¢ÓïÑÔ×îÓÅÑ¡ÔñÒ»¶¨ÊÇGolang.
·Ö²¼Ê½¿ª·¢£º
ÎÒÃÇÖªµÀµÄÁ½¸ö·Ö²¼Ê½ÐéÄ⻯Ã÷ÐÇ£ºDocker¡¢KubernetesËûÃǵĿª·¢ÊµÏÖÓïÑÔ¶¼ÊÇGoÓïÑÔ¡£ÓÐÈË˵ÊÇDockerÅõºìÁË·Ö²¼Ê½£¬Êµ¼ÊÉϺܶàÈ˲¢²»ÖªµÀ£¬ÊÇGoÅõºìÁËDockerÉú̬¡£
΢·þÎñ¿ª·¢£º
GoµÄ΢·þÎñ¿ò¼Ü¾Ó¶à£¬¼ÓÉÏDocker¶ÔgoµÄÖ§³Ö×îºÃ£¬ËùÒÔgoÒ²ÊÇ΢·þÎñ¿ª·¢µÄÊ×Ñ¡ÓïÑÔ¡£
goµÄ΢·þÎñ¿ò¼ÜÓÐgo-micro£¬go-kit¡£·þÎñ·¢ÏÖÓÐgoʵÏÖµÄConsul¡£Î¢·þÎñͨÐŵÄRPC»úÖÆÓÐgoogleʵÏÖµÄgRPC£¬ÆäÖÐͨÐÅÐÒéprotobufÒ²ÊǶÔgoÎÞ·ìÏνӵġ£
Web¿ò¼Ü¼°Ó¦Óÿª·¢£º
¶ÔÓÚweb£¬´ó¼Ò¿ÉÄÜ»áÏëµ½javaµÄSpring¡¢pythonµÄDjango¡£µ«ÊÇ¿ÉÄܲ¢²»ÖªµÀGoµÄBeegoºÍGin¡¢EchoµÈweb¿ò¼ÜÕýÔÚÖð²½ÇÖÊ´´óÐÍ»¥ÁªÍø¹«Ë¾¡£ºÜ¶à¹«Ë¾ÒѾͨ¹ýBeegoÀ´´î½¨webºǫ́·þÎñ£¬ÒòΪGoµÄÌìÉúÍøÂç´¦ÀíµÄÁ÷³©£¬Èÿª·¢ÕßÔÚ¹¹½¨´óÐÍwebµÄʱºò£¬¸ü¼Óϲ»¶ÁËGoÓïÑÔ¡£
Çø¿éÁ´¿ª·¢£º
ÎÒÃÇËùÓö¼ûµÄÇø¿éÁ´Ó¦ÓÃÏîÄ¿»òÕßÏà¹Ø¿ò¼Ü¼¸ºõ¶¼ÊÇGoÓïÑÔʵÏÖ£¬»òÕß¶ÔGoµÄÖ§³Ö×îºÃ¡£Ö÷Á÷µÄHyperledger Fabric ºÍÒÔÌ«·»Ò²ÊÇĿǰÆóÒµÕýÔÚ´ó¹æÄ£Ê¹ÓõĿª·¢¿ò¼Ü¡£goµÄÕâÖÖ¿ª·¢Ð§Âʸߺ͸ßÐÔÄÜ£¬¶ÔÓÚÇø¿éÁ´ÕâÖÖ×¢ÖØÍøÂçͨÐźÍÐÅÏ¢°²È«µÄ¼¼Êõ£¬¸üÊDz»¿É»òȱµÄ¡£
2 GoÓïÑÔÄÑÒ׳̶ÈÈçºÎ?
GoÓïÑÔѧϰÆðÀ´ÍêÈ«¿ÉÒÔÁã»ù´¡ÈëÃÅ¡£GoogleÔÚ´´½¨GoÓïÑÔµÄ×î³õ¶¨ÒåΪ£º¼òµ¥¿ìÀֵĿª·¢¸ßÐÔÄÜϵͳÓïÑÔ¡£¿É¼ûgoÓïÑÔ²¢²»ÊǺÜÄÑ¡£
±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍC/C++ÓëÍøÂç¹¥·ÀѧԺËùÓУ¬»¶Ó×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»£¡
×÷ÕߣºÀÖÓã²¥¿ÍC/C++ÓëÍøÂç¹¥·ÀÅàѵѧԺ
Ê×·¢£ºhttp://c.itcast.cn/?
±±¾©Ð£Çø