±à¼ÍƼö: |
±¾ÎĽ«½éÉÜ FreeWheel ºËÐÄÒµÎñϵͳÔÚ AWS ÔÆÆ½Ì¨ÉϴÅäÖÃÖÐÐĵÄʵս£¬×÷Ϊ´î½¨ÔÆÔÉúÅäÖÃÖÐÐĵIJο¼£¬Ï£ÍûÄܸø´ó¼Ò´øÀ´Æô·¢¡£
±¾ÎÄÀ´×Ôinfoq£¬ÓÉAlice±à¼¡¢ÍƼö¡£ |
|
ÒýÑÔ
ÔÚ´Óµ¥ÌåÓ¦ÓÃÏò΢·þÎñ¼Ü¹¹×ªÐ͵Ĺý³ÌÖУ¬·þÎñÅäÖùÜÀí´ÓÖ»ÐèÒªÓ¦¶ÔÒ»¸öµ¥Ìå·þÎñ£¬±äΪӦ¶Ô´óÁ¿·Ö²¼Ê½·þÎñ£¬ÄѶȳʼ¸ºÎ¼¶Ôö¼Ó¡£ÎªÁ˽â¾öÕâ¸öÄÑÌ⣬¸÷ÖÖÓ¦¶Ô·Ö²¼Ê½·þÎñµÄÅäÖÃÖÐÐÄÓ¦Ô˶øÉú£¬ÈçºÎ´î½¨Ò»¸ö¸ßЧºÏÀíµÄÅäÖÃÖÐÐÄÒѾ³ÉΪÿ¸ö´óÐÍ·Ö²¼Ê½ÏµÍ³±Ø¾µÄ¿¼Ñé¡£¶øÔÚ·þÎñ¡°ÉÏÔÆ¡±µÄ´óÇ÷ÊÆÏ£¬ÈçºÎÈÃÅäÖÃÖÐÐÄÔÚÔÆÆ½Ì¨Ë³ÀûÂ䵨£¬¸ü½øÒ»²½£¬ÈçºÎ½èÖúÔÆ¼ÆËãµÄÓÅÊÆÈÃÅäÖÃÖÐÐÄÈ绢ÌíÒí£¬Ä¿Ç°ÒµÄÚ¶ÔÕâÒ»¿é»¹´¦ÓÚ̽Ë÷½×¶Î¡£
¸ü¶àÏà¹ØÄÚÈݲμûϵÁÐÎÄÕ£ºÔÆÔÉú»·¾³ÏµÄ΢·þÎñʵ¼ùÈ«½â
ΪʲôÐèÒªÅäÖÃÖÐÐÄ£¿
·Ö²¼Ê½ÏµÍ³ÐËÆðÖ®ºó£¬ÅäÖùÜÀí±äµÃÓÈΪ¸´ÔÓ¡£1984 Ä꣬ҵ½ç¾ÍÓÐÁ½Î»Ñ§Õß
Kramer Jeff ºÍ Magee Jeff ÔÚ IEEE ·¢±íÁËһƪÎÄÕ¡¶·Ö²¼Ê½ÏµÍ³µÄ¶¯Ì¬ÅäÖá·£¬ÆäÖвûÊöµ½£º
¶¯Ì¬ÏµÍ³ÅäÖÃÊÇÔÚϵͳÔËÐÐʱ¶ÔÆä½øÐÐÐ޸ĺÍÀ©Õ¹µÄÄÜÁ¦¡£ÔÚ´óÐÍ·Ö²¼Ê½ÏµÍ³ÖУ¬ÕâÊÇÒ»¸ö±Ø²»¿ÉȱµÄ¹¦ÄÜ£¬ÒòΪÈç¹ûÐèҪֹͣÕû¸öϵͳÀ´¶ÔÆä²¿·ÖÓ²¼þ»òÈí¼þ½øÐÐÐ޸ģ¬ÔÚÉú²ú»·¾³ÊÇÄÑÒÔ½ÓÊܵ쬻òÕß»á²úÉú½Ï´ó¾¼ÃËðʧ¡£ÁíÍ⣬¶¯Ì¬ÅäÖÃÒ²ÓÐÖúÓÚϵͳÔÚÉú²ú»·¾³ÉÏ×é¼þµÄÔöÁ¿¼¯³É£¬ÒÔ´ï³ÉϵͳÑݽøµÄÄ¿µÄ¡£
ÕâÆªÎÄÕÂÖ¸³öÁ˶¯Ì¬ÅäÖöÔÓÚ·Ö²¼Ê½ÏµÍ³µÄÖØÒªÐÔ£¬¼´ÔÚϵͳÔËÐÐʱ£¬ÈçºÎ¾¼Ã°²È«µØ¶Ôϵͳ½øÐе÷Õû¡£ÏÖÔÚ·Ö²¼Ê½ÏµÍ³ÒѾ·¢Õ¹µ½ÁË´ÓǰÄÑÒÔÏëÏóµÄ¸´Ôӳ̶ȣ¬³ýÁ˶¯Ì¬ÅäÖã¬ÅäÖùÜÀí»¹ÃæÁÙ¸ü¶àÌôÕ½£¬ÀýÈ磺
ÈçºÎͳһ¹ÜÀíÊýÁ¿ÖÚ¶àµÄ·þÎñÅäÖÃ
ÈçºÎÔÚÒìµØÖÚ¶à»úÆ÷½ÚµãÉϲ¿ÊðÅäÖÃ
ÈçºÎʵÏÖ»Ò¶È
ÈçºÎÈ·¶¨ÅäÖÃÊÇ·ñÉúЧ
ÈçºÎ¶ÔÅäÖýøÐÐÔÖ±¸
¡
ΪÁ˽â¾öÕâЩÌôÕ½£¬ÅäÖÃÖÐÐÄÓ¦Ô˶øÉú¡£ÅäÖÃÖÐÐľÍÊÇ·Ö²¼Ê½·þÎñÖÐͳһ¹ÜÀí·þÎñÅäÖõÄϵͳ£¬Ëü¾ß±¸¸ßЧºÍ¶¯Ì¬¿ØÖÆ·þÎñµÄÄÜÁ¦¡£ÅäÖÃÖÐÐÄÒ»°ã¾ß±¸·þÎñ×¢²á¡¢·þÎñÅäÖùÜÀí¡¢²¿Êð·þÎñÅäÖõȻù±¾¹¦ÄÜ¡£ÏÂÃæÊÇÒ»¸ö΢·þÎñ¼Ü¹¹ÏÂÅäÖÃÖÐÐĵÄʾÒâͼ£º
ÅäÖÃÖÐÐÄÒ»°ã»á°üº¬·þÎñ¶Ë¡¢¿Í»§¶ËºÍ½çÃæÕâÈý¸ö×é¼þ£ºÃ¿¸ö΢·þÎñÆô¶¯Ê±¿ÉÒÔͨ¹ý¿Í»§¶Ë½øÐзþÎñ×¢²á£»Óû§¿ÉÒÔͨ¹ý½çÃæ´´½¨¡¢Ð޸ĺͲ¿ÊðÅäÖã»¶¯Ì¬ÅäÖù¦ÄÜ¿ÉÒÔͨ¹ý·þÎñ¶ËÊµÊ±ÍÆËÍ¡¢¿Í»§¶Ë¶¨ÆÚÀÈ¡»òÕßÁ½ÕßÍÆÀ½áºÏÀ´ÊµÏÖ¡£
FreeWheel ÔÆÔÉúÅäÖÃÖÐÐÄʵս
Í´µã
·þÎñÅäÖõÄÊýÁ¿´ó·ùÔö¼Ó
Freewheel ºËÐÄÒµÎñϵͳÖÐÒѲð·Ö³öÊýÊ®¸ö¶ÀÁ¢µÄ΢·þÎñ£¬Ã¿¸ö΢·þÎñ¶¼ÐèÒª²¿Êð¶à¸ö»·¾³£¨Staging¡¢Production¡¢¿ª·¢¡¢²âÊÔ»·¾³£©£¬¶à¸ö¼¯Èº£¬¶à¸öÇøÓò(Region)¡£¿ª·¢ÈËÔ±ÐèҪά»¤¶àÌ×·þÎñÅäÖá£
·þÎñÅäÖõIJ¿Êð·½Ê½²»Í¬
Freewheel ºËÐÄÒµÎñϵͳÔÚÔÆÆ½Ì¨ºÍÊý¾ÝÖÐÐĵIJ¿Êð·½Ê½£¬ÒÔ¼°ÔÚ²»Í¬»·¾³µÄ²¿Êð·½Ê½¸÷²»Ïàͬ¡£¿ª·¢ÈËÔ±ÐèҪͶÈëʱ¼ä³É±¾È¥Ñ§Ï°ºÍ¹ÜÀí¸÷ÖÖ²¿Êð·½Ê½¡£
ȱ·¦¶¯Ì¬ÅäÖù¦ÄÜ
Freewheel ºËÐÄÒµÎñϵͳÔÚÔËÐÐʱÐ޸ķþÎñÅäÖõÄÁ÷³Ì½ÏΪ·±Ëö£¬°üÀ¨Ìá½»¡¢ÆÀÉ󡢺ϲ¢·ÖÖ§¡¢ÔËÐвâÊÔ¡¢´ò°ü¡¢²¿Êð
Staging ºÍ Production µÈ¡£Õâ¸öЧÂʲ»ÄÜÂú×ãÍŶÓÐèÇó£¬ÀýÈç Freewheel ×÷ÎªÃæÏòÆóÒµ¼¶¿Í»§Ìṩ¹ã¸æÍ¶·Å·þÎñµÄϵͳ£¬ÔÚ¹ã¸æÍ¶·ÅµÄ¸ß·åÆÚ´¦ÀíµÄÊý¾ÝÁ¿Ô¶¸ßÓÚÆ½³££¬¹¤³ÌʦÍŶÓÐèÒª¶¯Ì¬ÅäÖ÷þÎñµÄ³¬Ê±²ÎÊý£»ÓÖÈçÔÚÉú²ú»·¾³¶ÔÎÊÌâ½øÐж¨Î»ºÍµ÷ÊÔʱ£¬ÐèÒª¾¡¿ìµ÷¸ßÈÕÖ¾¼¶±ð£¬ÒÔ±ã¿ìËÙ½â¾öÎÊÌâ¡£
±£Ö¤ Freewheel ºËÐÄÒµÎñÏµÍ³ÃæÏòÆóÒµ¼¶Óû§µÄ¸ß¿ÉÓÃÐÔ
Èí¼þϵͳ×ÜÊÇ»áå´»úµÄ£¬µ±ÅäÖÃÖÐÐÄϵͳ±»Ðí¶à΢·þÎñÒÀÀµ×öÅäÖùÜÀíʱ£¬Ò»¶¨µÃ¿¼Âǵ½Ëüå´»úʱÆäËû·þÎñ¸ÃÔõô°ì¡£ËùÒÔÅäÖÃÖÐÐÄÐèҪʵÏÖΪÈõÒÀÀµ¶ø·ÇÇ¿ÒÀÀµ£¬¼´ÅäÖÃÖÐÐijöÏÖϵͳ¹ÊÕÏʱ£¬ÆäËû·þÎñÒ²ÄÜÕý³£Æô¶¯ºÍÔËÐС£
±£Ö¤ÅäÖÃÖÐÐĵݲȫÐÔ
ÅäÖÃÖÐÐĵĹÜÀí¶ÔÏóÊDZȽÏÃô¸ÐµÄ·þÎñÅäÖÃÏ¶Ô°²È«ÐÔÓнϸßÒªÇó£¬ÐèÒªºÏÀíÅäÖÃÓû§ºÍ¼¯ÈºµÄ·ÃÎÊȨÏÞ¡£
ÅäÖÃÖÐÐÄÑ¡ÐÍ
ΪÁ˽â¾öÉÏÊöÍ´µã£¬ÎÒÃÇ¿ªÊ¼Îª Freewheel ºËÐÄÒµÎñϵͳÉè¼Æ²¢´î½¨ÅäÖÃÖÐÐÄ¡£ÔÚÑ¡Ðͽ׶Σ¬ÎÒÃDzο¼Á˵±Ê±½ÏΪ³ÉÊìµÄ¼¸¸öÅäÖÃÖÐÐIJúÆ·£¬Èç
Apollo¡¢Nacos¡¢Consul µÈ¡£ÅäÖÃÖÐÐĵĵÚÒ»¸ö°æ±¾ÖУ¬ÎÒÃÇÑ¡ÔñÁË Apollo ×÷Ϊ·þÎñ¶ËºÍ½çÃæ£¬ÒòΪ
Apollo ÔÚÓû§½çÃæÓѺöȡ¢ºËÐŦÄÜÖ§³Ö¶È¡¢ÉçÇøÎĵµÍêÉÆ¶È·½Ãæ¶¼½ÏΪͻ³ö¡£Apollo ²úÆ·¼Ü¹¹Ö÷Òª°üº¬
Config Service£¨ÌṩÅäÖÃÍÆËͺÍÀÈ¡½Ó¿Ú£©¡¢Admin Service£¨ÌṩÅäÖùÜÀí½Ó¿Ú£©¡¢
Portal£¨Óû§½çÃæ£©ºÍ¿Í»§¶Ë£¬ÈçÏÂͼËùʾ£º
Freewheel ºËÐÄÒµÎñϵͳµ±Ê±ÕýÍù AWS ÔÆ·þÎñÉÏǨá㣬ÎÒÃÇΪÅäÖÃÖÐÐÄ¿ª·¢Á˿ͻ§¶Ë£¬²¢ÔÚ
AWS ¿ª·¢»·¾³²¿ÊðÁË Apollo µÄÏà¹Ø·þÎñ¡£µ«ËæºóÎÒÃDzúÉúÁËһЩ¹ËÂÇ¡£
Ê×ÏÈÊÇѧϰά»¤³É±¾£ºFreewheel ºËÐÄÒµÎñϵͳµÄ΢·þÎñ¼Ü¹¹Ê¹ÓÃ
GO ¼¼ÊõÕ»£¬Óë Apollo ʹÓÃµÄ Java ²»Ò»Ö£¬¹¤³ÌʦÍŶÓÐèҪͶÈë¶îÍâµÄѧϰ³É±¾£»Ê¹Óà Apollo
»¹ÐèÒªÔÚ AWS ÉÏά»¤ËÄÌ×·ÇÔÆÔÉúµÄ·þÎñ£ºConfig Service¡¢Admin Service¡¢Portal
ºÍ DB£¬ÓÉÓÚȱ·¦²úÆ·¼¶µÄ Apollo ¼¼ÊõÖ§³Ö£¬»á²úÉú½Ï´óµÄά»¤³É±¾¡£Æä´ÎÊDzúÆ·¹ú¼Ê»¯µÄÎÊÌ⣺Freewheel
¶ÔÓÚ¿ªÔ´²úÆ·µÄʹÓÃÓÐÑϸñµÄÉó¼ÆÁ÷³Ì£¬ÐèÒªÌá½»´úÂë¿â¡¢Ó¢ÎİæµÄ¼Ü¹¹Éè¼ÆºÍʹÓÃ˵Ã÷Îĵµ¡£Apollo ×÷Ϊһ¿î¹úÄÚ×ÔÑвúÆ·£¬Ã»Óз¢²¼ÏêϸµÄÓ¢ÎÄÎĵµ¡£
Òò´ËÎÒÃÇ¿ªÊ¼¿¼²ìÆäËû²úÆ·Èç AWS AppConfig¡£µ÷Ñз¢ÏÖ£¬AppConfig µÄ¹¦ÄÜûÓÐ
Apollo ÄÇÃ´È«Ãæ£º
ÅäÖÃÖÐÐÄÒ»¸öÖØÒªµÄ·þÎñ¶ËÍÆË͹¦Äܲ»±» AppConfig Ö§³Ö£¬Õâ»áÓ°ÏìÅäÖÃÖÐÐÄµÄ SLA£¬¼´ÅäÖÃÉúЧµÄʱÑÓ¡£È»¶ø×÷Ϊһ¼Ò
B2B ¹«Ë¾£¬Freewheel ¶ÔÅäÖÃÖÐÐÄ SLA µÄÒªÇó²»Ì«¸ß¡£¶øÅäÖÃÖÐÐÄÆäËû¼¸¸öÖØÒª¹¦ÄÜ£º¿Í»§¶ËÀÈ¡¡¢Óû§È¨ÏÞ¿ØÖÆ¡¢Óû§½çÃæ£¬ÎÒÃÇÄÜ»ùÓÚÏÖÓеÄ΢·þÎñ¼Ü¹¹ÓýÏСµÄ¿ª·¢³É±¾ÊµÏÖ¡£
µ«Ê¹Óà AppConfig µÄºÃ´¦ÊÇ£º×÷Ϊ AWS ÔÆÔÉú·þÎñ£¬AppConfig
¸úÎÒÃÇµÄ AWS ·þÎñ¼¯ÈºÓÐºÜºÃµÄÆõºÏ¶È£¬ÄÜ·½±ã»ñµÃ AWS ¼¼ÊõÍŶӵÄÖ§³Ö£¬½µµÍѧϰά»¤³É±¾ºÍʹÓóɱ¾¡£ÎÒÃǹÀËãÁËÅäÖÃÖÐÐĵķÑÓã¬Ö÷Òª°üÀ¨
AppConfig API µ÷ÓÃºÍ S3 ·ÑÓ᣼ÙÉèÒ»¸ö΢·þÎñ²¿ÊðÁ½¸öÇøÓò£¬Æô¶¯ 3 ¸ö POD£¬ÅäÖÃÎļþ´óСΪ
10K£¬Ã¿Ìì¸üÐÂÁ½´ÎÅäÖã¬Ã¿·ÖÖÓÂÖѯһ´Î AppConfig£¬ÄÇôÕâ¸ö΢·þÎñʹÓÃÅäÖÃÖÐÐĵķÑÓôóÔ¼ÊÇ
0.6 ÃÀÔª/Ô¡£
×ۺϿ¼ÂÇ Freewheel µÄÒµÎñÐèÇóºÍʹÓóɱ¾ºó£¬ÎÒÃDzÉÓÃÁË»ùÓÚ AWS AppConfig
µÄÅäÖÃÖÐÐļܹ¹¡£
ÅäÖÃÖÐÐļܹ¹
ÅäÖÃÖÐÐĵĺËÐÄÄ£¿é°üÀ¨ AWS AppConfig ·þÎñ¶Ë¡¢Î¢·þÎñ¿Í»§¶Ë¡¢Óû§½çÃæ¡£Ö÷ҪʹÓó¡¾°°üÀ¨£º
¸÷¸ö΢·þÎñͨ¹ýÓû§½çÃæ¹ÜÀíÅäÖ㺰üÀ¨´´½¨ÅäÖÃÓ¦ÓóÌÐò£¬Ïò AWS S3 ¶ÁдÅäÖÃÎļþ£¬ ͨ¹ý AppConfig
²¿Êð×îеÄÅäÖã¬ÔÚÊý¾Ý¿âÖмǼÓû§µÄ²Ù×÷ÀúÊ·¡£
¸÷¸ö΢·þÎñͨ¹ý¿Í»§¶Ë¶Ô AppConfig ·þÎñ¶Ë½øÐж¨ÆÚÂÖѯ£¬Ò»µ©·¢ÏÖÅäÖøüУ¬¾Í´Ó AppConfig
·þÎñ¶ËÀÈ¡ÅäÖò¢Ê¹Ö®ÔÚ΢·þÎñÖÐÉúЧ¡£
ÅäÖÃÖÐÐÄÂäµØÊµÏÖ
AWS AppConfig ·þÎñ¶Ë
AWS AppConfig ÊÇ AWS ¿ª·¢ÓÃÀ´´´½¨¡¢¹ÜÀíºÍ¿ìËÙ²¿ÊðÓ¦ÓÃÅäÖõķþÎñ¡£ ¿Í»§¶ËºÍÓû§½çÃæµÄʵÏÖÓë
AppConfig Ìṩ·þÎñµÄʵÌåÃÜÇÐÏà¹Ø¡£AppConfig ͨ¹ýÒÔÏÂʵÌåÀ´¹ÜÀíÓ¦ÓÃÅäÖãº
Ó¦ÓóÌÐò£¨Application£©£ºÓ¦ÓóÌÐò¾ÍÊÇÐèÒª AppConfig ÌṩÅäÖùÜÀíµÄÓ¦Óã¬ÈçÔÚ
EC2 ʵÀýÉÏÔËÐеÄ΢·þÎñ£¬AWS Lambda µÄÎÞ·þÎñÆ÷Ó¦ÓóÌÐòµÈµÈ¡£
»·¾³£¨Environment£©£º¶ÔÓÚÿ¸öÓ¦ÓóÌÐò£¬¿ÉÒÔ¶¨ÒåÒ»¸ö»ò¶à¸ö»·¾³£¬ÀýÈç Staging »ò
Production¡£
ÅäÖã¨Configuration£©ºÍÅäÖÃÎļþ£¨Configuration Profile£©£ºÃ¿¸ö»·¾³ÏÂÖ»ÓÐÒ»¸öÅäÖã¬ÅäÖÃÎļþ¾ÍÊǼǼÅäÖÃÄÚÈݵÄÎļþ¶ÔÏó¡£Ã¿´Î¸üÐÂÅäÖã¬Êµ¼Ê¸üеÄÊÇÅäÖÃÎļþµÄÄÚÈÝ£¨°æ±¾£©¡£
ÅäÖòßÂÔ£¨Deployment Strategy£©£ºÅäÖòßÂÔ¶¨ÒåÁËÅäÖõIJ¿Êð·½Ê½£¬È粿Êð½ÚµãÊÇÏßÐÔÀ©ÕÅ»¹ÊÇÖ¸ÊýÀ©ÕÅ¡¢²¿Êðʱ³¤¡¢¼à¿ØºÍ»Ø¹ö²ßÂԵȡ£
ÏÂͼÊÇ Freewheel ºËÐÄÒµÎñϵͳ¼¯ÈºµÄʵ¼ÊÓ¦Óó¡¾°£¬ÓÉÓÚ Development¡¢Staging
¡¢Production Èý¸ö»·¾³µÄ¼¯Èº»¥Ïà¸ôÀ룬ÎÒÃÇΪ²»Í¬»·¾³µÄ¼¯Èº´´½¨Á˶ÀÁ¢µÄ AppConfig
·þÎñ¶ËºÍÓû§½çÃæ¡£Î¢·þÎñÔÚÓû§½çÃæ´´½¨ÓëÖ®¹ØÁªµÄÓ¦ÓóÌÐò£¬Õâ¸öÓ¦ÓóÌÐò½ö°üº¬Ò»¸ö»·¾³¡£ÎÒÃÇÑ¡ÔñÁË S3
À´´æ´¢ÅäÖÃÎļþ£¬¿ÉÒÔͨ¹ýÓû§½çÃæ¶ÁдÅäÖÃÎļþ¡£Ä¿Ç°ÅäÖÃÖÐÐÄÔÚ²¿ÊðʱʹÓõÄÅäÖòßÂÔÊÇÿ 30 Ã벿Êð
50%µÄ½Úµã¡£
ÅäÖÃÖÐÐĿͻ§¶Ë
¿Í»§¶ËÊÇ΢·þÎñ½øÐÐÅäÖÃÂÖѯºÍÅäÖøüеÄÖØÒª×é¼þ¡£ÎÒÃÇÔÚÅäÖÃÖÐÐĿͻ§¶Ë×öÁËÔÖ±¸´¦Àí£¬´Ó¶øÊµÏÖÁË΢·þÎñ¼¯Èº¶ÔÅäÖÃÖÐÐĵÄÈõÒÀÀµ¡£¼´±ãÅäÖÃÖÐÐĵķþÎñ¶Ë»òÕßÓû§½çÃæ³öÏÖ¹ÊÕÏ£¬Î¢·þÎñ¼¯ÈºµÄÔËÐÐÒ²²¢²»ÊÜÓ°Ï죬ֻÊDz»ÄÜʹÓÃÅäÖùÜÀíµÄ¹¦ÄÜ¡£ÅäÖÃÖÐÐĿͻ§¶ËµÄ¹¤×÷Á÷³ÌÈçÏ£º
΢·þÎñÆô¶¯ºó£¬ÎÒÃǻὫ±¸·ÝÅäÖÃÎļþ¼ÓÔØµ½ÄÚ´æÖУ¬È»ºóÆô¶¯Ò»¸ö Go Routine ¹ØÁªÅäÖÃÖÐÐÄ£¬°´ÕÕÒ»¶¨Ê±¼ä¼ä¸ôÀ´ÂÖѯÅäÖá£Èç¹û·¢ÏÖÅäÖøüУ¬¾Í°Ñ¸üÐÂÄÚÈݺϲ¢µ½ÄÚ´æÅäÖÃºÍÆäËû¶¨ÖƵÄÅäÖÃÖУ¬·ñÔòµÈ´ýÏÂÒ»´ÎÂÖѯ¡£¿Í»§¶ËʹÓÃ
Go ÓïÑÔ¿ª·¢£¬ÏÂÃæÊǹØÁªºÍ²éѯÅäÖÃÖÐÐĵÄʾÀý´úÂ룺
func InitConfigCenter(serviceName
string, callbacks ...CustomCallback) {
go func() {
for {
func() {
defer func() {
// ´¦ÀíPanic
}()
appConfigClient := getAppConfigClient()
// ²éѯÅäÖøüУ¬ÈçÓиüÐÂÔòʹ֮ÉúЧ
GetAndMergeAppConfig(appConfigClient, serviceName,
callbacks...)
}()
time.Sleep(time.Duration(pollingDuration) * time.Second)
}
}()
} |
²ÎÊý serviceName£ºÔÚ·þÎñ¶Ë¾ßÓÐΨһÐԵıêÖ¾·û£¬Ò»°ãµÈͬ΢·þÎñÃû¡£¹ÜÀíÈËÔ±ÔÚÓû§½çÃæÐèÒªÊäÈëͬÑùµÄ
serviceName È¥´´½¨ AppConfig Ó¦ÓóÌÐò£¬È»ºó¿Í»§¶ËºÍ·þÎñ¶Ëͨ¹ý¸Ã serviceName
Æ¥ÅäÓ¦ÓóÌÐò¡£
²ÎÊý CustomCallback£ºÎ¢·þÎñ¿É¶¨ÖƵÄÐÞ¸ÄÅäÖõĽӿڡ£»ñÈ¡ÅäÖøüк󣬿ͻ§¶Ë»áĬÈÏÐÞ¸ÄÄÚ´æÅäÖÃʹÅäÖÃÉúЧ¡£µ«ÓÐЩÅäÖò»ÊÇ´ÓÄÚ´æÅäÖÃÖжÁÈ¡µÄ£¬ÀýÈç´æ´¢ÔÚÈ«¾Ö±äÁ¿ÀïµÄÅäÖ㬴Ëʱ¿ÉÒÔͨ¹ýÕâ¸ö½Ó¿Ú¶¨ÖƸüÐÂÅäÖõķ½·¨¡£
¿¼Âǵ½ÈõÒÀÀµµÄÉè¼ÆÔÔò£¬¿Í»§¶ËÄÚ´æÅäÖõĸüвÉÓÃÁ˺ϲ¢²ßÂÔ£¨Merge£©¶ø·ÇÌæ´ú²ßÂÔ¡£³õʼÄÚ´æÅäÖôӱ¸·Ý¶ÁÈ¡£¬Ëæºó´Ó·þÎñ¶Ë²»Í£ÀÈ¡×îÐÂÅäÖýøÐкϲ¢¡£·þÎñ¶ËÅäÖÿÉÒÔ¶ÔÄÚ´æÅäÖýøÐÐÈ«Á¿¸²¸Ç¡¢²¿·Ö¸²¸Ç¡¢»òÕßÐÂÔöÅäÖá£
¿Í»§¶ËµÄÄÚ´æÅäÖùÜÀíÊÇ»ùÓÚ Viper£¨"github.com/spf13/viper"£©ÊµÏֵģ¬ºÏ²¢ÅäÖÃʱʹÓÃÁË
Viper.MergeConfig ·½·¨£º
func mergeAppConfig(newConfig
*appconfig.GetConfigurationOutput, callbacks ...CustomCallback)
{
memoryConfig := config.Get()
if err := memoryConfig.MergeConfig (bytes.NewReader(newConfig.Content));
err != nil {
// ´¦ÀíÅäÖúϲ¢´íÎó
}
// ¸üÐÂÄÚ´æÅäÖÃ
config.Set(memoryConfig)
// ¸üж¨ÖÆÅäÖÃ
for i, callback := range callbacks {
callback.CustomCallbackFunc(newConfig)
}
} |
¿Í»§¶ËµÄÒ»¸öÖØÒªÂß¼ÊÇÅäÖð汾µÄ±£´æºÍ±È¶Ô¡£¿Í»§¶ËÔÚ±¾µØ´æ´¢ÁË֮ǰÂÖѯ»ñµÃµÄ·þÎñ¶Ë×îÐÂÅäÖð汾£¬Ã¿´Îµ÷ÓÃ
AppConfig API ²éѯʱ¶¼»áÊäÈëÕâ¸öÅäÖð汾¡£AppConfig API »á±È½ÏÇëÇóÀïµÄÅäÖð汾ºÍ·þÎñ¶Ë×îеÄÅäÖð汾£¬Á½Õß²»Ò»ÖÂʱ»á·µ»Ø×îеÄÅäÖð汾ºÍÅäÖÃÄÚÈÝ£¬·ñÔò·µ»ØÔÀ´µÄÅäÖð汾¡£°æ±¾²»Ò»ÖÂʱ£¬µ÷ÓÃ
API µÄ·ÑÓûá±Èƽʱ¸ßºÜ¶à¡£¿Í»§¶ËÊÕµ½·þÎñ¶Ë´ð¸´ºó£¬ÔٴαȽϱ¾µØºÍ´ð¸´ÀïµÄÅäÖð汾£¬Èç¹û²»Ò»Ö¾ͻᱣ´æÐµİ汾£¬²¢ÇÒ½øÐÐÅäÖúϲ¢¡£ÏÂÃæÊǵ÷ÓÃ
AppConfig GetConfiguration API µÄ´úÂ룺
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/appconfig"
)
var latestConfigVersion = "-1" // µÚÒ»´Î²éѯʱµÄ³õʼ°æ±¾
?
func getAppConfig(region, env, clientId, configuration,
applicationName string) (*appconfig.GetConfigurationOutput,
error) {
awsConfig := &aws.Config{ Region: aws.String(region)
}
mySession := session.Must(session.NewSession(awsConfig))
appConfigClient := appconfig.New(mySession, aws.NewConfig())
return appConfigClient.GetConfiguration(&appconfig. GetConfigurationInput{
Application: &applicationName,
Environment: &env,
Configuration: &configuration,
ClientConfigurationVersion: &latestConfigVersion,
// ʹÓñ¾µØ¼Ç¼µÄ×îзþÎñ¶ËÅäÖð汾
ClientId: &clientId,
})
} |
GetConfiguration ÊäÈë°üÀ¨ AppConfig µÄÓ¦ÓóÌÐòÃû¡¢»·¾³Ãû¡¢ÅäÖÃÃû¡¢ÅäÖÃÎļþ°æ±¾ºÍ¿Í»§¶ËÖ¸¶¨µÄΨһ
ClientId£¬Êä³ö GetConfigurationOutput °üÀ¨ÅäÖÃÎļþ°æ±¾ºÍÅäÖÃÄÚÈÝ£¨¿ÉÑ¡Ï¡£
ÅäÖÃÖÐÐÄÓû§½çÃæ
ÅäÖÃÖÐÐÄÓû§½çÃæÊÇÓÃÀ´Í³Ò»¹ÜÀí¸÷¸ö΢·þÎñÅäÖõĴ°¿Ú¡£ÎÒÃÇÔÚ Freewheel
ÄÚ²¿ÒµÎñÊý¾Ý²éѯƽ̨ Falcon ÉϴÁËÅäÖÃÖÐÐĵÄÓû§½çÃæ£¬½öÔÊÐí LDAP ÕË»§¿ªÍ¨ÅäÖÃÖÐÐĵķÃÎÊ»ò¹ÜÀíȨÏÞ¡£
AppConfig ·þÎñÔÚ AWS ¿ØÖÆÆ½Ì¨Ò²ÓÐ×Ô¼ºµÄ¹ÜÀí½çÃæ£¬µ«ÊDz»ÄÜÂú×ãÎÒÃǵÄÐèÇó¡£Ê×ÏÈ
AWS ¿ØÖÆÆ½Ì¨µÄȨÏÞ¹ÜÀí±È½ÏÑϸñ£¬¹¤³ÌʦÍŶÓÔÚÉú²ú»·¾³Ö»Óв¿·Ö¶ÁȨÏÞ£¬Ã»ÓÐдȨÏÞ£¬Èç¹ûÎÒÃÇÐèÒªÔÚ
AWS ¿ØÖÆÆ½Ì¨ÉϹÜÀíºÍ²¿ÊðÅäÖã¬Ã¿´Î¶¼ÐèÒªµ¥¶ÀÉêÇëȨÏÞ¡£ÁíÍâ AppConfig ÔÉúµÄ¹ÜÀí½çÃæ±È½Ï¼òµ¥£¬²»ÄÜ¿´µ½¾ßÌåµÄÅäÖÃÏîÄÚÈÝ£¬ÐèҪȥÏàÓ¦µÄ
S3 Ò³ÃæÏÂÔØÅäÖÃÎļþ£¬Ò²²»¾ß±¸ÅäÖöԱȺͲ鿴Óû§ÀúÊ·²Ù×÷µÄ¹¦ÄÜ¡£
ÅäÖÃÖÐÐÄÓû§½çÃæ¼Ü¹¹£º
ÅäÖÃÖÐÐÄÓû§½çÃæ°üº¬ÁËǰ¶ËºÍºó¶ËÄ£¿é£¬Ç°¶ËÄ£¿éÓÉ React ʵÏÖ£¬°üÀ¨ÒÔÏÂÒ³Ãæ£º
Ö÷Ò³£ºÕ¹Ê¾ËùÓÐ΢·þÎñÓ¦ÓóÌÐòÁÐ±í¡£
Ó¦ÓÃÒ³Ãæ£ºÕ¹Ê¾µ¥¸ö΢·þÎñÓ¦ÓóÌÐòµÄÏêϸÐÅÏ¢£¬ÓÉÖ÷Ò³½øÈë¡£
´´½¨Ò³Ã棺Ϊһ¸öеÄ΢·þÎñ´´½¨Ó¦ÓóÌÐò£¬ÓÉÖ÷Ò³½øÈë¡£
ÅäÖÃÉÏ´«Ò³Ã棺ÉÏ´«ÐµÄÅäÖÃÎļþ£¬ÓÉÓ¦ÓÃÒ³Ãæ½øÈë¡£
ÅäÖò¿ÊðÒ³Ãæ£ºÑ¡ÔñÒ»¸öÅäÖÃÎļþ°æ±¾½øÐÐÅäÖò¿Êð£¬ÓÉÓ¦ÓÃÒ³Ãæ½øÈë¡£
ÀúÊ·¼ÇÂ¼Ò³Ãæ£ºÕ¹Ê¾Ó¦ÓóÌÐòËùÓв¿ÊðÀúÊ·ºÍÓû§£¬ÓÉÓ¦ÓÃÒ³Ãæ½øÈë¡£
ºó¶ËÄ£¿éÓÉ Node.js ʵÏÖ£¬·ÖΪÅäÖùÜÀíºÍÓû§¹ÜÀíÁ½¸ö×ÓÄ£¿é¡£ÔÚÅäÖùÜÀíÄ£¿éµ÷ÓÃ
JS SDK µÄ AppConfig Client ºÍ S3 Client ʵÏÖÉÏÊöǰ¶ËÒ³Ãæ¹¦ÄÜ£»ÔÚÓû§¹ÜÀíÄ£¿éʵÏÖÁËȨÏÞ¹ÜÀíºÍÀúÊ·¼Ç¼¹¦ÄÜ£¬Óû§µÄ´´½¨¡¢ÉÏ´«¡¢²¿ÊðÐÐΪ»á±»¼Ç¼µ½Êý¾Ý¿âÖС£´´½¨Ò»¸ö¿ÉÓõÄ
AppConfig Ó¦ÓóÌÐòʵ¼ÊÉϰüº¬ÁËËĸö²½Ö裺´´½¨Ó¦ÓóÌÐò£¬´´½¨»·¾³£¬ÉÏ´«³õʼÅäÖÃÎļþ£¬ÔÚÓ¦ÓóÌÐòÖаó¶¨ÅäÖÃÎļþ¡£ÔÚÓ¦ÓóÌÐòÖйØÁªÅäÖÃÎļþºó£¬»á¼Ç¼ÅäÖÃÎļþµÄµØÖ·ºÍ°æ±¾¡£Ã¿´ÎΪÕâ¸öÓ¦ÓÃÉÏ´«²¢²¿ÊðеÄÅäÖÃÎļþºó£¬¹ØÁªÅäÖÃÎļþµÄ°æ±¾¾Í»á±ä¶¯¡£ÔÚÀúÊ·¼ÇÂ¼Ò³Ãæ¿ÉÒÔ¿´µ½Àú´Î²¿ÊðµÄ״̬¡¢¿ªÊ¼Ê±¼ä¡¢ÅäÖð汾¡¢²¿Êðʱ³¤ºÍ²Ù×÷Óû§£¬»¹¿ÉÒÔ¶ÔÅäÖÃÄÚÈݽøÐÐÁé»î¶Ô±È¡£ÏÂÃæ¸ø´ó¼ÒչʾһÏÂÅäÖÃÖÐÐĵÄÓû§½çÃæ¡£
Falcon ƽ̨Ö÷Ò³£º
ÅäÖÃÖÐÐÄÖ÷Ò³£º
ÅäÖÃÖÐÐÄÀúÊ·¼ÇÂ¼Ò³Ãæ£º
Â䵨³£¼ûÎÊÌâ
ÔڴÅäÖÃÖÐÐĵÄʵս¹ý³ÌÖУ¬ÎÒÃDzÈÁ˲»ÉٵĿӣ¬Ò²×ܽáÁËһЩ¾Ñé¡£ÔÚÕâÀï·ÖÏí¸ø´ó¼Ò£¬Ï£ÍûÄܶԴó¼ÒÓÐËù°ïÖú¡£
ÈçºÎºÏÀíʹÓà AppConfig ·þÎñʹÆäÊÕ·Ñ×îµÍ£¿
GetConfiguration API ÊÇ AWS AppConfig
·þÎñÖÐ×îÖØÒªµÄ API£¬Í¨¹ýÂÖѯÕâ¸ö API ¿ÉÒÔ»ñµÃÅäÖð汾±ä»¯ÐÅÏ¢ºÍ×îеÄÅäÖÃÏîÄÚÈÝ¡£¸Ã API
ÇëÇóËù´øµÄ²ÎÊý ClientConfigurationVersion Óë·þÎñ¶Ë×îеÄÅäÖð汾һÖÂʱÊշѽϵͣ¬·ñÔòÊշѽϸߡ£Îª±ÜÃâ¶îÍâÊÕ·Ñ£¬¿Í»§¶ËÒ»¶¨ÒªÔÚ±¾µØ´æ´¢Ö®Ç°²éѯµÄ·þÎñ¶Ë×îеÄÅäÖð汾£¬ÔÚµ÷ÓÃ
API ʱʹÓá£
¿Í»§¶Ë»¹ÐèҪעÒâÒ»¸öÂß¼£¬¾ÍÊǿͻ§¶ËÕæÊµÉúЧµÄÅäÖð汾²»Ò»¶¨µÈͬÓÚ·þÎñ¶Ë×îеÄÅäÖð汾£¬ÒòΪ¿Í»§¶Ë´Ó·¢ÏÖÅäÖð汾±ä»¯µ½Æô¶¯ÅäÖøüÐÂÕâÒ»¹ý³ÌÊÇ¿ÉÄܳö´íµÄ¡£¼´Ê¹¿Í»§¶ËÔÚÅäÖøüйý³Ì³ö´í£¬Ò²Òª±£´æ³ö´í°æ±¾¹©Ï´ε÷ÓÃʹÓá£
ÈçºÎ»ñÈ¡ÓÐЧµÄÅäÖÃÎļþ°æ±¾£¿
AppConfig µÄÅäÖÃÎļþ°æ±¾µÈͬÓÚ S3 Îļþ°æ±¾¡£µ« S3
ÉÏ´«ÅäÖÃÎļþºÍ AppConfig ²¿ÊðÅäÖò»ÊÇÒ»¸öÊÂÎñ²Ù×÷£¬ËùÒÔ×îÐ嵀 S3 Îļþ°æ±¾²»µÈͬÓÚ AppConfig
µÄÓÐЧÅäÖÃÎļþ°æ±¾¡£ËùÒÔÒª»ñÈ¡ AppConfig ×îÐÂÉúЧµÄÅäÖÃÎļþ°æ±¾£¬²»Äܵ÷Óà S3 API£¬¶øÊǵ÷ÓÃ
AppConfig ListDeploymentsCommand API£¬¶ÁÈ¡·µ»ØÁбíÖÐ×îеÄÅäÖð汾¡£
ÈçºÎÔÚ±¾µØ¿ª·¢»·¾³µ÷ÊÔ AppConfig?
ÔÚ±¾µØ¿ª·¢»·¾³µ÷ÊÔ AppConfig ʱ²»ÄÜʹÓÃÉú²ú»·¾³µÄ IAM ½ÇÉ«£¬¿ÉÒÔʹÓÃÒ»¸ö AWS
Õ˺ŵÄÁÙʱƾ֤À´·¢ËÍ AppConfig API ÇëÇó£º
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
)
func getAWSSession(region, env, accessKey, secretKey,
awsSessionToken string) *session.Session {
awsConfig := &aws.Config{ Region: region }
if env == DEV_ENV {
creds := credentials.NewStaticCredentials(accessKey,
secretKey, awsSessionToken)
awsConfig.Credentials = creds
}
return session.Must(session.NewSession(awsConfig))
} |
ÆäÖÐ accessKey¡¢secretKey¡¢awsSessionToken
À´Ô´ÓÚ AWS CLI ΪÕâ¸ö AWS Õ˺ÅÌṩµÄÁÙʱƾ֤ÐÅÏ¢£¬¿ÉÔÚ AWS ¿ØÖÆÆ½Ì¨ÉÏÓÃÕ˺ŵǽºóʵʱ²éѯ¡£²»Ìí¼ÓÕâ¸öÁÙʱƾ֤ÐÅÏ¢¾Í»á×Ô¶¯Ê¹ÓÃ
EC2 ĬÈÏ»òÕßÅäÖÃµÄ IAM ½Çɫƾ֤¡£
ÈçºÎºÏÀíÅäÖà AppConfig ·þÎñµÄ¶ÁдȨÏÞ£¿
ÒÔ Freewheel ÅäÖÃÖÐÐĵĿͻ§¶ËºÍÓû§½çÃæÎªÀý£¬¿Í»§¶ËÐèÒª·¢ËÍ´óÁ¿
AppConfig ¶ÁÇëÇó£¬Óû§½çÃæÐèÒª·¢ËÍÉÙÁ¿ AppConfig ¶ÁдÇëÇó¡£ËùÒÔÎÒÃÇΪ¿Í»§¶Ë EC2
µÄĬÈÏ IAM ÅäÖÃÁË AppConfig ¶ÁȨÏÞ£¬ÎªÓû§½çÃæ EC2 ÉêÇëÁËÌØÊâ IAM ½ÇÉ«²¢ÎªËüÅäÖÃÁË
AppConfig ¶ÁдȨÏÞ¡£ÒªÊ¹ÌØÊâ IAM ½ÇÉ«ÉúЧ£¬ÐèÒªÐÞ¸Ä K8S ²¿ÊðÎļþ£º
// deployment.yaml
spec:
template:
sepc:
serviceAccountName: {{ $.Your.Arn.Account.Name
}}
// serviceaccount.yaml
annotations:
eks.amazonaws.com/role-arn: {{ $.Your.Arn.Role.Name
}} |
ÌØÊâ IAM ½ÇÉ«ÅäÖóɹ¦ºó£¬¿ÉÒÔÔÚ POD Àï²éѯ»·¾³±äÁ¿È·ÈÏ£ºAWS_ROLE_ARN£¬AWS_WEB_IDENTITY_TOKEN_FILE¡£Ê¹ÓÃÌØÊâ
IAM ½ÇÉ«£¬ÐèҪͨ¹ý AWS STS »ñÈ¡ÁÙʱƾ֤ºóÔÙ·¢ËÍ AWS ·þÎñÇëÇó¡£×¢ÒâÈçʹÓà JS SDK
V3 ·¢ËÍÇëÇó£¬ÔòÐèʹÓà v3.10 »òÒÔÉϰ汾£¨·ñÔò²»Ö§³Ö»ñȡƾ֤µÄ¹¦ÄÜ£©£¬ÈçÏÂËùʾ£º
// AWS JS SDK
V3»ñȡƾ֤
const { AppConfigClient } = require("@aws-sdk/client-appconfig");
const { getDefaultRoleAssumerWithWebIdentity }
= require("@aws-sdk/client-sts");
const { fromTokenFile } = require("@aws-sdk/credential-provider-web-identity");
const appconfig = new AppConfigClient({ credentials:
fromTokenFile({
roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity()
})
}); |
ʹÓÃÌØÊâ IAM ½ÇÉ«Óöµ½ ExpiredTokenException Ôõô½â¾ö£¿
EC2 ĬÈÏ IAM µÄȨÏÞ³¤ÆÚÓÐЧ£¬ÌØÊâ IAM ½ÇÉ«µÄƾ֤ÊÇÓÐÆÚÏ޵ġ£Èç¹ûÔÚ·þÎñÔËÐÐʱÓöµ½ÁË
ExpiredTokenException£¬ÐèÒªÉóÊÓһϠAWS API Client µÄÉúÃüÖÜÆÚ¡£ÈçÅäÖÃÖÐÐÄÓû§½çÃæ£¬ÎªÃ¿´ÎÇëÇóÖØÐÂÉú³ÉÒ»¸ö
AppConfigClient À´±ÜÃâÆ¾Ö¤¹ýÆÚ¡£
ÅäÖÃÖÐÐÄδÀ´Õ¹Íû
ÅäÖÃÇý¶¯×ÊÔ´ÕýÔÚ³ÉÎªÔÆ¼ÆËãµÄÒ»¸öÖØÒª¼¼ÊõÇ÷ÊÆ£¬¼´ÈÏΪ²»¹âÊÇÓ¦Óýø³Ì£¬ÓëÔÆ¼ÆËãÏà¹ØµÄËùÓÐ×ÊÔ´¶¼¿ÉÒÔͨ¹ýÅäÖÃÈ¥Çý¶¯¡£Õ⽫ÁîÅäÖÃÖÐÐĵÄÔÆ¶Ë֮·³äÂú±ä»¯ºÍÌôÕ½¡£Î´À´ÎÒÃÇÒ²»á¼ÌÐøË¼¿¼ÅäÖÃÖÐÐĵįäËûÓ¦ÓÃģʽ£¬±ÈÈçÈçºÎÔÚÔÆ·þÎñƽ̨ÉÏÓëÆäËû·þÎñÕûºÏ£¬ÈçºÎÈ¥¶ÀÁ¢Ö§³ÅijЩҵÎñ³¡¾°µÈµÈ¡£ |