마이크로서비스 아키텍처로 개발하기
TRANSCRIPT
WASWAS
기능추가
Browser/Client
WAR
UI
A Service
A Repository
Database
Loadbalancer AB Service
B Repository
B
시스템연계/통합
WASWAS
Browser/Client
WAR
UI
A Service
A Repository
Database
Loadbalancer AB Service
B Repository
B
D System
C System
시스템연계/통합
WASWAS
Browser/Client
WAR
UI
A Service
A Repository
Database
Loadbalancer AB Service
B Repository
B
E System D System
F SystemC System
G System
문제점
• 코드가너무커져서유지보수하기힘들어요.
• 시스템을분리하고싶어요.
• DB를분리하고싶어요.
• 연계시스템이변경된대요.
• 연계시스템이장애나서우리서비스도장애예요.
• 사소한수정인데도전체배포를하고, QA를거쳐야해요.
• 새로운걸추가하는건상관없는데, 기존로직/데이터를변경하면무슨문제가생길지몰라요.
• 저희도새로운버전/기술을써보고싶은데…
나랑상관없는상상속단어들
Domain DrivenDesign
ContinuousDelivery
On-demandVirtualization
Elastic,Scalable,
Resilience
PolyglotProgramming
InfrastructureAutomation
AgileDevelopment
ReusabilitySelf-government
Team
마이크로서비스아키텍처의배경
Domain DrivenDesign
ContinuousDelivery
On-demandVirtualization
Elastic,Scalable,
Resilience
PolyglotProgramming
InfrastructureAutomation
AgileDevelopment
ReusabilitySelf-government
Team
Database
WASWAS
WAS
B UI
A UI
Y축확장 + X축/Z축확장
Database
A
WAS
WAR
A UI
A Service
A Repository
WAR
B Service
B Repository
Database
B1
B UI
Database
B2
마이크로서비스란?
• 작고(small)
• API로다른서비스와연계하며(communicate with APIs)
• 자율적이며(autonomous)
• 한가지일을잘하는데초점을맞춘서비스(focused on doing one thing well)
장점
• Technology Heterogeneity
• Resilience
• Scaling
• Ease of Deployment
• Organizational Alignment
• Composability
• Replaceability
단점
• Complexity
• Multiple Database & Transaction Management
• Complicated Test
• Require Automation for Deploy/Operation
• Hard to develop features span multiple services
이거 SOA 얘기아니에요?
• 비슷하지만,달라요.
• SOA는개념상으로는잘못되지않았어요.
• 다만방식이잘못되었을뿐이죠.
– SOAP Protocol
– WS-*
– Vendor-Driven
– ESB가모든걸다해결해줄거라는잘못된믿음(그렇게선전했던나쁜 XX)
MSA는
• Vendor Driven -> Service Company Driven
• 오픈테크놀로지기반
• SOAP/XML vs. REST/JSON
• ‘스펙먼저’가아닌 ‘현실에서검증된Practice들’의모음
• Agile 개념과의결합
• Cloud 환경의활용
마이크로서비스모델링
• Domain Driven Design
• Bounded Context
• Contract-First(API-First) Design
• Decomposed database
• Event-Driven Architecture
모델링/구현 Tip
• API를먼저정의하라.• API를 REST API Maturity Level 2 이상이되도록강제화하라.
• API 문서를유지하라(예: Swagger)• ORM을활용하라• DB에너무의존하지마라• 도메인내부에서만의미있는값을외부에노출하는것을지양하라
• 마이크로서비스가별다른설정없이바로기동가능하게하라(예: Java의경우, Spring Boot + Embedded WAS 활용)
클라이언트-서비스간통합
Client A(Web)
Client B(App)
MS-AMS-ALB
MS-AMS-BLB
MS-AMS-CLB
MS-AMS-DLB
Security
Logging
Version
…
Security
Logging
Version
…
Security
Logging
Version
…
Security
Logging
Version
…
클라이언트-서비스간통합
API Gateway
Client A(Web)
Client B(App)
MS-AMS-A
MS-AMS-B
MS-AMS-C
MS-AMS-D
Security
Logging
Version
…
클라이언트-서비스간통합
API GatewayClient A(Web)
Client B(App)
MS-AMS-A
MS-AMS-B
MS-AMS-C
MS-AMS-D
Security
Logging
Version
…
API Gateway
Security
Logging
Version
…
LBAPI Gateway
Security
Logging
Version
…
API Gateway
Security
Logging
Version
…
LB
서비스간통신
Service A Service BHTTP Request/Response
Event(Message)
Broker
Publish EventService C
Service D
Subscribe Event
Service Discovery
Client/API Gateway
MS-AMS-ALB
MS-AMS-BLB
Security
Logging
Version
…
Security
Logging
Version
…
Client/API Gateway
MS-AMS-A
HA Proxy
MS-AMS-B
HA Proxy
Security
Logging
Version
…
Security
Logging
Version
…Service Registry
Blue/Green Deployment
http://martinfowler.com/bliki/BlueGreenDeployment.html
MSA를선택한이유
Frontend/Backend 분리 회사의 Engineer Tech Tree와동기화
코드양이커지고,중복코드가발생
코드의양을줄여서누구나쉽게파악하도록
팀전체의 Project Working Group별 Product
시스템간연계증대 API 기반의 Contract 관리를강제화
새로운기술에대한도입욕구
Micro-Service 단위로구현에자율성부여(Polyglot)
재사용성향상및지속적인발전
Micro-Service 단위의재사용,자유로운리팩토링
회사인프라의뒷받침On-Premise Cloud, CI와연계된배포자동화(Jarvis), 향후
Docker와같은 Container 기술과연계
어떻게개발하나요?
Backend 개발자Frontend 개발자
UserStory 검토
Contract/API 설계
Frontend 개발 Backend 개발
Mock/Unit Test Unit Test
API 연동 Load Test
UserStory 종료
Contract/API의설계/공유
API Workspace
Product
APIAPI
Product
dev
draft
release
Design APIs
Publish/Change APIsAPI Provider
API Consumer (stakeholder)
API Consumer (public)
Review / Share draft spec
Explore & Test APIs
진짜 Polyglot을하나요?
Java 1.6
Tomcat 6
Spring 3.x + XML Conf.
Spring MVC
MyBatis
Maven
기존시스템들의 Backend
Web Application
Presentation
Controller
Business
Data Access
JSP
Sitemesh
JQuery
기존시스템들의 Frontend
MySQL
네, 합니다.Java 1.7 / Tomcat 7
Spring 4.x + Java Conf.
Spring Data JPA
Java 1.8 / Embedded Tomcat
Spring Boot
Spring Data JPA
Node.js
Express
MySQL
Redis
RabbitMQ
Groovy
Go
ASP.NET 5
Vert.x
Others…
PlanetSpace(File Storage)
Frontend
HTML
CSS
Angular.js
Bootstrap
Less
Grunt
Bower
Karma
향후실험(?)후보들 Other…
ZooKeeper
개발환경의문제
• 개발하다보면, 여러개의마이크로서비스들을구동시켜야하는경우가많다.
• 마이크로서비스마다설정/기동방식이상이한경우, 다소괴롭다.
• 구동된마이크로서비스들을위한 API Gateway를빠르게설정하기
• git clone/pull하는것도일이다.
Whitebase
Developer’s Machine
Whitebase
jar/js(file system)
MS-AInstance
git
jar/js(file system)
MS-BInstance
Artifactrepository
jar/js(file system)
MS-CInstance
Local docker
MS-DInstance
DockerImage
Registry
remote docker
MS-EInstance
HA Proxy HA Proxy
clone
wget
remote machine
MS-FInstance
MS-A Container
Whitebase + Service Discovery + Inter-Service Call
Whitebase
UI
UI
MS-A
HA Proxy
HA Proxy
HA Proxy
ServiceRegistry
Service Agent
MS-A Container
MS-A HA Proxy
Service Agent
MS-B Container
MS-B
Service Agent
MS-B Container
MS-B
Service Agent
MonolithicWeb App
(WAS)Web
변화요약 - Before
MonolithicJava Web App
(WAS)
Browser/Client
“Big”Database(MySQL)
L4L4 Web
FileStorage
A B
C D
UI
MS-A
MS-B
MS-C
MS-D
Whitebase
A UI
B UI
C UI
D UI
ContentRouter
변화요약 - After
Browser/Client
L4L4ContentRouter
A UI
B UI
C UI
D UI
API Gateway
(Whitebase)
MS-A(Java)
DB(MySQL)
MS-B(Nodejs)
MS-C(Nodejs)
MS-D(Java)
DB(MySQL)
Redis(MySQL)
FileStorage
DB(MySQL)
ServiceRegistry
Event BrokerConfigService
변화요약
Before Now or soon Future
Architecture MonolithicDB공유형통합
Micro-Services, VM 기반Loosely-Coupled (API/Event)
Container 기반가상화Self-Healing
Application 1 Web App 9 UIs14 Services
더욱세분화
Data 1 MySQL 10 MySQL2 Redis
1 ZooKeeper
Maria DBPostgreSQL
또다른 NoSQL
Tech Stack Java 1.6/Tomcat 6Spring 3.xMyBatisMySQL
Java 1.7/1.8, Embedded TomcatSpring 4.x/Spring Boot
Spring Data JPAMySQLNode.js
RedisRabbitMQ
다른 Java Framework다른언어/플랫폼
기타 OnDemandSVN/Git
CI (Jenkins)수동배포
Scrum/Sprint 기반Git with Feature Branch Model
CI (Jenkins)Jarvis를사용한자동배포
Docker 인프라연계Blue/Green DeploymentContinuous Deployment
A/B Testing
MSA로진행하며얻은것
• 팀원들이다루는기술범위가크게확장
• 최신기술의도입/실험에부담이없음
• 팀원간의경험공유활성화
• API 디자인능력향상
• 향후변화/확장에대해서도아키텍처적변화없이대응이가능
• 높은재활용성/조합지원
• 향후사내/대외오픈소스화가가능할듯한솔루션들
MSA로진행시의단점
• 초기개발시에는개발시간이많이소요됨
• MSA로원활하게개발하기위한기반구성요소와인프라준비가필요함
• 기존개발방식이편하다고주장하는사람들로부터의저항
• 서비스간연계시협의가필요
• 여러서비스에걸치는기능의경우,주체가애매한경우가생김
제언
• 갑자기한번에 MSA로넘어가는것은쉽지않은작업입니다.
• 기존시스템에서분할이가능한항목을하나씩분할해가거나, 신규개발되는기능을하나씩마이크로서비스로분리하여추가해가는것이좋습니다.
• MSA는만능이아니며,조직문화(점진적발전,구성원들의 Skill-up에대한관심과투자)가뒷받침해줘야합니다. 조직문화가선행되지않으면차라리시도하지않는것이좋습니다.