ÀÖÓãµç¾º

  • ½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

    È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

    GoÓïÑÔ¹¹½¨Î¢·þÎñһվʽ½â¾ö·½°¸

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

    1528343999478_1.png

    ¿ª·¢µ¥ÌåʽӦÓÃ

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

    1528350583640_2.png

    ¾¡¹ÜÒ²ÊÇÄ£¿é»¯Âß¼­£¬µ«ÊÇ×îÖÕËü»¹ÊÇ»á´ò°ü²¢²¿ÊðΪµ¥ÌåʽӦÓ᣾ßÌåµÄ¸ñʽÒÀÀµÓÚÓ¦ÓÃÓïÑԺͿò¼Ü¡£×îÖÕ³ÌÐò·¢²¼µÄʱºòÒ²»á±»´ò°ü³Éµ¥Ò»µÄ³ÌÐò·¢²¼³öÀ´¡£

    µ¥ÌåʽӦÓõIJ»×ã

    ²»ÐÒµÄÊÇ£¬ÕâÖÖ¼òµ¥·½·¨È´ÓкܴóµÄ¾ÖÏÞÐÔ¡£Ò»¸ö¼òµ¥µÄÓ¦ÓûáËæ×Åʱ¼äÍÆÒÆÖð½¥±ä´ó¡£ÔÚÿ´ÎµÄsprintÖУ¬¿ª·¢ÍŶӶ¼»áÃæ¶ÔГ¹ÊÊ”£¬È»ºó¿ª·¢Ðí¶àдúÂë¡£¼¸Äêºó£¬Õâ¸öС¶ø¼òµ¥µÄÓ¦Óûá±ä³ÉÁËÒ»¸ö¾Þ´óµÄ¹ÖÎï¡£Õâ¶ùÓÐÒ»¸öÀý×Ó£¬ÎÒ×î½üºÍÒ»¸ö¿ª·¢ÕßÌÖÂÛ£¬ËûÕýÔÚдһ¸ö¹¤¾ß£¬ÓÃÀ´·ÖÎöËûÃÇÒ»¸öÓµÓÐÊý°ÙÍòÐдúÂëµÄÓ¦ÓÃÖÐJARÎļþÖ®¼äµÄÒÀÀµ¹ØÏµ¡£ÎÒºÜÈ·ÐÅÕâ¸ö´úÂëÕýÊǺܶ࿪·¢Õß¾­¹ý¶àÄêŬÁ¦¿ª·¢³öÀ´µÄÒ»¸ö¹ÖÎï¡£

    Ò»µ©ÄãµÄÓ¦Óñä³ÉÒ»¸öÓÖ´óÓÖ¸´ÔӵĹÖÎÄÇ¿ª·¢ÍŶӿ϶¨ºÜÍ´¿à¡£Ãô½Ý¿ª·¢ºÍ²¿Êð¾Ù²½Î¬¼è£¬ÆäÖÐ×îÖ÷ÒªÎÊÌâ¾ÍÊÇÕâ¸öÓ¦ÓÃÌ«¸´ÔÓ£¬ÒÔÖÁÓÚÈκε¥¸ö¿ª·¢Õß¶¼²»¿ÉÄܸ㶮Ëü¡£Òò´Ë£¬ÐÞÕýbugºÍÕýÈ·µÄÌí¼Óй¦ÄܱäµÄ·Ç³£À§ÄÑ£¬²¢ÇҺܺÄʱ¡£ÁíÍ⣬ÍŶÓÊ¿ÆøÒ²»á×ßÏÂÆÂ·¡£Èç¹û´úÂëÄÑÓÚÀí½â£¬¾Í²»¿ÉÄܱ»ÕýÈ·µÄÐ޸ġ£×îÖÕ»á×ßÏò¾Þ´óµÄ¡¢²»¿ÉÀí½âµÄÄà̶¡£

    ÁíÍ⣬¸´ÔÓ¶ø¾Þ´óµÄµ¥ÌåʽӦÓÃÒ²²»ÀûÓÚ³ÖÐøÐÔ¿ª·¢¡£½ñÌ죬SaaSÓ¦Óó£Ì¬¾ÍÊÇÿÌì»á¸Ä±äºÜ¶à´Î£¬¶øÕâ¶ÔÓÚµ¥ÌåʽӦÓÃģʽ·Ç³£À§ÄÑ¡£ÁíÍ⣬ÕâÖֱ仯´øÀ´µÄÓ°Ï첢ûÓкܺõı»Àí½â£¬ËùÒÔ²»µÃ²»×öºÜ¶àÊÖ¹¤²âÊÔ¡£ÄÇô½ÓÏÂÀ´£¬³ÖÐø²¿ÊðÒ²»áºÜ¼èÄÑ¡£

    µ¥ÌåʽӦÓÃÁíÍâÒ»¸öÎÊÌâÊǿɿ¿ÐÔ¡£ÒòΪËùÓÐÄ£¿é¶¼ÔËÐÐÔÚÒ»¸ö½ø³ÌÖУ¬ÈκÎÒ»¸öÄ£¿éÖеÄÒ»¸öbug£¬±ÈÈçÄÚ´æÐ¹Â¶£¬½«»áÓпÉÄÜŪ¿åÕû¸ö½ø³Ì¡£³ý´ËÖ®Í⣬ÒòΪËùÓÐÓ¦ÓÃʵÀý¶¼ÊÇΨһµÄ£¬Õâ¸öbug½«»áÓ°Ïìµ½Õû¸öÓ¦ÓõĿɿ¿ÐÔ¡£

    ×îºó£¬µ¥ÌåʽӦÓÃʹµÃ²ÉÓÃмܹ¹ºÍÓïÑԷdz£À§ÄÑ¡£±ÈÈ磬ÉèÏëÄãÓÐÁ½°ÙÍòÐвÉÓÃXYZ¿ò¼ÜдµÄ´úÂë¡£Èç¹ûÏë¸Ä³ÉABC¿ò¼Ü£¬ÎÞÂÛÊÇʱ¼ä»¹Êdzɱ¾¶¼ÊǷdz£°º¹óµÄ£¬¼´Ê¹ABC¿ò¼Ü¸üºÃ¡£Òò´Ë£¬ÕâÊÇÒ»¸öÎÞ·¨ÓâÔ½µÄºè¹µ¡£Äã²»µÃ²»ÔÚ×î³õÑ¡ÔñÃæÇ°µÍÍ·¡£

    ÄÇôÈçºÎÓ¦¶ÔÄØ?

    ΢´¦Àí¼Ü¹¹——´¦Àí¸´ÔÓÊÂÎï

    Ðí¶à¹«Ë¾£¬±ÈÈçAmazon¡¢eBayºÍNetFlix£¬Í¨¹ý²ÉÓÃ΢´¦Àí½á¹¹Ä£Ê½½â¾öÁËÉÏÊöÎÊÌâ¡£Æä˼·²»ÊÇ¿ª·¢Ò»¸ö¾Þ´óµÄµ¥ÌåʽµÄÓ¦Ó㬶øÊǽ«Ó¦Ó÷ֽâΪСµÄ¡¢»¥ÏàÁ¬½ÓµÄ΢·þÎñ¡£

    Ò»¸ö΢·þÎñÒ»°ãÍê³Éij¸öÌØ¶¨µÄ¹¦ÄÜ£¬±ÈÈçϵ¥¹ÜÀí¡¢¿Í»§¹ÜÀíµÈµÈ¡£Ã¿Ò»¸ö΢·þÎñ¶¼ÊÇ΢ÐÍÁù½ÇÐÎÓ¦Ó㬶¼ÓÐ×Ô¼ºµÄÒµÎñÂß¼­ºÍÊÊÅäÆ÷¡£Ò»Ð©Î¢·þÎñ»¹»á·¢²¼API¸øÆäËü΢·þÎñºÍÓ¦Óÿͻ§¶ËʹÓá£ÆäËü΢·þÎñÍê³ÉÒ»¸öWeb UI£¬ÔËÐÐʱ£¬Ã¿Ò»¸öʵÀý¿ÉÄÜÊÇÒ»¸öÔÆVM»òÕßÊÇDockerÈÝÆ÷¡£

    ±ÈÈ磬һ¸öÇ°ÃæÃèÊöϵͳ¿ÉÄܵķֽâÈçÏ£º


    1528350625344_3.png

    ÿһ¸öÓ¦Óù¦ÄÜÇø¶¼Ê¹ÓÃ΢·þÎñÍê³É£¬ÁíÍ⣬WebÓ¦Óûᱻ²ð·Ö³ÉһϵÁмòµ¥µÄWebÓ¦ÓÃ(±ÈÈçÒ»¸ö¶Ô³Ë¿Í£¬Ò»¸ö¶Ô³ö×â³µ¼ÝʻԱ)¡£ÕâÑùµÄ²ð·Ö¶ÔÓÚ²»Í¬Óû§¡¢É豸ºÍÌØÊâÓ¦Óó¡¾°²¿Ê𶼸üÈÝÒס£

    ÿһ¸öºǫ́·þÎñ¿ª·ÅÒ»¸öREST API£¬Ðí¶à·þÎñ±¾ÉíÒ²²ÉÓÃÁËÆäËü·þÎñÌṩµÄAPI¡£±ÈÈ磬¼ÝʻԱ¹ÜÀíʹÓÃÁ˸æÖª¼ÝʻԱһ¸öDZÔÚÐèÇóµÄ֪ͨ·þÎñ¡£UI·þÎñ¼¤»îÆäËü·þÎñÀ´¸üÐÂWebÒ³Ãæ¡£ËùÓзþÎñ¶¼ÊDzÉÓÃÒì²½µÄ£¬»ùÓÚÏûÏ¢µÄͨѶ¡£

    ΢·þÎñ¼Ü¹¹µÄºÃ´¦

    ΢·þÎñ¼Ü¹¹Ä£Ê½ÓкܶàºÃ´¦¡£Ê×ÏÈ£¬Í¨¹ý·Ö½â¾Þ´óµ¥ÌåʽӦÓÃΪ¶à¸ö·þÎñ·½·¨½â¾öÁ˸´ÔÓÐÔÎÊÌâ¡£ÔÚ¹¦Äܲ»±äµÄÇé¿öÏ£¬Ó¦Óñ»·Ö½âΪ¶à¸ö¿É¹ÜÀíµÄ·ÖÖ§»ò·þÎñ¡£Ã¿¸ö·þÎñ¶¼ÓÐÒ»¸öÓÃRPC-»òÕßÏûÏ¢Çý¶¯API¶¨ÒåÇå³þµÄ±ß½ç¡£Î¢·þÎñ¼Ü¹¹Ä£Ê½¸ø²ÉÓõ¥Ìåʽ±àÂ뷽ʽºÜÄÑʵÏֵŦÄÜÌṩÁËÄ£¿é»¯µÄ½â¾ö·½°¸£¬ÓÉ´Ë£¬µ¥¸ö·þÎñºÜÈÝÒ׿ª·¢¡¢Àí½âºÍά»¤¡£

    µÚ¶þ£¬ÕâÖּܹ¹Ê¹µÃÿ¸ö·þÎñ¶¼¿ÉÒÔÓÐרÃÅ¿ª·¢ÍŶÓÀ´¿ª·¢¡£¿ª·¢Õß¿ÉÒÔ×ÔÓÉÑ¡Ôñ¿ª·¢¼¼Êõ£¬ÌṩAPI·þÎñ¡£µ±È»£¬Ðí¶à¹«Ë¾ÊÔͼ±ÜÃâ»ìÂÒ£¬Ö»ÌṩijЩ¼¼ÊõÑ¡Ôñ¡£È»ºó£¬ÕâÖÖ×ÔÓÉÒâζ×Å¿ª·¢Õß²»ÐèÒª±»ÆÈʹÓÃijÏîÄ¿¿ªÊ¼Ê±²ÉÓõĹýʱ¼¼Êõ£¬ËûÃÇ¿ÉÒÔÑ¡ÔñÏÖÔڵļ¼Êõ¡£ÉõÖÁÓÚ£¬ÒòΪ·þÎñ¶¼ÊÇÏà¶Ô¼òµ¥£¬¼´Ê¹ÓÃÏÖÔÚ¼¼ÊõÖØÐ´ÒÔǰ´úÂëÒ²²»ÊǺÜÀ§ÄѵÄÊÂÇé¡£

    µÚÈý£¬Î¢·þÎñ¼Ü¹¹Ä£Ê½ÊÇÿ¸ö΢·þÎñ¶ÀÁ¢µÄ²¿Ê𡣿ª·¢Õß²»ÔÙÐèҪЭµ÷ÆäËü·þÎñ²¿Êð¶Ô±¾·þÎñµÄÓ°Ïì¡£ÕâÖָıä¿ÉÒԼӿ첿ÊðËÙ¶È¡£UIÍŶӿÉÒÔ²ÉÓÃAB²âÊÔ£¬¿ìËٵIJ¿Êð±ä»¯¡£Î¢·þÎñ¼Ü¹¹Ä£Ê½Ê¹µÃ³ÖÐø»¯²¿Êð³ÉΪ¿ÉÄÜ¡£

    ×îºó£¬Î¢·þÎñ¼Ü¹¹Ä£Ê½Ê¹µÃÿ¸ö·þÎñ¶ÀÁ¢À©Õ¹¡£Äã¿ÉÒÔ¸ù¾Ýÿ¸ö·þÎñµÄ¹æÄ£À´²¿ÊðÂú×ãÐèÇóµÄ¹æÄ£¡£ÉõÖÁÓÚ£¬Äã¿ÉÒÔʹÓøüÊʺÏÓÚ·þÎñ×ÊÔ´ÐèÇóµÄÓ²¼þ¡£

    ΢·þÎñ¼Ü¹¹µÄÌØÐÔ

    1. µ¥Ò»Ö°Ôð

    ΢·þÎñ¼Ü¹¹ÖеÄÿ¸ö·þÎñ£¬¶¼ÊǾßÓÐÒµÎñÂß¼­µÄ£¬·ûºÏ¸ßÄÚ¾Û¡¢µÍñîºÏÔ­ÔòÒÔ¼°µ¥Ò»Ö°ÔðÔ­ÔòµÄµ¥Ôª£¬²»Í¬µÄ·þÎñͨ¹ý“¹ÜµÀ”µÄ·½Ê½Áé»î×éºÏ£¬´Ó¶ø¹¹½¨³öÅÓ´óµÄϵͳ¡£

    2. ÇáÁ¿¼¶Í¨ÐÅ

    ·þÎñÖ®¼äͨ¹ýÇáÁ¿¼¶µÄͨÐÅ»úÖÆÊµÏÖ»¥Í¨»¥Áª£¬¶øËùνµÄÇáÁ¿¼¶£¬Í¨³£Ö¸ÓïÑÔÎ޹ء¢Æ½Ì¨Î޹صĽ»»¥·½Ê½¡£


    1528350653657_4.png

    ¶ÔÓÚÇáÁ¿¼¶Í¨Ðŵĸñʽ¶øÑÔ£¬ÎÒÃÇÊìϤµÄ XML ºÍ JSON£¬ËüÃÇÊÇÓïÑÔÎ޹ء¢Æ½Ì¨Î޹صÄ;¶ÔÓÚͨÐŵÄЭÒé¶øÑÔ£¬Í¨³£»ùÓÚ HTTP£¬ÄÜÈ÷þÎñ¼äµÄͨÐűäµÃ±ê×¼»¯¡¢ÎÞ״̬»¯¡£Ä¿Ç°´ó¼ÒÊìϤµÄ REST(Representational State Transfer)ÊÇʵÏÖ·þÎñ¼ä»¥ÏàЭ×÷µÄÇáÁ¿¼¶Í¨ÐÅ»úÖÆÖ®Ò»¡£Ê¹ÓÃÇáÁ¿¼¶Í¨ÐÅ»úÖÆ£¬¿ÉÒÔÈÃÍŶÓÑ¡Ôñ¸üÊʺϵÄÓïÑÔ¡¢¹¤¾ß»òÕ߯½Ì¨À´¿ª·¢·þÎñ±¾Éí¡£

    3. ¶ÀÁ¢ÐÔ

    ÿ¸ö·þÎñÔÚÓ¦Óý»¸¶¹ý³ÌÖУ¬¶ÀÁ¢µØ¿ª·¢¡¢²âÊԺͲ¿Êð¡£

    ÔÚµ¥¿é¼Ü¹¹ÖÐËùÓй¦Äܶ¼ÔÚͬһ¸ö´úÂë¿â£¬¹¦ÄܵĿª·¢²»¾ßÓжÀÁ¢ÐÔ;µ±²»Í¬Ð¡×éÍê³É¶à¸ö¹¦Äܺó£¬ÐèÒª¾­¹ý¼¯³ÉºÍ»Ø¹é²âÊÔ£¬²âÊÔ¹ý³ÌÒ²²»¾ßÓжÀÁ¢ÐÔ;µ±²âÊÔÍê³Éºó£¬Ó¦Óñ»¹¹½¨³ÉÒ»¸ö°ü£¬Èç¹ûij¸ö¹¦ÄÜ´æÔÚ bug£¬½«µ¼ÖÂÕû¸ö²¿Êðʧ°Ü»òÕ߻عö¡£

    1528350688080_5.png

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


    1528350713034_6.png

    4. ½ø³Ì¸ôÀë

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


    1528350731300_7.png

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


    1528350752831_8.png

    ¼ÈȻҪ½éÉÜ΢·þÎñ£¬¾Í²»µÃ²»½éÉÜÒ»ÏÂÓë΢·þÎñÏà¹ØµÄ¼¼Êõ¡£ÄÇô£¬½ÓÏÂÀ´£¬ÎÒÃÇÒ»Ò»×öÒ»ÏÂÏêϸ½²½â¡£

    protoBuf(GoogleÆìÏÂÆ½Ì¨ÓïÑÔÎÞ¹ØÐòÁл¯Êý¾ÝЭÒé)

    1528350795113_9.png

    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¡£Ö§³ÖµÄ»ù±¾ÀàÐÍÈçÏ£º


    1528350869880_10.png

    Ò»°ãÔÚÎÒÃǵÄÏîÄ¿Öп϶¨»áÓкܶàÏûÏ¢ÀàÐÍ¡£ÎÒÃÇ×ܲ»Äܶ¼¶¨ÒåÔÚÒ»¸öÎļþÖС£µ±Ò»¸ö 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ЭÒé±ê×¼)


    1528350892459_11.png

    gRPCÊÇʲô?

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


    1528350912991_12.png

    ʹÓà 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µÄ·þÎñ·¢ÏÖ¹¤¾ß)


    1528350939444_13.png

    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»Äܲ»ÌáµÄÒ»¸öÄ£¿é¡£ÎÒÏàÐÅÁ˽â»òÕßÊìϤ΢·þÎñµÄͯЬӦ¸Ã¶¼ÖªµÀËüµÄÖØÒªÐÔ¡£ÕâÀïÎÒÖ»ÊǼòµ¥µÄÌáһϣ¬±Ï¾¹Õâ²»ÊÇÎÒÃǵÄÖØµã¡£ÎÒÃÇ¿´ÏÂÃæµÄÒ»·ùͼƬ£º


    1528350974460_14.png

    ͼÖУ¬¿Í»§¶ËµÄÒ»¸ö½Ó¿Ú£¬ÐèÒªµ÷Ó÷þÎñA-N¡£¿Í»§¶Ë±ØÐëÒªÖªµÀËùÓзþÎñµÄÍøÂçλÖõÄ£¬ÒÔÍùµÄ×ö·¨ÊÇÅäÖÃÊÇÅäÖÃÎļþÖУ¬»òÕßÓÐЩÅäÖÃÔÚÊý¾Ý¿âÖС£ÕâÀï¾Í´ø³ö¼¸¸öÎÊÌ⣺

    · ÐèÒªÅäÖÃN¸ö·þÎñµÄÍøÂçλÖ㬼ӴóÅäÖõĸ´ÔÓÐÔ

    · ·þÎñµÄÍøÂçλÖñ仯£¬¶¼ÐèÒª¸Ä±äÿ¸öµ÷ÓÃÕßµÄÅäÖÃ

    · ¼¯ÈºµÄÇé¿öÏ£¬ÄÑÒÔ×ö¸ºÔØ(·´Ïò´úÀíµÄ·½Ê½³ýÍâ)


    1528351015383_15.png

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


    1528351034055_16.png

    ÏÂÃæµÄÀý×ÓÓпÉÄܸüÓÐÖúÓÚÎÒÃÇÀí½â·þÎñ·¢ÏÖµÄÐÎʽ£º

    ÀýÈçÓʵÝԱȥij¹«Ë¾Ò»¶°´ó¥ͶµÝ¿ì¼þ£¬ÏòÃÅÎÀѯÎÊÔ±¹¤¼×ÔÚÄÄÒ»¸ö·¿¼ä£¬ÃÅÎÀÄÃÆð×ÀÉϵÄͨѶ¼²éѯ£¬¸æÖªÓʵÝÔ±Ô±¹¤¼×ÔÚ¾ßÌåʲôλÖ᣼ÙÈ繫˾À´ÁËÒ»¸öÔ±¹¤ÒÒ£¬ËûÏëÈÃÓʵÝÔ±Ë͹ýÀ´£¬¾ÍÒªÏÈÈÃÃÅÎÀÖªµÀ×Ô¼ºÔÚÄÄÒ»¸ö·¿¼ä£¬ÐèҪȥÃÅÎÀÄDZߵǼǣ¬Ô±¹¤ÒҵǼǺ󣬵±ÓʵÝÔ±ÏòÃÅÎÀѯÎÊʱ£¬ÃÅÎÀ¾Í¿ÉÒÔ¸æËßÓʵÝÔ±Ô±¹¤ÒҵľßÌåλÖá£ÃÅÎÀÖªµÀÔ±¹¤ÒҵľßÌåλÖõĹý³Ì¾ÍÊÇ·þÎñ·¢ÏÖ£¬Ô±¹¤ÒÒµÄλÖÃÐÅÏ¢¿ÉÒÔ±»¿´×÷·þÎñÐÅÏ¢£¬ÃÅÎÀµÄͨѶ¼¾ÍÊÇÉÏÎÄÖÐÌáµ½µÄÊý¾Ý½»»»¸ñʽ£¬´ËÀýÖÐÔ±¹¤ÒÒ¾ÍÊÇÉÏÎĵÄÒÑ·½£¬ÃÅÎÀ¾ÍÊÇ·þÎñ·¢ÏÖµÄÌṩÕß¡£

    ÒÔµ÷ÊÔģʽÆô¶¯consul:

    $ conusl agent –dev –bind=0.0.0.0

    go_micro(»ùÓÚGoµÄ΢·þÎñ¿ò¼Ü)


    1528351053368_17.png

    ÒÀÀµ

    ÎÒÃÇÐèÒªÒ»¸ö·¢ÏÖ·þÎñÆ÷£¬ÕâÀï 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/?

    0 ·ÖÏíµ½£º
    ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿