±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁË΢·þÎñµÄ¼Ü¹¹¼°Î¢·þÎñµÄÉè¼ÆÄ£Ê½
¡£
±¾ÎÄÀ´×ÔÓÚkubernetesÖÐÎÄÉçÇø £¬ÓÉ»ðÁú¹ûÈí¼þLinda±à¼¡¢ÍƼö¡£ |
|
΢·þÎñÔÚÆóÒµÖпÉÒÔ´øÀ´»ý¼«µÄÓ°Ïì¡£ Òò´Ë£¬ÈçºÎ´¦Àí΢·þÎñÌåϵ¼Ü¹¹£¨MSA£©ºÍһЩ΢·þÎñÉè¼ÆÄ£Ê½ÒÔ¼°Î¢·þÎñÌåϵ¼Ü¹¹µÄÒ»°ãÄ¿±ê»òÔÔòÊǺÜÓбØÒªµÄ¡£
ÒÔÏÂÊÇ΢·þÎñ¼Ü¹¹ÊµÏÖÖÐÒª¿¼ÂǵÄËĸöÄ¿±ê¡£
½µµÍ³É±¾ ¡ª MSA½«½µµÍÉè¼Æ£¬ÊµÊ©ºÍά»¤IT·þÎñµÄÕûÌå³É±¾
Ìá¸ß·¢²¼ËÙ¶È ¡ª MSA½«Ìá¸ßÏîÄ¿´Ó¹¹½¨µ½²¿ÊðµÄËÙ¶È
ÌáÉýµ¯ÐÔ ¡ª MSA½«ÌáÉýÎÒÃÇ·þÎñÍøÂçµÄµ¯ÐÔ
ÓпɼûÐÔ ¡ª MSAΪÄúµÄ·þÎñºÍÍøÂçÉÏÌṩ¸üºÃµÄ¿É¼ûÐÔ¡£
MSAÊǽ¨Á¢ÔÚÄÄЩÔÔò»ù´¡Ö®ÉÏÊÇÐèÒªÄãÈ¥Á˽âµÄ
¿ÉÀ©Õ¹ÐÔ
¿ÉÓÃÐÔ
µ¯ÐÔÀ©Õ¹
Áé»îÐÔ
¶ÀÁ¢ÐÔ£¬×ÔÖ÷ÐÔ
È¥ÖÐÐÄ»¯ÖÎÀí
¹ÊÕϸôÀë
×Ô¶¯ÅäÖÃ
ͨ¹ýDevOps³ÖÐø½»¸¶
ÔÚ¼á³ÖÕâЩÔÔò»ù´¡ÉÏÍÆ¹ã×Ô¼ºµÄ½â¾ö·½°¸»òÕßϵͳ»á´øÀ´Ò»Ð©ÌôÕ½ºÍÎÊÌ⣬ÕâЩÎÊÌâÔÚÐí¶à½â¾ö·½°¸Öж¼ºÜ³£¼û£¬¶øÇÒ¿ÉÒÔͨ¹ýʹÓÃÕýÈ·µÄÉè¼ÆÄ£Ê½À´½â¾ö£¬
ÕâЩ¾ÍÊÇ΢·þÎñµÄÉè¼ÆÄ£Ê½£¬ÕâЩģʽ¿ÉÒÔ·ÖΪÎå¸ö´óÀ࣬¶øÃ¿Ò»ÀàÓÖ°üº¬ÁËÐí¶àÉè¼ÆÄ£Ê½¡£¾ßÌåÈçÏÂͼËùʾ£º

Design Patterns for Microservices
½âñîģʽ(Decomposition Patterns)
°´ÒµÎñÄÜÁ¦½âñî
ͨ¹ýÔËÓõ¥Ò»Ö°ÔðÔÔò£¬Î¢·þÎñ×ÜÊÇ»á°Ñ·þÎñÖ®¼äµÄñîºÏ±äΪËÉñîºÏ£¬Î¢·þÎñͨ¹ýÒµÎñÄÜÁ¦½âñ¶øÇÒ·þÎñµÄ¶¨ÒåÊǶÔÓ¦ÓÚÒµÎñÄÜÁ¦¡£ÒµÎñÄÜÁ¦Õâ¸ö¸ÅÄîÀ´×ÔÓÚÒµÎñ¼Ü¹¹Ä£ÐÍ£¬Ä³Ö̶ֳÈÉÏÀ´Ëµ£¬ÒµÎñȷʵÊÇ¿ÉÒÔ²úÉú¼ÛÖµ£¬ÒµÎñÄÜÁ¦¾³£ÊǶÔÓ¦ÓÚÒ»¸öÒµÎñʵÌå¶ÔÏó¡£ÀýÈ磺
¶©µ¥¹ÜÀí¶ÔÓ¦ÓÚ¶©µ¥
¿Í»§¹ÜÀí¶ÔÓ¦ÓÚ¿Í»§
°´ÕÕ×ÓÓò½âñî
°´ÕÕÒµÎñÄÜÁ¦½âñîÒ»¸öÓ¦ÓÿÉÄÜÊÇÒ»¸öºÃµÄ¿ªÊ¼£¬µ«ÊÇÄã¿ÉÄÜ»áÓöµ½ËùνµÄ¡°ÉñÀࡱ(God Classes),¾ÍÊÇÄÄЩ²»ÈÝÒ×½âñîµÄÀ࣬¶øÇÒÕâЩÀàÔÚ¶à¸ö·þÎñÖ®¼äºÜ³£¼û¡£ÁìÓòÇý¶¯Éè¼Æ(DDD)
²Î¿¼Ó¦ÓÃÎÊÌâ¿Õ¼ä¨CÒµÎñ¨C×öΪһ¸öÓò(domain)¡£Ò»¸öÓòÓɶà¸ö×ÓÓò×é³É£¬¶øÃ¿Ò»¸ö×ÓÓò¶ÔÓ¦ÓÚÒµÎñµÄ²»Í¬µÄ²¿·Ö¡£
×ÓÓò¿ÉÒÔ·ÖÀàÈçÏ£º
ºËÐÄ(Core) ¡ª Çø·ÖÒµÎñµÄ¹Ø¼ü ºÍ Ó¦ÓÃÖÐ×îÓмÛÖµµÄ²¿·Ö
Ö§³Å(Supporting?) ¡ª ÓëÒµÎñÏà¹Ø£¬µ«ÊDz»Êǹؼü²¿·Ö£¬¿ÉÒÔÄÚ²¿ÊµÏÖ£¬Ò²¿ÉÒÔÍⲿʵÏÖ
·º»¯(Generic?) ¡ª ²»Õë¶ÔÌØ¶¨µÄÒµÎñ£¬ÀíÏëÇé¿öÏÂʹÓÃÏֳɵÄÈí¼þʵʩ
¶©µ¥¹ÜÀíµÄ×ÓÓò°üÀ¨£º
²úƷĿ¼·þÎñ
¿â´æ¹ÜÀí·þÎñ
¶©µ¥¹ÜÀí·þÎñ
½»¸¶¹ÜÀí·þÎñ
°´ÊÂÎñ½âñî/Á½½×¶ÎÌá½»£¨2PC£©Ä£Ê½
¿ÉÒÔͨ¹ýÊÂÎñ·Ö½â·þÎñ£¬È»ºóϵͳÖн«»áÓжà¸öÊÂÎñ¡£ ·Ö²¼Ê½ÊÂÎñ´¦ÀíµÄÖØÒª²ÎÓëÕßÖ®Ò»ÊÇÊÂÎñ´¦Àíе÷Æ÷[3]¡£·Ö²¼Ê½ÊÂÎñ°üÀ¨Á½¸ö²½Ö裺
×¼±¸½×¶Î ¡ª Ôڴ˽׶ÎÖУ¬ÊÂÎñµÄËùÓвÎÓëÕß¶¼×¼±¸Ìá½»²¢Í¨ÖªÐµ÷Æ÷ËûÃÇÒÑ×¼±¸ºÃÍê³ÉÊÂÎñ
Ìá½»»òÕ߻عö½×¶Î ¡ª Ôڴ˽׶ÎÖУ¬ÊÂÎñе÷Æ÷ÏòËùÓвÎÓëÕß·¢³öÌá½»»ò»Ø¹öÃüÁî
2PCµÄÎÊÌâÊǺ͵¥¸ö΢·þÎñÖ´ÐÐʱ¼äÀ´¶Ô±ÈºÄʱ³¤¡£¼´Ê¹Î¢·þÎñÔÚÏàͬµÄÍø¶ÎÖУ¬Ðµ÷΢·þÎñÖ®¼äµÄÊÂÎñÒÀ¾É»áÍÏÂýÕû¸öϵͳ¡£Òò´ËÕâ¸ö½â¾ö·½°¸Ò»°ã²»Ê¹ÓÃÔڸ߸ºÔصij¡¾°ÖÐ
¶óɱģʽ
ÒÔÉÏÈýÖÖÉè¼ÆÄ£Ê½ÓÃÓÚ¶Ô먦·¢µÄÓ¦ÓÃ(greenfield apps)µÄ½âñî, µ«ÊÇÎÒÃÇ80%µÄ¹¤×÷¶¼ÊǺÍÅÓ´ó¶ø½©»¯µÄÓ¦ÓÃ(ÒÅÁô´úÂë¿â)´ò½»µÀ¡£¶óɱģʽ(Strangler
Pattern)¾ÍÊÇΪÁ˽â¾öÕâ¸öÎÊÌâ¶øÀ´µÄ¡£ÔÚÏàͬµÄURI¿Õ¼äÖд´½¨Á½¸ö¶ÀÁ¢¹²´æµÄÓ¦Óã¬Ëæ×Åʱ¼äµÄÍÆÒÆ£¬Öع¹¹ýµÄÐÂÓ¦Óý«¡°¶óɱ¡±»òÕßÌæ´úÔÀ´µÄÓ¦Óã¬Ö±µ½×îÖÕ°ÑÅÓ´ó¶ø½©»¯µÄÓ¦Óùرյô¡£¶óɱӦÓã¨Strangler
Application£©µÄ²½Öè·ÖΪת»»£¬¹²´æºÍÏûÃðÈý²½[4]£º
ת»»(Transform?) ¡ª? ÓÃÏÖ´ú·½Ê½´´½¨Ò»¸öÐÂµÄÆ½ÐеÄÕ¾µã
¹²´æ(Coexist?) ¡ª? ½«ÒÑÓеÄÕ¾µãÖØ¶¨Ïòµ½ÐµÄÕ¾µã£¬ÐÂÕ¾µãÖð²½ÊµÏÖÀÏÕ¾µãµÄ¹¦ÄÜ
ÏûÃð(Eliminate?) ¡ª? ÒÆ³ýÒÑÓеÄÕ¾µãµÄ¾ÉµÄ¹¦ÄÜ
¸ô°åģʽ
½«Ó¦ÓóÌÐòµÄÔªËØ¸ôÀëµ½³ØÖУ¬ÒÔ±ãÈç¹ûÆäÖÐÒ»¸öʧ°Ü£¬ÆäËûÓ¦ÓóÌÐò½«¼ÌÐøÔËÐÐÌṩ·þÎñ£¬Õâ¸öÉè¼ÆÄ£Ê½³ÆÎª¸ô°åģʽ(Bulkhead),
ÒòΪËûÀàËÆÓÚ´¬ÌåÖÐÒ»¸ö¸ö±»¸ôÀëµÄ·ÖÇø¡£¸ù¾ÝʹÓÃÕ߸ºÔغͿÉÓÃÐÔÒªÇó£¬ÕâЩ·ÖÇø·þÎñʵÀý±»·Ö¸îµ½²»Í¬µÄ×éÀïÃæ¡£ÕâÖÖÉè¼ÆÄ£Ê½ÓÐÖúÓÚ¸ôÀë¹ÊÕÏ(isolate
failures), ²¢ÔÊÐí¼´Ê¹ÔÚ¹ÊÕÏÆÚ¼äÈÔ¿ÉΪijЩʹÓÃÕßά³Ö·þÎñ¹¦ÄÜ.
±ß³µÄ£Ê½£¨Sidecar Pattern£©
½«Ó¦ÓóÌÐòµÄ×é¼þ²¿Êðµ½µ¥¶ÀµÄÈÝÆ÷ÖÐÒÔÀ´Ìṩ¸ôÀëºÍ·â×°£¬Õâ¸öģʽÔÊÐíÓ¦ÓÿÉÒÔÓɶàÖÖ¶àÑùµÄ×é¼þºÍ¼¼Êõ×éºÏ¶ø³É£¬ÕâÖÖģʽ³ÆÎª±ß³µ(Sidecar
)£¬ ÒòΪÀàËÆÄ¦ÍгµÅÔ±ßËù¸½µÄ±ß³µ¡£ÔÙÕâ¸öģʽÖУ¬sidecar ¸½ÔÚ¸¸Ó¦ÓÃÉÏ£¬²¢ÌṩӦÓõÄÖ§³ÖÌØÕ÷¡£sidecar
ºÍ¸¸Ó¦Óù²ÏíÏàͬµÄÉúÃüÖÜÆÚ£¬Ëæ×Ÿ¸Ó¦Óô´½¨¶ø´´½¨£¬Ïú»Ù¶øÏú»Ù¡£±ß³µÄ£Ê½ÓÐʱ³ÆÎª¡°±ßÌßģʽ(sidekick
pattern)¡±¡£
΢·þÎñµÄ¼¯³Éģʽ (Integration Patterns for Microservices)
APIÍø¹ØÄ£Ê½ (API Gateway Pattern)
µ±°ÑÒ»¸öÓ¦Ó÷ֽâΪ¶à¸öСµÄ΢·þÎñʱ£¬ÓÐһЩÎÊÌâÐèÒªÎÒÃÇ¿¼ÂDz¢´¦Àí£º
²»Í¬µÄ΢·þÎñ²»Í¬µÄͨµÀÉÏÓжà´Îµ÷ÓÃ
ÐèÒª´¦Àí²»Í¬µÄÐÒéÀàÐÍ
²»Í¬µÄÏû·ÑÕß¿ÉÄÜÐèÒª²»Í¬¸ñʽµÄÏìÓ¦
¾ÛºÏģʽ(Aggregator Pattern)
ÔÚ½«ÒµÎñ¹¦ÄÜ·Ö½âΪ¼¸¸ö½ÏСµÄÂß¼´úÂë¶Îʱ£¬ÓбØÒª¿¼ÂÇÈçºÎ¶Ôÿ¸ö·þÎñ·µ»ØµÄÊý¾Ý½øÐÐÐͬ²Ù×÷£¬Ïû·ÑÕß²»¸ºÔð´¦ÀíÕâ¸öÊÂÇé¡£
¾ÛºÏģʽÓÐÖúÓÚ½â¾ö´ËÎÊÌ⣬ËüÌÖÂÛÁËÎÒÃÇÈçºÎ¾ÛºÏÀ´×Ô²»Í¬·þÎñµÄÊý¾Ý£¬È»ºó½«×îÖÕÏìÓ¦·¢Ë͸øÏû·ÑÕß¡£ Õâ¿ÉÒÔͨ¹ýÁ½ÖÖ·½·¨À´Íê³É[6]£º
×éºÏµÄ΢·þÎñ½«µ÷ÓÃËùÓбØÐëµÄ΢·þÎñ£¬×éºÏÊý¾Ý£¬×ª»»Êý¾Ý£¬È»ºó·µ»Ø¸øµ÷ÓÃÕß¡£
APIÍø¹Ø»¹¿ÉÒÔ·Ö·¢ÇëÇóµ½¶à¸ö΢·þÎñÉÏ£¬ÔÙ¾ÛºÏÊý¾Ý£¬È»ºó·¢ËÍÏû·ÑÕß¡£
´úÀíģʽ(Proxy Pattern)
ÎÒÃÇÖ»ÊÇͨ¹ýAPIÍø¹ØÀ´±©Â¶Î¢·þÎñ¡£ ÎÒÃÇÔÊÐí»ñÈ¡APIµÄÌØÕ÷£¬ÀýÈ簲ȫºÍGWÖÐAPIµÄ·ÖÀà¡£ Õâ¸öÀý×ÓÖУ¬APIÍø¹Ø¾ßÓÐÈý¸öAPIÄ£¿é£º
ÒÆ¶¯API ¨C ΪFTGOÒÆ¶¯¿Í»§¶ËʵÏÖAPI
ä¯ÀÀÆ÷API-ʵÏÖä¯ÀÀÆ÷ÖÐÔËÐеÄJavaScriptÓ¦ÓóÌÐòµÄAPI
¹«ÓÃAPI-ΪµÚÈý·½¿ª·¢ÈËԱʵÏÖAPI
Íø¹ØÂ·ÓÉģʽ (Gateway Routing Pattern)
APIÍø¹Ø¸ºÔðÇëÇó·ÓÉ¡£ APIÍø¹ØÍ¨¹ý½«ÇëÇó·Óɵ½ÏàÓ¦µÄ·þÎñÀ´ÊµÏÖһЩAPI²Ù×÷¡£ µ±APIÍø¹Ø½ÓÊÕµ½ÇëÇóʱ£¬Ëü»á²éѯ·ÓÉÓ³É䣬¸Ã·ÓÉÓ³ÉäÖ¸¶¨½«ÇëÇó·Óɵ½µÄ·þÎñ¡£
·ÓÉÓ³ÉäÀýÈç¿ÉÒÔ½«HTTP·½·¨ºÍ·¾¶Ó³Éäµ½·þÎñµÄHTTPµÄURLÉÏ¡£ ´Ë¹¦ÄÜÓëWeb·þÎñÆ÷£¨ÈçNGINX£©ÌṩµÄ·´Ïò´úÀí¹¦ÄÜÏàͬ¡£
΢·þÎñÁ´Ä£Ê½ (Chained Microservice Pattern)
µ¥¸ö·þÎñ»ò΢·þÎñ½«¿ÉÄÜ»áÓжà¸öÒÀÀµ¹ØÏµ£¬ ÀýÈ磺ÏúÊÛ΢·þÎñÒÀÀµ²úƷ΢·þÎñºÍ¶©µ¥Î¢·þÎñ¡£Î¢·þÎñÁ´Ä£Ê½½«¸ù¾ÝÄãµÄÇëÇóÌṩºÏ²¢µÄ½á¹û¡£microservice-1
½ÓÊÕÇëÇó£¬È»ºóºÍmicroservice-2ͨÐÅ£¬²¢ÇÒ¿ÉÄܺÍmicroservice-3ͨÐÅ¡£ ËùÓеÄÕâЩ·þÎñ¶¼ÊÇͬ²½µ÷Óá£
·Ö֧ģʽ£¨Branch Pattern£©
΢·þÎñ¿ÉÄÜÐèÒª´Ó°üÀ¨ÆäËû΢·þÎñÔÚÄڵĶà¸öÀ´Ô´»ñÈ¡Êý¾Ý£¬·Ö֧΢·þÎñģʽÊÇ¾ÛºÏÆ÷ºÍÁ´Éè¼ÆÄ£Ê½µÄ»ìºÏ£¬²¢ÔÊÐíÀ´×ÔÁ½¸ö»ò¶à¸ö΢·þÎñµÄͬʱÇëÇó/ÏìÓ¦´¦Àí¡£µ÷ÓõÄ΢·þÎñ¿ÉÒÔÊÇ΢·þÎñÁ´¡£¸ù¾ÝÄúµÄÒµÎñÐèÇ󣬷Ö֧ģʽ»¹¿ÉÓÃÓÚµ÷Óò»Í¬µÄ΢·þÎñÁ´»òµ¥¸öÁ´¡£
¿Í»§¶ËUI×éºÏģʽ(Client-Side UI Composition Pattern)
µ±Í¨¹ý·Ö½âÒµÎñ¹¦ÄÜ/×ÓÓòÀ´¿ª·¢·þÎñʱ£¬¸ºÔðÓû§ÌåÑéµÄ·þÎñ±ØÐë´Ó¶à¸ö΢·þÎñÖÐÌáÈ¡Êý¾Ý¡£ÔÚµ¥»úÊÀ½çÖУ¬´ÓUIµ½ºó¶Ë·þÎñÖ»ÓÐÒ»´Îµ÷ÓÃÀ´²éѯÊý¾Ý²¢ÇÒË¢ÐÂ/Ìá½»UIÒ³Ãæ¡£²»¹ý£¬ÏÖÔÚ²»Ò»ÑùÁË¡£
ÔÚ΢·þÎñÖУ¬UI±ØÐëÉè¼ÆÎªÆÁÄ»/Ò³ÃæÉϾßÓжà¸ö²¿·Ö/ÇøÓòµÄ¿ò¼Ü¡£Ã¿¸ö²¿·Ö¶¼½«µ÷Óõ¥¶ÀµÄºó¶Ë΢·þÎñÒÔÌáÈ¡Êý¾Ý¡£ÖîÈçAngularJSºÍReactJS
Ö®ÀàµÄ¿ò¼Ü¿ÉÒÔÇáËɵØ×öµ½ÕâÒ»µã£¬ÕâЩÆÁÄ»³ÆÎªµ¥Ò³Ó¦ÓóÌÐò£¨SPA£©¡£Ã¿¸öÍŶӶ¼¿ª·¢Ò»¸ö¿Í»§¶ËUI×é¼þ£¬ÀýÈçAngularJSÖ¸Á¸Ã×é¼þʵÏÖÕë¶Ô¸ÃÒ³Ãæ/ÆÁÄ»ÇøÓòµÄ΢·þÎñµ÷Óá£Ò»¸öUIÍŶӸºÔðʵÏÖÒ³ÃæµÄ¿ò¼Ü£¬Õâ¸ö¿ò¼Üͨ¹ý×éºÏ¶à¸öÌØ¶¨·þÎñUI
(service-specific UI) ×é¼þÀ´¹¹½¨Ò³Ãæ/ÆÁÄ»¡£
Êý¾Ý¿âģʽ(Database Patterns)
Ϊ΢·þÎñ¶¨ÒåÊý¾Ý¿â¼Ü¹¹Ê±£¬ÎÒÃÇÐèÒª¿¼ÂÇÒÔϼ¸µã£º
·þÎñÖ®¼ä±ØÐëÊÇËÉÉ¢ñîºÏµÄ, ËüÃÇ¿ÉÒÔ¶ÀÁ¢¿ª·¢£¬²¿ÊðºÍÀ©Õ¹¡£
ÒµÎñÊÂÎñÔÚ¿çÔ½¶à¸ö΢·þÎñµÄʱºò±£Ö¤²»±ä
һЩҵÎñÊÂÎñ¿çÔ½¶à¸ö΢·þÎñÀ´²éѯÊý¾Ý
ÓÐʱÊý¾Ý¿â±ØÐë¿ÉÒÔ¸´ÖÆ£¬²¢ÇÒ¿ÉÒÔµ¯ÐÔ¹²Ïí
²»Í¬µÄ·þÎñÓв»Í¬µÄÊý¾Ý´æ´¢ÒªÇó
ÿһ¸ö·þÎñ¶ÔÓ¦Ò»¸öÊý¾Ý¿â(Database per Service)
ΪÁ˽â¾öÉÏÊöÎÊÌâ,±ØÐëΪÿ¸ö΢·þÎñÉè¼ÆÒ»¸öÊý¾Ý¿â. ¸ÃÊý¾Ý¿âÖ»ÄÜÊǸ÷þÎñ˽Óе쬲¢ÇÒÖ»ÄÜͨ¹ý΢·þÎñµÄAPI·ÃÎÊ£¬²»Äܱ»ÆäËûµÄ΢·þÎñÖ±½Ó·ÃÎÊ¡£ÀýÈ磬¶Ô¹ØÏµÐÍÊý¾Ý¿â£¬ÎÒÃÇ¿ÉÒÔʹÓÃ
ÿ¸ö·þÎñÓÐ˽Óл¯µÄ±í(private-tables-per-service), ÿ¸ö·þÎñÓÐ×Ô¼ºµÄschema
(schema-per-service), »òÕßÿ¸ö·þÎñÓÐ˽ÓеÄÊý¾Ý¿â·þÎñÆ÷ £¨database-server-per-service£©
ÿһ¸ö·þÎñ¹²ÏíÊý¾Ý¿â (Shared Database per Service)
ÎÒÃÇÒѾÌÖÂÛÁËÿ¸ö·þÎñÒ»¸öÊý¾Ý¿âÊÇ΢·þÎñµÄÀíÏëÑ¡Ôñ£¬µ«ËüÊÇ΢·þÎñµÄ·´Ä£Ê½(anti-pattern)¡£Èç¹ûÒ»¸öµ¥Ò»¶øÓÖÅÓ´óµÄÓ¦Ó㬲¢ÊÔͼ°ÑËü²ð·ÖΪ΢·þÎñ£¬ÄÇôÊý¾Ý¿âµÄ·´·¶Ê½»¯(denormalization
)¾Í²»ÄÇôÈÝÒס£½«Ã¿¸ö΢·þÎñ¹²ÏíÊý¾Ý¿â²»ÊÇÀíÏëµÄÇé¿ö£¬µ«ÊÇÊÇ¿ÉÐеĽâ¾ö·½°¸¡£´ó¶àÊýÈËÈÏΪÕâÊÇ΢·þÎñµÄ·´Ä£Ê½£¬µ«¶ÔÓÚbrownfield
Ó¦Óã¬ÕâÊǽ«Ó¦ÓóÌÐò·Ö½â³É½ÏСÂß¼²¿·ÖµÄÒ»¸öºÜºÃµÄ¿ªÊ¼¡£µ«ÊǶÔÓÚgreenfield Ó¦Óò»Ì«ÊÊÓá£
ÃüÁî²éѯµÄÔðÈηÖÀë (Command Query Responsibility Segregation£¬CQRS)
Ò»µ©ÎÒÃÇʵÏÖÁËÿ¸ö·þÎñ¶ÔÓ¦Ò»¸öÊý¾Ý¿â£¬¾ÍÐèÒª½«´Ó¶à¸ö΢·þÎñ²éѯ·µ»ØµÄÊý¾ÝÁ¬½ÓÆðÀ´¡£ÏÔÈ»ÕâÊDz»¿ÉÄܵġ£CQRS½¨Ò齫ӦÓ÷ÖΪÁ½¸ö²¿·Ö
¡ª ÃüÁî¶Ë (command side)ºÍ²éѯ¶Ë (query side):
ÃüÁî¶Ë´¦Àí´´½¨£¬¸üкÍɾ³ýÇëÇó
²éѯ¶Ëͨ¹ýʹÓÃÎﻯÊÓͼÀ´´¦Àí²éѯ²¿·Ö
ͨ³£ ʼþËÝԴģʽ(event sourcing pattern)ºÍËüÒ»ÆðÓÃÀ´ÎªÈκÎÊý¾Ý¸ü¸Ä´´½¨Ê¼þ¡£Í¨¹ý¶©ÔÄʼþÁ÷£¬¿ÉÒÔʹÎﻯÊÓͼ±£³Ö²»¶ÏµÄ¸üÐÂ
ʼþËÝԴģʽ(event sourcing pattern)
´ó¶àÊýÓ¦ÓóÌÐò¶¼Ê¹ÓÃÊý¾Ý£¬Ò»¸öµäÐ͵Ä;¾¶¾ÍÊÇÓ¦Óñ£³Öµ±Ç°µÄ״̬¡£ÀýÈ磬´«Í³µÄ´´½¨£¬¶ÁÈ¡£¬¸üкÍɾ³ý£¨CRUD£©ÖУ¬µäÐ͵ÄÊý¾Ý´¦ÀíÊÇ´Ó´æ´¢ÖжÁÈ¡Êý¾Ý£¬Ëü°üº¬¾³£Ê¹ÓÃÊÂÎñËø¶¨Êý¾ÝµÄÏÞÖÆ¡£
ʼþËÝԴģʽ¶¨ÒåÁËһϵÁÐʼþÇý¶¯µÄÊý¾ÝµÄ´¦Àí²Ù×÷£¬Ã¿Ò»¸öʼþ´¦Àí²Ù×÷¶¼»á¼Ç¼ÔÚ½ö×·¼Ó´æ´¢ÖÐ(append-only
store)¡£Ó¦ÓóÌÐò´úÂë·¢ËÍһϵÁÐ ÃüÁîʽµÄÃèÊöÁËÊý¾ÝÉÏ·¢ÉúµÄ¶¯×÷µÄʼþµ½Ê¼þ³Ö¾Ã»¯´æ´¢µÄµØ·½¡£Ã¿¸öʼþ´ú±íÒ»×éÊý¾Ý¸ü¸Ä£¨ÀýÈ磬AddedItemToOrder£©
ÕâЩʼþ³Ö¾Ã»¯´æ´¢Ôڳ䵱ϵͳ¼Ç¼ϵͳµÄʼþ´æ´¢ÖС£Ê¼þ´æ´¢ÏµÍ³ÖÐʼþ·¢²¼µÄµäÐÍÓ¦Óó¡¾°ÊÇ£ºÔÚÓ¦ÓÃÖб£³ÖʵÌåµÄÎﻯÊÓͼºÍʼþµÄ¶¯×÷Ò»ÑùÀ´¸Ä±äËûÃÇ£¬ÒÔ¼°¼¯³ÉµÄÍⲿϵͳ¡£ÀýÈçϵͳ¿ÉÒÔά»¤Ò»¸öÕë¶ÔËùÓÐÓû§µÄÎﻯÊÓͼ£¬ÓÃÀ´Ìî³äUI²¿·ÖµÄÊý¾Ý¡£µ±Ó¦ÓóÌÐòÌí¼Óж©µ¥£¬Ìí¼Ó»òɾ³ý¶©µ¥ÉϵÄÏîÄ¿ÒÔ¼°Ìí¼ÓÔËÊäÐÅϢʱ£¬ÕâЩʼþÃèÊöÁËÕâЩÊý¾Ý±ä»¯¿ÉÒÔ±»´¦Àí²¢ÇÒ¿ÉÒÔ¸üе½ÎﻯÊÓͼÉÏ¡£ÏÂÃæÊÇÕâ¸öģʽµÄ×ÝÀÀ£º

ʼþÂÄÀúģʽ(Saga Pattern)
µ±Ã¿Ò»¸ö΢·þÎñ¶¼ÓÐ×Ô¼ºµÄÊý¾Ý¿â£¬²¢ÇÒÒ»¸öÒµÎñÊÂÎñ¿çÔ½¶à¸ö΢·þÎñµÄʱºò£¬ÎÒÃÇÊÇÈçºÎÈ·±£¸÷¸ö·þÎñÖ®¼äµÄÊý¾ÝÒ»ÖÂÐÔ£¿Ã¿¸öÇëÇó¶¼ÓÐÒ»¸ö²¹³¥ÇëÇ󣬸ÃÇëÇó½«ÔÚÇëÇóʧ°ÜʱִÐС£
Ëü¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½ÊµÏÖ£º
Choreography? ¡ª Èç¹ûûÓÐÖÐÑëе÷£¬Ôòÿ¸ö·þÎñ¶¼»á²úÉú²¢ÕìÌýÁíÒ»¸ö·þÎñµÄʼþ£¬²¢¾ö¶¨ÊÇ·ñÓ¦²ÉÈ¡´ëÊ©¡£Choreography?
ÊÇÖ¸¶¨Á½¸ö»òÁ½¸öÒÔÉϲÎÓëÕߵķ½Ê½¡£ ÿһ¸ö²ÎÓëÕß¶¼ÎÞ·¨¿ØÖƶԷ½µÄÁ÷³Ì£¬»òÕßÈÎÒâ¿É¼ûµÄÁ÷³Ì£¬ÕâЩ¿É¼ûµÄÁ÷³Ì¿ÉÒÔе÷ËûÃǵĻºÍÁ÷³ÌÒÔ¹²ÏíÐÅÏ¢ºÍÊýÖµ¡£µ±ÐèÒª¿ç¿ØÖÆ/¿É¼ûÐÔÓò½øÐÐе÷ʱ£¬ÇëʹÓÃchoreography
¡£Äã¿ÉÒÔÔÚ¼òµ¥µÄÇé¿öϽ«±àÅÅÊÓÎªÍøÂçÐÒ飬Ëü¹æ¶¨Á˸÷²ÎÓëÕßÖ®¼ä¿É½ÓÊܵÄÇëÇóºÍÏìӦģʽ¡£

Orchestration?¡ª? Ò»¸öOrchestration?£¨¶ÔÏ󣩸ºÔðSagaµÄ¾ö²ßºÍÒµÎñÂ߼˳Ðò¡£µ±ÄãÒѾ¿ØÖÆÁ÷³ÌÖеÄËùÓвÎÓëÕßʱ£¬µ±ËüÃÇÈ«²¿´¦ÓÚÒ»¸ö¿ØÖÆ·¶Î§ÄÚʱ£¬Äã¿ÉÒÔ¿ØÖƻµÄÁ÷³Ì¡£µ±È»£¬Í¨³£Çé¿öÏ£¬µ±ÄãÖÆ¶¨Ò»¸ö×éÖ¯ÄÚµÄÒµÎñÁ÷³Ìʱ£¬ÄãÒѾ¿ØÖÆÁËËü¡£

¹Û²ìÕßģʽ(Observability Patterns)
ÈÕÖ¾¾ÛºÏ
¿¼ÂÇÕâÑùÒ»ÖÖÇé¿ö£ºÒ»¸öÓ¦Óðüº¬¶à¸ö΢·þÎñʵÀý£¬Ã¿¸öÇëÇó¾³£ÔÚºá¿ç¶à¸ö΢·þÎñʵÀý£¬ÄÇôÿһ¸ö΢·þÎñʵÀý¶¼²úÉúÒ»¸ö±íת»¯¸ñʽµÄÈÕÖ¾Îļþ¡£
Òò´ËÎÒÃÇÐèÒªÒ»¸öÖÐÐÄ»¯µÄÈÕÖ¾·þÎñÀ´½«Ã¿¸ö·þÎñʵÀýµÄÈÕÖ¾ÊÕ¼¯ÆðÀ´¡£Óû§¿ÉÒÔËÑË÷·ÖÎö²¢·ÖÎöÈÕÖ¾£¬²¢ÇÒÅäÖÃһЩµ±ÈÕÖ¾ÖгöÏÖÌØ¶¨ÐÅÏ¢µÄ±¨¾¯¹æÔò¡£ÀýÈ磺PCFȷʵÓÐÒ»¸öÈÕÖ¾¾ÛºÏÆ÷(Log
aggregator), ÓÃÀ´ÊÕ¼¯PCFƽ̨Éϸ÷¸öÓ¦Óõĸ÷¸ö×é¼þ(router, controller,
Diego, µÈµÈ¡)µÄÈÕÖ¾¡£AWS Cloud WatchÒ²ÕâÑù×ö¡£
ÐÔÄÜÖ¸±ê
ÒòΪ΢·þÎñ¼Ü¹¹µ¼Ö·þÎñµÄÊýÁ¿Ôö¼Óʱ£¬ÃÜÇÐ×¢ÒâÊÂÎñ±äµÃÊ®·Ö¹Ø¼ü£¬ÒÔ±ã¼à¿ØÎ¢·þÎñģʽ²¢ÇÒÔÚÎÊÌâ·¢ÉúµÄʱºò·¢³ö¾¯¸æ¡£
Ò»¸öÖ¸±ê·þÎñÓÃÀ´ÊÕ¼¯Ã¿¸öµ¥¶À²Ù×÷µÄͳ¼ÆÐÅÏ¢¡£ËüÓ¦¸Ã¾ÛºÏÒ»¸öÓ¦Ó÷þÎñµÄËùÓÐÖ¸±ê£¬ÒÔ±ãÌṩ±¨¸æºÍ¾¯±¨¡£
¾ÛºÏÖ¸±êÓ¦¸Ã°üº¬Á½¸öÄ£¿é£º
ÍÆËÍ ¡ª ·þÎñÍÆËÍÖ¸±ê¸øÖ¸±ê·þÎñ ÀýÈ磺NewRelic, AppDynamics
ÀÈ¡ ¡ª Ö¸±ê·þÎñ¿ÉÒÔ´Óÿ¸ö·þÎñÖÐÀȡָ±ê ÀýÈ磺Prometheus
·Ö²¼Ê½¸ú×Ù
ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬ÇëÇóͨ³£¿çÔ½¶à¸ö΢·þÎñ¡£ ÿ¸ö·þÎñͨ¹ý¿ç¶à¸ö·þÎñÖ´ÐÐÒ»¸ö»ò¶à¸ö²Ù×÷À´´¦ÀíÒ»¸öÇëÇó¡£
ÔÚ½øÐйÊÕÏÅųýʱ£¬ÓÐÒ»¸ö¸ú×ÙIDÊǷdz£ÖµµÃµÄ£¬ÕâÑùÎÒÃÇ¿ÉÒԶ˶Զ˵ĸú×ÙÇëÇó
½â¾ö·½°¸ÊÇÒýÈëÒ»¸öÊÂÎñID£¬¿ÉÒÔʹÓÃÒÔÏ·½·¨£º
Ϊÿ¸öÍⲿÇëÇó·ÖÅäΨһµÄÍⲿÇëÇóID
½«ÍⲿÇëÇóID´«µÝ¸øËùÓзþÎñ
ÔÚËùÓÐÈÕÖ¾ÏûÏ¢ÖаüÀ¨ÍⲿÇëÇóID
½¡¿µ¼ì²é
ʵʩ΢·þÎñ¼Ü¹¹ºó£¬ÓÐÒ»ÖÖ¿ÉÄÜÊÇ£º·þÎñ¿ÉÄÜ»áÆô¶¯µ«ÎÞ·¨´¦ÀíÊÂÎñ¡£Ã¿¸ö·þÎñ¶¼ÐèÒª¾ßÓÐÒ»¸ö¶ËµãÓÃÀ´¼ì²éÓ¦ÓõĽ¡¿µ³Ì¶È£¬ÀýÈçhealth¡£Õâ¸öAPIÓ¦¸Ã¼ì²éÖ÷»úµÄ״̬,
ÓëÆäËû·þÎñ/»ù´¡½á¹¹µÄÁ¬½ÓÒÔ¼°ÆäËûÈÎÒâÌØ¶¨µÄÂß¼¡£
½»²æ¹Ø×¢Ä£Ê½(Cross-Cutting Concern Patterns)
ÍⲿÅäÖÃ(External Configuration)
Ò»¸öµäÐ͵ķþÎñͨ³£»¹»áµ÷ÓÃÆäËû·þÎñºÍÊý¾Ý¿â£¬¶ÔÓÚÿһ¸ö»·¾³£¬ÀýÈçdev, QA, UAT, prod£¬ÕâЩ»·¾³µÄ¶ËµãURL»òijЩÅäÖÃÊôÐÔ¿ÉÄܲ»Í¬£¬ÕâЩÊôÐÔÖеÄÈκÎÒ»Ïî¸ü¸Ä¶¼¿ÉÄÜÐèÒªÖØÐ¹¹½¨»òÖØÐ²¿Êð·þÎñ¡£
ΪÁ˱ÜÃâ´úÂëÐ޸ģ¬ÎÒÃÇ¿ÉÒÔʹÓÃÅäÖ㬽«ËùÓеÄÅäÖÃÐÅÏ¢¶¼Íⲿ»¯£¬°üÀ¨¶ËµãURLºÍÈÏÖ¤ÐÅÏ¢¡£Ó¦ÓóÌÐòÓ¦¸ÃÔÚÆô¶¯Ê±»òÔËÐÐʱ¼ÓÔØÕâЩÅäÖá£ÕâЩÅäÖÿÉÒÔÔÚÓ¦ÓÃÆô¶¯µÄʱºò·ÃÎʵ½£¬»òÕßÕâЩÅäÖÃÔÚ²»ÐèÒªÖØÆô·þÎñµÄÇé¿öÏ¿ÉÒÔ¸üС£
·þÎñ·¢ÏÖģʽ
µ±Óö¼ûÈçͼËùʾµÄ΢·þÎñ¼Ü¹¹Ê±£¬ÔÚ΢·þÎñµ÷Ó÷½ÃæÎÒÃÇÐèÒª¹Ø×¢Ò»Ð©ÎÊÌâ¡£
ʹÓÃÈÝÆ÷¼¼Êõ£¬IPµØÖ·¿ÉÒÔ¶¯Ì¬·ÖÅä¸øÃ¿¸ö΢·þÎñʵÀý£¬ ÿ´ÎµØÖ·¸ü¸Äʱ£¬Ïû·ÑÕß·þÎñµÄµ÷Óö¼»áÖжϣ¬ÐèÒªÊÖ¶¯¸ü¸Ä²ÅÄָܻ´¡£
Ïû·ÑÕß±ØÐë¼Çסÿ¸ö·þÎñURL£¬²¢Ê¹Æä½ôÃÜñîºÏ¡£
Òò´ËÐèÒª´´½¨·þÎñ×¢²á£¬¸Ã·þÎñ×¢²á½«±£´æÃ¿¸öÉú²úÐÍ·þÎñµÄÔªÊý¾ÝºÍÿ¸ö·þÎñµÄ˵Ã÷¹æ·¶¡£·þÎñʵÀýÔÚÆô¶¯Ê±Ó¦×¢²áµ½×¢²áÖÐÐÄ£¬¶øÔÚʵÀý¹Ø±ÕʱӦעÏú¡£·þÎñ·¢ÏÖÓÐÁ½ÖÖÀàÐÍ£º
¿Í»§¶Ë£¬ÀýÈ磺Netflix Eureka
·þÎñ¶Ë£ºÀýÈ磺 AWS ALB

¶Ï·Æ÷ģʽ
Ò»¸ö·þÎñͨ³£»áµ÷ÓÃÆäËû·þÎñÀ´²éѯÊý¾Ý£¬ÓÐÒ»ÖÖ¿ÉÄÜÐÔÊÇÏÂÓεķþÎñ»á¹Ø±Õ£¬Õ⽫»á´øÀ´Á½¸öÎÊÌ⣺µÚÒ»¸öÊÇ£ºÉÏÓηþÎñ¼ÌÐøÇëÇ󹨱յÄÍøÂç·þÎñ£¬Ö±µ½ºÄ¾¡ÍøÂç×ÊÔ´£¬²¢ÇÒ½µµÍϵͳÐÔÄÜ¡£µÚ¶þ¸öÊÇ£ºÓû§ÌåÑ齫ÊÇÔã¸âµÄÇÒ²»¿ÉÔ¤²âµÄ¡£
Ïû·ÑÕßӦͨ¹ý´úÀíÀ´µ÷ÓÃÔ¶³Ì·þÎñ£¬¸Ã´úÀíµÄÐÐΪÀàËÆÓÚµç·ÖеĶÏ·Æ÷¡£µ±Á¬ÐøµÄÇëÇóʧ°ÜµÄ´ÎÊý³¬¹ýãÐֵʱ£¬¶Ï·Æ÷½«ÌøÕ¢Ò»¶Îʱ¼ä£¬²¢ÇÒÔÚÌøÕ¢µÄÕâ¶Îʱ¼äÄÚ£¬ËùÓеĵ÷ÓÃÔ¶³Ì·þÎñµÄ³¢ÊÔ¶¼½«Á¢¼´Ê§°Ü¡£µ±³¬¹ýÁ˶Ï·Æ÷ÌøÕ¢Ê±¼äÖ®ºó£¬¶Ï·Æ÷½«ÔÊÐíÓÐÏÞÊýÁ¿µÄ²âÊÔÇëÇóͨ¹ý¡£Èç¹ûÕâЩÇëÇó³É¹¦£¬Ôò¶Ï·Æ÷½«»Ö¸´Õý³£²Ù×÷¡£·ñÔò£¬Èç¹ûÓÐÒ»¸öÇëÇóʧ°Ü£¬Ôò¶Ï·Æ÷ÔÙ´ÎÌøÕ¢¡£¶ÔÓÚ
Ò»¸öÓ¦ÓÃÊÔͼ³¢ÊÔµ÷ÓÃÒ»¸öÔ¶³Ì·þÎñ»òÕß»ñÈ¡¹²Ïí×ÊÔ´£¬²¢ÇҸòÙ×÷ºÜÈÝÒ×µÄʧ°ÜµÄÇé¿öÀ´Ëµ£¬ Õâ¸öģʽ·Ç³£ÊÊÓÃ

À¶ÂÌ·¢²¼Ä£Ê½
ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ò»¸öÓ¦ÓóÌÐò¿ÉÒÔ¾ßÓÐÐí¶à΢·þÎñ¡£ Èç¹ûÎÒÃÇÔÚÍ£Ö¹ËùÓзþÎñÖ®ºóÈ»ºó²¿ÊðÔöÇ¿°æ±¾£¬ÔòÍ£»úʱ¼ä½«ÊǾ޴óµÄ£¬²¢ÇÒ¿ÉÄÜÓ°ÏìÒµÎñ¡£Í¬Ñù£¬»Ø¹ö½«ÊÇÒ»³¡Ø¬ÃΡ£À¶ÂÌ·¢²¼Ä£Ê½¿ÉÒÔ±ÜÃâÕâÖÖÇé¿ö¡£
ʵʩÀ¶ÂÌ·¢²¼Ä£Ê½¿ÉÒÔ¼õÉÙ»òÏû³ýÍ£»úʱ¼ä£¬Ëüͨ¹ýÔËÐÐÁ½¸öÏàͬµÄÉú²ú»·¾³£ºBlueºÍGreen£¬À´ÊµÏÖÕâһĿ±ê¡£ÕâÀïÎÒÃǼÙÉèÂÌÉ«ÊÇÒÑ´æÔڵŤ×÷ʵÀý£¬À¶É«ÊǸÃÓ¦ÓóÌÐòµÄа汾¡£ÔÚÈκÎʱºò£¬Ö»ÓÐÒ»¸ö»·¾³´¦Óڻ״̬£¬¸Ã»î¶¯»·¾³ÎªËùÓÐÉú²úÁ÷Á¿Ìṩ·þÎñ¡£
ËùÓÐÔÆÆ½Ì¨¾ùÌṩÓÃÓÚʵʩÀ¶ÂÌÉ«²¿ÊðµÄÑ¡Ïî¡£

|