Top Banner
마이크로 서비스 아키텍처로 개발하기 안재우 Platform ArchitectureSK Planet
46

마이크로서비스 아키텍처로 개발하기

Jul 15, 2015

Download

Software

Jaewoo Ahn
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 마이크로서비스 아키텍처로 개발하기

마이크로서비스아키텍처로개발하기

안재우

Platform Architecture팀

SK Planet

Page 2: 마이크로서비스 아키텍처로 개발하기

About me

• SK 플래닛 Platform Architecture 팀

• 전 NCSOFT 인프라플랫폼팀

• 전닷넷엑스퍼트수석컨설턴트

Page 3: 마이크로서비스 아키텍처로 개발하기

오늘얘기할내용은

• 마이크로서비스아키텍처란?

• 장단점은?

• 무엇이필요하고,어떤점을고려해야하는지?

• 우리는어떻게하고있는지?

Page 4: 마이크로서비스 아키텍처로 개발하기

WAS

전통적인 Web App 아키텍처

Browser/Client

WAR

UI

A Service

A Repository

Database

A

Page 5: 마이크로서비스 아키텍처로 개발하기

WASWAS

이중화/로드밸런싱

Browser/Client

WAR

UI

A Service

A Repository

Database

Loadbalancer A

Page 6: 마이크로서비스 아키텍처로 개발하기

WASWAS

기능추가

Browser/Client

WAR

UI

A Service

A Repository

Database

Loadbalancer AB Service

B Repository

B

Page 7: 마이크로서비스 아키텍처로 개발하기

시스템연계/통합

WASWAS

Browser/Client

WAR

UI

A Service

A Repository

Database

Loadbalancer AB Service

B Repository

B

D System

C System

Page 8: 마이크로서비스 아키텍처로 개발하기

시스템연계/통합

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

Page 9: 마이크로서비스 아키텍처로 개발하기

문제점

• 코드가너무커져서유지보수하기힘들어요.

• 시스템을분리하고싶어요.

• DB를분리하고싶어요.

• 연계시스템이변경된대요.

• 연계시스템이장애나서우리서비스도장애예요.

• 사소한수정인데도전체배포를하고, QA를거쳐야해요.

• 새로운걸추가하는건상관없는데, 기존로직/데이터를변경하면무슨문제가생길지몰라요.

• 저희도새로운버전/기술을써보고싶은데…

Page 10: 마이크로서비스 아키텍처로 개발하기

가면갈수록

• 뭔가바꾸는게두려워진다.

• 개발자들이구닥다리기술의족쇄에서벗어나지못하고,기술격차는계속벌어진다.

• 모든것은 ‘차세대’가해결해야줄것이다.(정말?)

Page 11: 마이크로서비스 아키텍처로 개발하기

나랑상관없는상상속단어들

Domain DrivenDesign

ContinuousDelivery

On-demandVirtualization

Elastic,Scalable,

Resilience

PolyglotProgramming

InfrastructureAutomation

AgileDevelopment

ReusabilitySelf-government

Team

Page 12: 마이크로서비스 아키텍처로 개발하기

마이크로서비스아키텍처의배경

Domain DrivenDesign

ContinuousDelivery

On-demandVirtualization

Elastic,Scalable,

Resilience

PolyglotProgramming

InfrastructureAutomation

AgileDevelopment

ReusabilitySelf-government

Team

Page 13: 마이크로서비스 아키텍처로 개발하기

Scale Cube

http://theartofscalability.com

Page 14: 마이크로서비스 아키텍처로 개발하기

Y축확장

WAS

WAR

UI

A Service

A Repository

Database

AB Service

B Repository

B

Page 15: 마이크로서비스 아키텍처로 개발하기

Y축확장

Database

A

WAS

WAR

UI

A Service

A Repository

WAS

WAR

B Service

B Repository

Database

B

Page 16: 마이크로서비스 아키텍처로 개발하기

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

Page 17: 마이크로서비스 아키텍처로 개발하기

마이크로서비스란?

• 작고(small)

• API로다른서비스와연계하며(communicate with APIs)

• 자율적이며(autonomous)

• 한가지일을잘하는데초점을맞춘서비스(focused on doing one thing well)

Page 18: 마이크로서비스 아키텍처로 개발하기

장점

• Technology Heterogeneity

• Resilience

• Scaling

• Ease of Deployment

• Organizational Alignment

• Composability

• Replaceability

Page 19: 마이크로서비스 아키텍처로 개발하기

단점

• Complexity

• Multiple Database & Transaction Management

• Complicated Test

• Require Automation for Deploy/Operation

• Hard to develop features span multiple services

Page 20: 마이크로서비스 아키텍처로 개발하기

이거 SOA 얘기아니에요?

• 비슷하지만,달라요.

• SOA는개념상으로는잘못되지않았어요.

• 다만방식이잘못되었을뿐이죠.

– SOAP Protocol

– WS-*

– Vendor-Driven

– ESB가모든걸다해결해줄거라는잘못된믿음(그렇게선전했던나쁜 XX)

Page 21: 마이크로서비스 아키텍처로 개발하기

MSA는

• Vendor Driven -> Service Company Driven

• 오픈테크놀로지기반

• SOAP/XML vs. REST/JSON

• ‘스펙먼저’가아닌 ‘현실에서검증된Practice들’의모음

• Agile 개념과의결합

• Cloud 환경의활용

Page 22: 마이크로서비스 아키텍처로 개발하기

마이크로서비스모델링

• Domain Driven Design

• Bounded Context

• Contract-First(API-First) Design

• Decomposed database

• Event-Driven Architecture

Page 23: 마이크로서비스 아키텍처로 개발하기

모델링/구현 Tip

• API를먼저정의하라.• API를 REST API Maturity Level 2 이상이되도록강제화하라.

• API 문서를유지하라(예: Swagger)• ORM을활용하라• DB에너무의존하지마라• 도메인내부에서만의미있는값을외부에노출하는것을지양하라

• 마이크로서비스가별다른설정없이바로기동가능하게하라(예: Java의경우, Spring Boot + Embedded WAS 활용)

Page 24: 마이크로서비스 아키텍처로 개발하기

클라이언트-서비스간통합

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

Page 25: 마이크로서비스 아키텍처로 개발하기

클라이언트-서비스간통합

API Gateway

Client A(Web)

Client B(App)

MS-AMS-A

MS-AMS-B

MS-AMS-C

MS-AMS-D

Security

Logging

Version

Page 26: 마이크로서비스 아키텍처로 개발하기

클라이언트-서비스간통합

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

Page 27: 마이크로서비스 아키텍처로 개발하기

서비스간통신

Service A Service BHTTP Request/Response

Event(Message)

Broker

Publish EventService C

Service D

Subscribe Event

Page 28: 마이크로서비스 아키텍처로 개발하기

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

Page 29: 마이크로서비스 아키텍처로 개발하기

Blue/Green Deployment

http://martinfowler.com/bliki/BlueGreenDeployment.html

Page 30: 마이크로서비스 아키텍처로 개발하기

MSA를선택한이유

Frontend/Backend 분리 회사의 Engineer Tech Tree와동기화

코드양이커지고,중복코드가발생

코드의양을줄여서누구나쉽게파악하도록

팀전체의 Project Working Group별 Product

시스템간연계증대 API 기반의 Contract 관리를강제화

새로운기술에대한도입욕구

Micro-Service 단위로구현에자율성부여(Polyglot)

재사용성향상및지속적인발전

Micro-Service 단위의재사용,자유로운리팩토링

회사인프라의뒷받침On-Premise Cloud, CI와연계된배포자동화(Jarvis), 향후

Docker와같은 Container 기술과연계

Page 31: 마이크로서비스 아키텍처로 개발하기

어떻게개발하나요?

Backend 개발자Frontend 개발자

UserStory 검토

Contract/API 설계

Frontend 개발 Backend 개발

Mock/Unit Test Unit Test

API 연동 Load Test

UserStory 종료

Page 32: 마이크로서비스 아키텍처로 개발하기

Contract/API의설계/공유

Page 33: 마이크로서비스 아키텍처로 개발하기

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

Page 34: 마이크로서비스 아키텍처로 개발하기

진짜 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

Page 35: 마이크로서비스 아키텍처로 개발하기

네, 합니다.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

Page 36: 마이크로서비스 아키텍처로 개발하기

개발환경의문제

• 개발하다보면, 여러개의마이크로서비스들을구동시켜야하는경우가많다.

• 마이크로서비스마다설정/기동방식이상이한경우, 다소괴롭다.

• 구동된마이크로서비스들을위한 API Gateway를빠르게설정하기

• git clone/pull하는것도일이다.

Page 37: 마이크로서비스 아키텍처로 개발하기

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

Page 38: 마이크로서비스 아키텍처로 개발하기

Whitebase

• URL-based Router + Proxy

Authentication

Versioning

Logging

Routing

Composition

Page 39: 마이크로서비스 아키텍처로 개발하기

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

Page 40: 마이크로서비스 아키텍처로 개발하기

MonolithicWeb App

(WAS)Web

변화요약 - Before

MonolithicJava Web App

(WAS)

Browser/Client

“Big”Database(MySQL)

L4L4 Web

FileStorage

A B

C D

UI

Page 41: 마이크로서비스 아키텍처로 개발하기

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

Page 42: 마이크로서비스 아키텍처로 개발하기

변화요약

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

Page 43: 마이크로서비스 아키텍처로 개발하기

MSA로진행하며얻은것

• 팀원들이다루는기술범위가크게확장

• 최신기술의도입/실험에부담이없음

• 팀원간의경험공유활성화

• API 디자인능력향상

• 향후변화/확장에대해서도아키텍처적변화없이대응이가능

• 높은재활용성/조합지원

• 향후사내/대외오픈소스화가가능할듯한솔루션들

Page 44: 마이크로서비스 아키텍처로 개발하기

MSA로진행시의단점

• 초기개발시에는개발시간이많이소요됨

• MSA로원활하게개발하기위한기반구성요소와인프라준비가필요함

• 기존개발방식이편하다고주장하는사람들로부터의저항

• 서비스간연계시협의가필요

• 여러서비스에걸치는기능의경우,주체가애매한경우가생김

Page 45: 마이크로서비스 아키텍처로 개발하기

제언

• 갑자기한번에 MSA로넘어가는것은쉽지않은작업입니다.

• 기존시스템에서분할이가능한항목을하나씩분할해가거나, 신규개발되는기능을하나씩마이크로서비스로분리하여추가해가는것이좋습니다.

• MSA는만능이아니며,조직문화(점진적발전,구성원들의 Skill-up에대한관심과투자)가뒷받침해줘야합니다. 조직문화가선행되지않으면차라리시도하지않는것이좋습니다.

Page 46: 마이크로서비스 아키텍처로 개발하기

질문/피드백

var you = {};

if (you.like||you.dislike||you.suggest||you.request)

{

var id = "jaewoo.ahn";

var domain = "sk.com";

mail.send(String.format("{0}@{1}", id, domain ));

}