ããã«ã¡ã¯ãHabrã ãã®èšäºã§ã¯ãç°¡åãªæŠå¿µå®èšŒã¢ããªã±ãŒã·ã§ã³ã®äŸã䜿çšããŠãSpring CloudãæäŸããããŒã«ã䜿çšããŠãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãå®è£ ãã詳现ã«ã€ããŠç°¡åã«èª¬æããŸãã
ã³ãŒãã¯githubã§ç¢ºèªã§ããŸãã ç»åã¯ããã¯ã§å
¬éãããåç©åå
šäœã¯1ã€ã®ããŒã ããå§ãŸããŸãã
åºç€ãšããŠãç§ã¯å€ãå¿ãããããããžã§ã¯ããåããŸããããã®ãããžã§ã¯ãã®ããã¯ãšã³ãã¯ã¢ããªã¹ã§ããã ãã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšãããšãå人ã®è²¡æ¿ãæŽçããããšãã§ããŸããéåžžã®åå
¥ãšæ¯åºãè¡ãã貯èãç£èŠããçµ±èšãšäºæž¬ãèªã¿åããŸãã
æ©èœãµãŒãã¹
ã¢ããªã¹ãããã€ãã®äž»èŠãªãã€ã¯ããµãŒãã¹ã«å解ããŠã¿ãŸãããããããããç¹å®ã®ããžãã¹ã¿ã¹ã¯ãæ åœããŸãã
ã¢ã«ãŠã³ããµãŒãã¹
åå ¥ãçµè²»ã貯èãã¢ã«ãŠã³ãèšå®ãç¯çŽããããã®ããžãã¯ãšæ€èšŒãå®è£ ããŠããŸãã
æ¹æ³ | æ¹æ³ | 説æ | ãŠãŒã¶ãŒã¯èš±å¯ãããŠããŸã | UIããå©çšå¯èœ |
---|---|---|---|---|
ã²ãã | /ã¢ã«ãŠã³ã/ {ã¢ã«ãŠã³ã} | æå®ãããã¢ã«ãŠã³ãã®è©³çŽ°ãååŸãã | ||
ã²ãã | /ã¢ã«ãŠã³ã/çŸåš | çŸåšã®ã¢ã«ãŠã³ãã®è©³çŽ°ãååŸãã | à | à |
ã²ãã | /ã¢ã«ãŠã³ã/ã㢠| ãã¢ã¢ã«ãŠã³ãã®è©³çŽ°ãååŸãã | à | |
眮ã | /ã¢ã«ãŠã³ã/çŸåš | çŸåšã®ã¢ã«ãŠã³ãããŒã¿ãä¿åãã | à | à |
æçš¿ | /ã¢ã«ãŠã³ã/ | æ°ããã¢ã«ãŠã³ããç»é²ãã | à |
çµ±èšãµãŒãã¹
ã¢ã«ãŠã³ãã®äž»èŠãªçµ±èšãã©ã¡ãŒã¿ãèšç®ãããã®å€ãåºæ¬é貚ãšæéã«æã¡èŸŒã¿ããã®åŸã®åæã«äŸ¿å©ãªåœ¢åŒã§ããŒã¿ãä¿åããŸãã çµæã®æç³»åã䜿çšããŠãéå»ã®æéã®çµ±èšãšã€ã³ãžã±ãŒã¿ããŠãŒã¶ãŒã«è¡šç€ºããå°æ¥ã®æãåçŽãªäºæž¬ã®å€æ¿ã衚瀺ããŸãã
æ¹æ³ | æ¹æ³ | 説æ | ãŠãŒã¶ãŒã¯èš±å¯ãããŠããŸã | UIããå©çšå¯èœ |
---|---|---|---|---|
ã²ãã | /çµ±èš/ {ã¢ã«ãŠã³ã} | æå®ãããã¢ã«ãŠã³ãã®çµ±èšãååŸãã | ||
ã²ãã | /çµ±èš/çŸåš | çŸåšã®ã¢ã«ãŠã³ãã®çµ±èšãååŸãã | à | à |
ã²ãã | /çµ±èš/ã㢠| ãã¢ã¢ã«ãŠã³ãã®çµ±èšæ å ±ãååŸãã | à | |
眮ã | /çµ±èš/ {ã¢ã«ãŠã³ã} | ã®æ¥ä»ãã€ã³ããäœæ/æŽæ°
æå®ãããã¢ã«ãŠã³ã |
éç¥ãµãŒãã¹
éç¥èšå®ïŒãªãã€ã³ããŒé »åºŠãããã¯ã¢ããé »åºŠïŒãä¿åããŸãã å¿ èŠã«å¿ããŠãæåã®2ã€ã®ãµãŒãã¹ããå¿ èŠãªããŒã¿ãäºåã«åéããã³éçŽããŠãé»åã¡ãŒã«ã¡ãã»ãŒãžãéä¿¡ããããã«ã¹ã±ãžã¥ãŒã«ãããŠããŸãã
æ¹æ³ | æ¹æ³ | 説æ | ãŠãŒã¶ãŒã¯èš±å¯ãããŠããŸã | UIããå©çšå¯èœ |
---|---|---|---|---|
ã²ãã | /éç¥/èšå®/çŸåš | éç¥èšå®ãååŸãã
çŸåšã®ã¢ã«ãŠã³ãçš | à | à |
眮ã | /éç¥/èšå®/çŸåš | éç¥èšå®ãä¿åãã
çŸåšã®ã¢ã«ãŠã³ãçš | à | à |
泚é
- ãã¹ãŠã®ãã€ã¯ããµãŒãã¹ã«ã¯ç¬èªã®ããŒã¿ããŒã¹ãããããããã¹ãŠã®ããŒã¿ã¢ã¯ã»ã¹ã¯ã¢ããªã±ãŒã·ã§ã³APIãä»ããŠã®ã¿ååŸã§ããŸãã
- ãã®ãããžã§ã¯ãã§ã¯ãç°¡åã«ããããã«ãMongoDBã®ã¿ãåãµãŒãã¹ã®ã¡ã€ã³ããŒã¿ããŒã¹ãšããŠäœ¿çšããŸããã å®éã«ã¯ã PolyglotããŒã·ã¹ãã³ã¹ãšåŒã°ããã¢ãããŒãã圹ç«ã€å ŽåããããŸã-ç¹å®ã®ãµãŒãã¹ã®ã¿ã¹ã¯ã«æé©ãªã¹ãã¬ãŒãžãéžæããŸãã
- ãµãŒãã¹éã®éä¿¡ãå€§å¹ ã«ç°¡çŽ åãããŸããåæã®æ®ãã®èŠæ±ã®ã¿ã䜿çšãããŸãã äžè¬çãªæ¹æ³ã¯ãããŸããŸãªå¯Ÿè©±æ¹æ³ãçµã¿åãããããšã§ãã ããšãã°ãæ å ±ã®åæGETèŠæ±ãšãäœæ/æŽæ°æäœã«ãã¥ãŒãµãŒããŒã䜿çšããéåæèŠæ±ã ã¡ãªã¿ã«ãããã¯çµææŽåæ§ã®äžçã«ç§ãã¡ãé£ããŠè¡ããŸã-ç§ãã¡ãäžç·ã«æ®ãããªããã°ãªããªãåæ£ã·ã¹ãã ã®éèŠãªåŽé¢ã®1ã€ã
ã€ã³ãã©ãµãŒãã¹
äžèšã®ãµãŒãã¹ã®ã³ã©ãã¬ãŒã·ã§ã³ã確ä¿ããããã«ãMicroserviceã¢ãŒããã¯ãã£ã®äžé£ã®åºæ¬ãã¿ãŒã³ãšãã©ã¯ãã£ã¹ã䜿çšããŸãã ãããã®å€ãã¯ã Spring Cloudã«å®è£
ãããŠããŸãïŒç¹ã«ã Netflix OSS補åãšã®çµ±åã«ããïŒ-å®éããããã¯Spring Bootã®æ©èœãäœããã®æ¹åã«æ¡åŒµããäŸåé¢ä¿ã§ãã åã³ã³ããŒãã³ãã«ã€ããŠä»¥äžã«ç°¡åã«èª¬æããŸãã
æ§æãµãŒããŒ
Spring Cloud Configã¯ãåæ£ã·ã¹ãã åãã®æ°Žå¹³æ¹åã«ã¹ã±ãŒã©ãã«ãªæ§æãªããžããªã§ãã ããŒã¿ãœãŒã¹ãšããŠãGitãSubversionãããã³ããŒã«ã«ã«ä¿åãããã·ã³ãã«ãªãã¡ã€ã«ãçŸåšãµããŒããããŠããŸãã ããã©ã«ãã§ã¯ãSpring Cloud Configã¯ãSpringèŠæ±ã¢ããªã±ãŒã·ã§ã³ã®ååã«å¯Ÿå¿ãããã¡ã€ã«ãæäŸããŸãïŒãã ããããŒãžã§ã³ç®¡çã·ã¹ãã ã®ç¹å®ã®ãã©ã³ãããç¹å®ã®Springãããã¡ã€ã«ã®ãã¡ã€ã«ãéžæã§ããŸãïŒã
å®éã«ã¯ãããŒãžã§ã³ç®¡çã·ã¹ãã ããæ§æãããŒãããããšãæãéèŠã§ãããããã§ã¯ç°¡åã«ããããã«ããŒã«ã«ãã¡ã€ã«ã䜿çšããŸãã shared
ãã£ã¬ã¯ããªãã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¹ã«é
眮ããŸãããã®ã¯ã©ã¹ã«ã¯ãã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®æ§æãã¡ã€ã«ãæ ŒçŽãããŸãã ããšãã°ãéç¥ãµãŒãã¹ãæ§æãèŠæ±ããå Žåãæ§æãµãŒããŒã¯shared/application.yml
ïŒãã¹ãŠã«å
±éïŒã§æè²ãããshared/notification-service.yml
ãã¡ã€ã«ã®å
容ã§ããã«å¿çããŸãã
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãã¢ããªã±ãŒã·ã§ã³åãšæ§æãµãŒããŒã®ã¢ãã¬ã¹ãæã€bootstrap.yml
ãé€ããæ§æãã¡ã€ã«ã¯äžèŠã«ãªããŸããã
spring: application: name: notification-service cloud: config: uri: http://config:8888 fail-fast: true
Spring Cloud Configã䜿çšãããšãæ§æãåçã«å€æŽã§ããŸãã ããšãã°ã @RefreshScope
ã¢ãããŒã·ã§ã³ã§ããŒã¯ãããEmailService Bean㯠ãåæ§ç¯ããã«é»åã¡ãŒã«ã¡ãã»ãŒãžã®å€æŽãããããã¹ãã®éä¿¡ãéå§ã§ããŸãã
ãããè¡ãã«ã¯ãæ§æãµãŒããŒæ§æãã¡ã€ã«ã«å€æŽãå ããŠããã Notification service
ã«å¯ŸããŠæ¬¡ã®ãªã¯ãšã¹ããå®è¡ããŸãã
`curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh`
GithubãGitlubããŸãã¯BitbucketããWebhookãã»ããã¢ããããããšã«ãããããŒãžã§ã³ç®¡çã·ã¹ãã ããã®æ§æããŠã³ããŒãã䜿çšããŠããã®ããã»ã¹ãèªååã§ããŸãã
泚é
- æ®å¿µãªãããåçãªæ§æã®æŽæ°ã«ã¯å€§ããªå¶éããããŸãã
@RefreshScope
ã¢ãããŒã·ã§ã³ãä»ãããã@Configuration
ã¯ã©ã¹ããã³ã¡ãœããã«å¯ŸããŠ@RefreshScope
ãæ©èœããªã -
bootstrap.yml
èšèŒãããŠããfail-fast
ããããã£ã¯ãConfig Serverãžã®æ¥ç¶ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ãããã«ããŒããåæ¢ããããšãæå³ããŸãã ããã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£å šäœãéå§ããéã«åœ¹ç«ã¡ãŸãã - é«åºŠãªã»ãã¥ãªãã£èšå®ã¯ããã®æŠå¿µã«èããã¢ããªã±ãŒã·ã§ã³ã®ç¯å²ãè¶ ããŠããŸãã Spring Securityã¯ãã»ãã¥ãªãã£ã¡ã«ããºã ãå®è£ ããååãªæ©äŒãæäŸããŸãã JCEããŒã¹ãã¢ã䜿çšããŠæ§æãã¡ã€ã«å ã®ãã€ã¯ããµãŒãã¹ãã¹ã¯ãŒããšæ å ±ãæå·åããæ¹æ³ã«ã€ããŠã¯ãããã¥ã¡ã³ãã§è©³ãã説æããŠããŸã ã
èªèšŒãµãŒããŒ
æ¿èªçŸ©åã¯ãããã¯ãšã³ããªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããã®OAuth2ããŒã¯ã³ãçºè¡ããå¥ã®ã¢ããªã±ãŒã·ã§ã³ã«å®å
šã«è»¢éãããŸãã èªèšŒãµãŒããŒã¯ããŠãŒã¶ãŒèªèšŒãšå¢çå
ã®å®å
šãªéä¿¡ãµãŒãã¹ãµãŒãã¹ã®äž¡æ¹ã«äœ¿çšãããŸãã
å®éãããã§ã¯å¯èœãªã¢ãããŒãã®1ã€ã®ã¿ã説æããŠããŸãã Spring CloudãšSpring Securityã䜿çšãããšãããŒãºã«åãããŠæ§æãæè»ã«æ§æã§ããŸãïŒããšãã°ãã²ãŒããŠã§ã€APIã®åŽã§æ¿èªããã€ã³ãã©ã¹ãã©ã¯ãã£ã«æ¢ã«å
¥åãããŠãããŠãŒã¶ãŒããŒã¿ã§èŠæ±ã転éããã®ãçã«ããªã£ãŠããŸãïŒã
ãã®ãããžã§ã¯ãã§ã¯ã Password credential
ä»äžã¿ã€ãã䜿çšããŠãŠãŒã¶ãŒãèªèšŒãã Client credentials
ä»äžã¿ã€ãã䜿çšããŠãµãŒãã¹éã§èªèšŒããŸãã
Spring Cloud Securityã¯äŸ¿å©ãªæ³šéãšèªåæ§æãæäŸãããããã¯ã©ã€ã¢ã³ãåŽãšèªå¯ãµãŒããŒåŽã®äž¡æ¹ã§èª¬æãããæ©èœãç°¡åã«å®è£
ã§ããŸãã
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãããã¯åŸæ¥ã®ã»ãã·ã§ã³èªèšŒãšå€ãããŸããã ãªã¯ãšã¹ãããã Principal
ãªããžã§ã¯ããååŸãã @PreAuthorize
ã¢ãããŒã·ã§ã³ã䜿çšããŠããŒã«ããã®ä»ã®ãã©ã¡ãŒã¿ãŒã確èªã§ããŸãã
ããã«ãåOAuth2ã¢ããªã±ãŒã·ã§ã³ã«ã¯scope
ãããscope
ãããã¯ãšã³ããµãŒãã¹- server
ããã©ãŠã¶-uiã ãã®ãããå€éšããäžéšã®ãšã³ããã€ã³ããžã®ã¢ã¯ã»ã¹ãå¶éã§ããŸãã
@PreAuthorize("#oauth2.hasScope('server')") @RequestMapping(value = "accounts/{name}", method = RequestMethod.GET) public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) { return statisticsService.findByAccountName(name); }
API Gateway
äžèšã§èª¬æãã3ã€ã®äž»èŠãªãµãŒãã¹ã¯ãã¹ãŠãå€éšãŠãŒã¶ãŒã«APIãæäŸããŸãã Microserviceã¢ãŒããã¯ãã£äžã«æ§ç¯ãããç£æ¥ã·ã¹ãã ã§ã¯ãã³ã³ããŒãã³ãã®æ°ãæ¥éã«å¢å ããŠããŸã- 圌ã㯠ãAmazonã§ã¯çŽ150ã®ãµãŒãã¹ãããŒãžã¬ã³ããªã³ã°ã«é¢äžããŠãããšèšã£ãŠããŸãã
ä»®æ³çã«ãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯åãµãŒãã¹ãåå¥ã«èŠæ±ã§ããŸãã ãããããã®ã¢ãããŒãã«ã¯ããã«å€ãã®å¶éããããŸããåãšã³ããã€ã³ãã®ã¢ãã¬ã¹ãç¥ãå¿
èŠããããåæ
å ±ãåå¥ã«èŠæ±ããçµæãåå¥ã«ããŒãžããŸãã ããã«ããã¹ãŠã®éããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ãWeb察å¿ãããã³ã«ãªã©ããµããŒãã§ããããã§ã¯ãããŸããã
ãã®çš®ã®åé¡ã解決ããããã«ãåäžã®ãšã³ããªãã€ã³ãã§ããAPI Gatewayã䜿çšãããŸãã å€éšèŠæ±ãåä¿¡ããå
éšã€ã³ãã©ã¹ãã©ã¯ãã£ã®å¿
èŠãªãµãŒãã¹ã«ã«ãŒãã£ã³ã°ããéçã³ã³ãã³ããèªèšŒãã¹ãã¬ã¹ãã¹ããã«ããªã¢å±éããµãŒãã¹ç§»è¡ãåçãã©ãã£ââãã¯ç®¡çãè¿ãããã«äœ¿çšãããŸãã Netflixã«ã¯ãããŸããŸãªãã€ã¯ããµãŒãã¹ããã®ã³ã³ãã³ãã®éåæéçŽã«ããAPIã®æé©åã«é¢ããããã°æçš¿ããããŸãã
Netflixã¯ãAPI Gateway- Zuulã®å®è£
ãè£åããŸããã Spring Cloudã¯ãã€ãã£ãã«çµ±åãããŠãããSpring Bootã¢ããªã±ãŒã·ã§ã³ã«1ã€ã®äŸåé¢ä¿ãš@EnableZuulProxy
ã¢ãããŒã·ã§ã³ãè¿œå ããããšã§æå¹ã«ãªããŸãã ãã®ãããžã§ã¯ãã§ã¯ãZuulãæãåºæ¬çãªã¿ã¹ã¯ïŒéçïŒWebã¢ããªã±ãŒã·ã§ã³ïŒãè¿ãããªã¯ãšã¹ããã«ãŒãã£ã³ã°ããïŒã«äœ¿çšãããŸãã
éç¥ãµãŒãã¹ã®ãã¬ãã£ãã¯ã¹ã«ãŒãã£ã³ã°ã®äŸïŒ
zuul: routes: notification-service: path: /notifications/** serviceId: notification-service stripPrefix: false
ããã§ãuriã/notifications
å§ãŸããã¹ãŠã®ãªã¯ãšã¹ããã察å¿ãããµãŒãã¹ã«éä¿¡ãããŸãã
ãµãŒãã¹çºèŠ
åæ£ã·ã¹ãã ã®å¥ã®åºãç¥ãããŠãããã¿ãŒã³ã ãµãŒãã¹æ€åºã«ããã䜿çšå¯èœãªã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ã®ãããã¯ãŒã¯ã¢ãã¬ã¹ãèªåçã«æ±ºå®ã§ããŸããããã¯ãã¹ã±ãŒãªã³ã°ãã¯ã©ãã·ã¥ãæŽæ°ã«ããåçã«å€åããå¯èœæ§ããããŸãã
ããã§ã®äž»èŠãªãªã³ã¯ã¯ã¬ãžã¹ããªãµãŒãã¹ã§ãã ãã®ãããžã§ã¯ãã§ã¯ãNetflix Eurekaã䜿çšããŸãïŒãã ããConsulãZookeeperãEtcdãªã©ããããŸãïŒã Eurekaã¯ãã¯ã©ã€ã¢ã³ãåŽã®æ€åºãã¿ãŒã³ã®äŸã§ããã€ãŸããã¯ã©ã€ã¢ã³ãã¯ã䜿çšå¯èœãªã€ã³ã¹ã¿ã³ã¹ã®ã¢ãã¬ã¹ãèŠæ±ããããããåå¥ã«ãã©ã³ã¹ãããå¿
èŠããããŸãã
Spring Bootã¢ããªã±ãŒã·ã§ã³ãã¬ãžã¹ããªãµãŒããŒã«ããã«ã¯ã spring-cloud-starter-eureka-server
ãš@EnableEurekaServer
ã¢ãããŒã·ã§ã³ãžã®äŸåé¢ä¿ãè¿œå ããã ãã§ãã ã¯ã©ã€ã¢ã³ãåŽã§ã spring-cloud-starter-eureka
ã @EnableDiscoveryClient
ã¢ãããŒã·ã§ã³@EnableDiscoveryClient
ããã³bootstrap.yml
ã¢ããªã±ãŒã·ã§ã³åïŒserviceIdïŒïŒ
spring: application: name: notification-service
ããã§ãèµ·åæã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãEurekaã«ç»é²ãããã¡ã¿ããŒã¿ïŒãã¹ããããŒããªã©ïŒãæäŸãããŸãã Eurekaã¯ããŒãããŒãã¡ãã»ãŒãžãåä¿¡ããèšå®ãããæéå
ã«ã¡ãã»ãŒãžãååšããªãå Žåãã€ã³ã¹ã¿ã³ã¹ã¯ã¬ãžã¹ããªããåé€ãããŸãã ããã«ãEurekaã¯ãç»é²ãããã¢ããªã±ãŒã·ã§ã³ãšã€ã³ã¹ã¿ã³ã¹ã®æ°ããã³ãã®ä»ã®æè¡æ
å ±ã衚瀺ããããã·ã¥ããŒããæäŸããŸãhttp://localhost:8761
ã¯ã©ã€ã¢ã³ããã©ã³ãµãŒããã¥ãŒãºãããã³HTTPã¯ã©ã€ã¢ã³ã
次ã®ããŒã«ããããNetflixã§éçºãããSpring Cloudã«ãã€ãã£ãã«çµ±åãããŠããŸãã ãããã¯ãã¹ãŠé£æºããŠåäœããå€éšã®äžçãŸãã¯å
éšã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãšéä¿¡ããå¿
èŠããããã€ã¯ããµãŒãã¹ã§äœ¿çšãããŸãã
ãªãã³
ãªãã³ã¯ã¯ã©ã€ã¢ã³ãåŽã®ãã©ã³ãµãŒã§ãã åŸæ¥ã®ãã®ãšæ¯èŒãããšãããã§ã¯èŠæ±ã¯ç®çã®ã¢ãã¬ã¹ã«çŽæ¥éä¿¡ããããããåŒã³åºãäžã«äœåãªããŒããåé€ãããŸãã ããã«äœ¿çšã§ããã€ã³ã¹ã¿ã³ã¹ã¯ããµãŒãã¹ãã£ã¹ã«ããªã¡ã«ããºã ãšçµ±åãããŠãããå©çšå¯èœãªã€ã³ã¹ã¿ã³ã¹ã®åçãªãªã¹ããæäŸããŠãã€ã³ã¹ã¿ã³ã¹éã®ãã©ã³ã¹ãåããŸãã
ãã¹ããªãã¯
Hystrixã¯ã ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã®å®è£
ã§ããããããã¯ãŒã¯çµç±ã§é話ãè¡ãéã®é
延ãšãšã©ãŒãå¶åŸ¡ãããã¥ãŒãºã§ãã åºæ¬çãªèãæ¹ã¯ãå€æ°ã®ã³ã³ããŒãã³ãã§æ§æãããåæ£ã·ã¹ãã ã§ã®ã«ã¹ã±ãŒãé害ãåæ¢ããããšã§ãã ããã«ããããã³ã°ãããµãŒãã¹ãèŠæ±ããïŒå埩ãããïŒéã«é
延ããããšãªããã§ããã ãæ©ããšã©ãŒãäžããããšãã§ããŸãã
éåè·¯ã®å¶åŸ¡ã«å ããŠãHystrixã§ã¯ã倱æããåŒã³åºããè¡ããããšãã«åŒã³åºããããã©ãŒã«ããã¯ã¡ãœãããå®çŸ©ã§ããŸãã ãããã£ãŠãããã©ã«ãã®åçããšã©ãŒã¡ãã»ãŒãžãªã©ãæå®ã§ããŸãã
Hystrixã¯ãã¯ãšãªããšã«äžé£ã®ã¡ããªãã¯ïŒé床ãçµæãªã©ïŒãçæããŸããããã«ãããã·ã¹ãã ã®å
šäœçãªç¶æ
ãåæã§ããŸãã 以äžã§ã¯ããããã®ã¡ããªãã¯ã«åºã¥ããç£èŠãæ€èšããŸãã
åœç©
Feignã¯ããªãã³ããã³Hystrixãšãã€ãã£ãã«çµ±åãããã·ã³ãã«ã§æè»ãªhttpã¯ã©ã€ã¢ã³ãã§ãã ç°¡åã«èšãã°spring-cloud-starter-feign
æã¡ã @EnableFeignClients
ã¢ãããŒã·ã§ã³ã§ã¯ã©ã€ã¢ã³ããã¢ã¯ãã£ãåãããšããã©ã³ãµãŒããã¥ãŒãºãã¯ã©ã€ã¢ã³ãã®å®å
šãªã»ãããåŸããã劥åœãªããã©ã«ãæ§æã§ã®æŠãã®æºåãæŽããŸãã
ã¢ã«ãŠã³ããµãŒãã¹ã®äŸã次ã«ç€ºããŸãã
@FeignClient(name = "statistics-service") public interface StatisticsServiceClient { @RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) void updateStatistics(@PathVariable("accountName") String accountName, Account account); }
- ããªããããå¿ èŠãããã®ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã宣èšããããšã ãã§ã
- éåžžã©ããããµãŒãã¹ã®ååãæå®ããã ãã§ãïŒService Discoveryã¡ã«ããºã ã®ãããã§ãïŒãããã¡ããä»»æã®URLã«ã¢ã¯ã»ã¹ããããšãã§ããŸã
-
@RequestMapping
ãšã³ã³ãã³ãã¯ãSpring MVCã®@FeignClient
ãš@Controller
ã«çµ±äžããããŸãŸã«ããããšãã§ããŸãã
ããã·ã¥ããŒã
Hystrixã«ãã£ãŠçæãããã¡ããªãã¯ã¯ãã¯ã©ã¹ã«spring-boot-starter-actuator
äŸåé¢ä¿ãå«ããããšã§æäŸã§ããŸãã ä»ã®èå³æ·±ããã®ã®äžã§ãç¹å¥ãªãšã³ããã€ã³ããå
¬éãããŸã- /hystrix.stream
ã ãã®ã¹ããªãŒã ã¯ãHystrixããã·ã¥ããŒãã䜿çšããŠèŠèŠåã§ããŸããããã«ã€ããŠã¯ãåŸã§è©³ãã説æããŸãã Hystrixããã·ã¥ããŒããæå¹ã«ããã«ã¯ã spring-cloud-starter-hystrix-dashboard
@EnableHystrixDashboard
ãš@EnableHystrixDashboard
ã¢ãããŒã·ã§ã³ãå¿
èŠã§ãã Hystrixããã·ã¥ããŒããä»»æã®ãã€ã¯ããµãŒãã¹ã®ã¹ããªãŒã ã«å¯ŸããŠèšå®ããŠããã®ç¹å®ã®ãµãŒãã¹ã§çºçããŠããããšã®ã©ã€ãç»åã芳å¯ã§ããŸãã
ãã ãããã®å Žåãããã€ãã®ãµãŒãã¹ãããããããã®ãã¹ãŠã®ã¡ããªãã¯ã1ãæã§ç¢ºèªã§ãããšäŸ¿å©ã§ãã ããã«ã¯ç¹å¥ãªè§£æ±ºçããããŸãã åãµãŒãã¹ã¯ãã®ã¹ããªãŒã ãAMQPãããŒã«ãŒïŒRabbitMQïŒã«ããã·ã¥ããããããã¹ããªãŒã ã¢ã°ãªã²ãŒã¿ãŒã®Turbineãå€æããŠãHystrixããã·ã¥ããŒãã®åäžã®ãšã³ããã€ã³ããå
¬éããŸãã
è² è·æã®ã·ã¹ãã ã®åäœãèæ
®ããŠãã ãããã¢ã«ãŠã³ããµãŒãã¹ã¯çµ±èšãµãŒãã¹ãåŒã³åºããããŸããŸãªã·ãã¥ã¬ãŒã·ã§ã³é
延ã§å¿çããŸãã èŠæ±æéã®ãããå€ã¯1ç§ã«èšå®ãããŸãã
0
| 500
| 800
| 1100
|
ã·ã¹ãã ã¯ãšã©ãŒãªãã§åäœããŸãã ã¹ã«ãŒãããã¯çŽ22ç§/ç§ã§ãã çµ±èšãµãŒãã¹ã®å°æ°ã®ã¢ã¯ãã£ãã¹ã¬ããã å¹³åå¿çæé-
50ããªç§ | ã¢ã¯ãã£ããªã¹ã¬ããã®æ°ã¯å¢å ããŠããŸãã 玫è²ã®æ°åã¯æåŠããããªã¯ãšã¹ãã®æ°ã瀺ãããããããšã©ãŒã®çŽ30ã40ïŒ ã§ãããåç·ã¯ãŸã éããŠããŸãã | åéç¶æ ïŒãšã©ãŒã®å²åã50ïŒ ãè¶ ãããšããã¥ãŒãºãåè·¯ãéããŸãã äžå®ã®ã¿ã€ã ã¢ãŠãåŸãåç·ã¯éããããŸãããåã³çããªããŸãã | ãšã©ãŒã®ãããªã¯ãšã¹ãã®100ïŒ ã åç·ã¯åžžã«éããŠãããã¿ã€ã ã¢ãŠãåŸã«ãªã¯ãšã¹ããã¹ãããããããšããŠãäœãå€æŽãããŸãããåã ã®ãªã¯ãšã¹ãã¯é ãããŸãã |
ãã°åæ
å€æ°ã®å¯åéšåïŒãããããè€æ°ã®ã³ããŒãæã€ããšãã§ããïŒã§æ§æãããã€ã³ãã©ã¹ãã©ã¯ãã£ã§ã¯ããã°ã®éäžåéãåŠçãåæã®ã·ã¹ãã ã䜿çšããããšãéåžžã«éèŠã§ãã ElasticsearchãLogstashãããã³Kibanaã¯ããã®ãããªåé¡ãå¹æçã«è§£æ±ºã§ããã¹ã¿ãã¯ãæ§æããŸãã
åºè·æºåãæŽã£ãELK Dockerèšå®ã¯ããã¥ã¬ãŒã¿ãŒãšé
éæ¥è
çšã®ãã³ãã¬ãŒããšãšãã«githubã§å©çšã§ããŸã ã ãã°ããããã¯ãŒã¯ã¢ã¯ãã£ããã£ã®åæãããã³ãµãŒããŒããã©ãŒãã³ã¹ã®ç£èŠã®ããã«ãçŸåšã®ãããžã§ã¯ãã§æ¬çªç°å¢ã§æ£åžžã«æ©èœããã®ã¯ãããããªã«ã¹ã¿ãã€ãºãšã¹ã±ãŒãªã³ã°ãåãããã®æ§æã§ãã
åãªãäŸãšããŠãElasticã®å
¬åŒWebãµã€ãããã®åç
ã€ã³ãã©ã¹ãã©ã¯ãã£ã®èªåå
å€æ°ã®å¯åéšåãšçžäºæ¥ç¶æ§ãåãããã€ã¯ããµãŒãã¹ã·ã¹ãã ã®å±éã¯ãã¢ããªã·ãã¯ã¢ããªã±ãŒã·ã§ã³ã®å±éãããæããã«è€éãªã¿ã¹ã¯ã§ãã èªååãããã€ã³ãã©ã¹ãã©ã¯ãã£ããªããã°ãã¹ããŒãªãŒå
šäœãç¡éã®çã¿ãšæéã®ç¡é§ã«å€ãããŸãã ããã¯å®å
šã«ç¬ç«ããäŒè©±ã®ãããã¯ã§ããç¡æããŒãžã§ã³ã®ãµãŒãã¹ã§ãã®ãããžã§ã¯ãã«å®è£
ãããŠããæãåçŽãªç¶ç¶çé
ä¿¡ã¯ãŒã¯ãããŒã®ã¿ã瀺ããŸãã
æåŸã®æ®µéã¯æ¯figçã§ããããããžã§ã¯ãã®çç£ã¯æ³å®ãããŠããŸããã
ãªããžããªã®ã«ãŒãã«ã¯ãCIãµãŒããŒã®æ瀺ãå«ã.travis.ymlãã¡ã€ã«ããããŸã-ãã«ããæåããåŸã®åŠçã ãã®æ§æã§ã¯ãGithubã§ã®ããã·ã¥ãæåãããã³ã«ãTravis CIãdockerã€ã¡ãŒãžãåéããŠã¿ã°ä»ãããDocker Hubã«ããã·ã¥ããŸãã ããã§ã latest
ã¿ã°ã§ããŒã¯ãããå±éã®æºåãã§ããã³ã³ãããšãå€ãããŒãžã§ã³ãä»»æã®ãã©ã³ãã®ããŒãžã§ã³ã®ã³ã³ãããåžžã«ããããšãããããŸããã
æã¡äžã
ãã®å ŽæãŸã§èªãã ããšããããªããèªåã§ãã¹ãŠãå§ããã®ã¯é¢çœããããããŸããã ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ã8ã€ã®Spring Bootã¢ããªã±ãŒã·ã§ã³ã4ã€ã®MongoDBã€ã³ã¹ã¿ã³ã¹ãããã³1ã€ã®RabbitMQã§æ§æãããŠããŸãã ã·ã¹ãã ã§3ã4 GBã®ã¡ã¢ãªã䜿çšå¯èœã§ããããšã確èªããŠãã ããã çµ±èšãµãŒãã¹ãéç¥ãµãŒãã¹ãç£èŠã®æŸæ£ãªã©ãæãå¿
èŠãªæ©èœã«èªåèªèº«ãå¶éããããšãããã€ã§ãéå§ã§ããŸãã
å§ããåã«
- Dockerããã³Docker Composeãã€ã³ã¹ããŒã«ãã
- ç°å¢å€æ°ã®ãšã¯ã¹ããŒãïŒ
CONFIG_SERVICE_PASSWORD
ãNOTIFICATION_SERVICE_PASSWORD
ãSTATISTICS_SERVICE_PASSWORD
ãACCOUNT_SERVICE_PASSWORD
ãMONGODB_PASSWORD
çç£ã¢ãŒã
ãã®ã¢ãŒãã§ã¯ãäºåã«çµã¿ç«ãŠããããã¹ãŠã®ã€ã¡ãŒãžãäžå€®ãªããžããªïŒãã®å Žåã¯DockerããïŒããããŠã³ããŒããããããŒãã¯GatewayãService DiscoveryãMonitoringãããã³RabbitMQ管çAPIã®ã¿ã®dockerã®å€éšã«è»¢éãããŸãã å¿
èŠãªã®ã¯ãdocker-composeãã¡ã€ã«ãšdocker-compose up -d
ã§ãã
version: '2' services: rabbitmq: image: rabbitmq:3-management restart: always ports: - 15672:15672 logging: options: max-size: "10m" max-file: "10" config: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD image: sqshq/piggymetrics-config restart: always logging: options: max-size: "10m" max-file: "10" registry: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD image: sqshq/piggymetrics-registry restart: always ports: - 8761:8761 logging: options: max-size: "10m" max-file: "10" gateway: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD image: sqshq/piggymetrics-gateway restart: always ports: - 80:4000 logging: options: max-size: "10m" max-file: "10" auth-service: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD NOTIFICATION_SERVICE_PASSWORD: $NOTIFICATION_SERVICE_PASSWORD STATISTICS_SERVICE_PASSWORD: $STATISTICS_SERVICE_PASSWORD ACCOUNT_SERVICE_PASSWORD: $ACCOUNT_SERVICE_PASSWORD MONGODB_PASSWORD: $MONGODB_PASSWORD image: sqshq/piggymetrics-auth-service restart: always logging: options: max-size: "10m" max-file: "10" auth-mongodb: environment: MONGODB_PASSWORD: $MONGODB_PASSWORD image: sqshq/piggymetrics-mongodb restart: always logging: options: max-size: "10m" max-file: "10" account-service: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD ACCOUNT_SERVICE_PASSWORD: $ACCOUNT_SERVICE_PASSWORD MONGODB_PASSWORD: $MONGODB_PASSWORD image: sqshq/piggymetrics-account-service restart: always logging: options: max-size: "10m" max-file: "10" account-mongodb: environment: INIT_DUMP: account-service-dump.js MONGODB_PASSWORD: $MONGODB_PASSWORD image: sqshq/piggymetrics-mongodb restart: always logging: options: max-size: "10m" max-file: "10" statistics-service: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD MONGODB_PASSWORD: $MONGODB_PASSWORD STATISTICS_SERVICE_PASSWORD: $STATISTICS_SERVICE_PASSWORD image: sqshq/piggymetrics-statistics-service restart: always logging: options: max-size: "10m" max-file: "10" statistics-mongodb: environment: MONGODB_PASSWORD: $MONGODB_PASSWORD image: sqshq/piggymetrics-mongodb restart: always logging: options: max-size: "10m" max-file: "10" notification-service: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD MONGODB_PASSWORD: $MONGODB_PASSWORD NOTIFICATION_SERVICE_PASSWORD: $NOTIFICATION_SERVICE_PASSWORD image: sqshq/piggymetrics-notification-service restart: always logging: options: max-size: "10m" max-file: "10" notification-mongodb: image: sqshq/piggymetrics-mongodb restart: always environment: MONGODB_PASSWORD: $MONGODB_PASSWORD logging: options: max-size: "10m" max-file: "10" monitoring: environment: CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD image: sqshq/piggymetrics-monitoring restart: always ports: - 9000:8080 - 8989:8989 logging: options: max-size: "10m" max-file: "10"
éçºã¢ãŒã
éçºã¢ãŒãã§ã¯ããªããžããªããã€ã¡ãŒãžãååŸããã®ã§ã¯ãªããã€ã¡ãŒãžããã«ãããããšã«ãªã£ãŠããŸãã ãã¹ãŠã®ã³ã³ããã¯ã䟿å©ãªãããã°ã®ããã«å€åãã«ãªã£ãŠããŸãã ãã®æ§æã¯äžèšãç¶æ¿ãããããã®ãã€ã³ããäžæžãããã³æ¡åŒµããŸãã ã³ãã³ãdocker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
version: '2' services: rabbitmq: ports: - 5672:5672 config: build: config ports: - 8888:8888 registry: build: registry gateway: build: gateway auth-service: build: auth-service ports: - 5000:5000 auth-mongodb: build: mongodb ports: - 25000:27017 account-service: build: account-service ports: - 6000:6000 account-mongodb: build: mongodb ports: - 26000:27017 statistics-service: build: statistics-service ports: - 7000:7000 statistics-mongodb: build: mongodb ports: - 27000:27017 notification-service: build: notification-service ports: - 8000:8000 notification-mongodb: build: mongodb ports: - 28000:27017 monitoring: build: monitoring
泚é
ãã®ãããžã§ã¯ãã®ãã¹ãŠã®Spring Bootã¢ããªã±ãŒã·ã§ã³ãèµ·åããã«ã¯ãã¢ã¯ã»ã¹å¯èœãªæ§æãµãŒããŒãå¿
èŠã§ãã åã¢ããªã±ãŒã·ã§ã³ã®bootstrap.yml
fail-fast
ãªãã·ã§ã³ãšãDockerã®restartïŒalwaysãªãã·ã§ã³ã®ãããã§ãã³ã³ããã¯åæã«èµ·åã§ããŸãïŒãããã¯ãConfig Serverãèµ·åãããŸã§èªåçã«è©Šè¡ãéå§ããŸãïŒã
ãŸãããµãŒãã¹ãã£ã¹ã«ããªãéå§ããã«ã¯æéãããããŸãã ãã®ãµãŒãã¹ã¯ã圌èªèº«ããŠãŒã¬ã«ãšã¯ã©ã€ã¢ã³ããããŒã«ã«ã«åãã¡ã¿æ
å ±ãæããªãéããåŒã³åºãã«å©çšã§ããŸãããããã«ã¯3ã€ã®ããŒãããããå¿
èŠã§ãã ããŒãããŒãéã®ããã©ã«ãã®æéã¯30ç§ã§ãã
é¢é£ãªã³ã¯
- ããŒãã£ã³ã»ãã¡ãŠã©ãŒã®ãã€ã¯ããµãŒãã¹ã«é¢ããèšäº
- Sam Newman Building Microservices-ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®ãã¹ãŠã®åºæ¬æŠå¿µã詳现ã«æ±ã£ãæ¬
- MicroservicesãšSOAã®éãã説æãããã³ãã¬ããå šäœ
- CloudFoundryã®åµèšè ã§ãããã³ãªãã£ãŒããœã³ãNGINXããã°ã®äžé£ã®ãã€ã¯ããµãŒãã¹èšäº
- Kirill Tolkachev tolkkvãšAlpha Laboratoryã®Alexander Tarasov aatarasoffã«ããéåžžã«ã¯ãŒã«ã§è©³çŽ°ãªã¬ããŒãã2 éšã«åããŠããŸãã ãã€ã¯ããµãŒãã¹ãSpring BootãSpring CloudãNetflix OSSããŒã«ãApache Thriftãªã©ã«ã€ããŠã