본문 바로가기

MicroService

Spring Cloud Overview + 적용기

 스프링 클라우드를 적용하기 전에 느낀점

 이번 달에 Spring Boot를 기반으로 Microservice 개발 Sprint가 끝났다. 기능 개발이 완료되고, 우리는 Spring Cloud를 적용하기러 하였다. 개발은 보통 필요에 의해 시작이 된다. 하지만, 아직 현재 작은 단위의 서비스와 작은 유저 수를 보유하고 있기 때문에 관리 차원에서도 불편함을 겪지 않고 있어 Spring Cloud가 왜 필요한지 모르겠다. ( 필자의 무지도 포함하여 ) 




 스프링 클라우드가 뭘 도와주는데?

 

  이름만 살펴보면 클라우드에 기반한 개발 스타일 적용을 쉽게할 수 있도록 해준다. 그렇다면, 클라우드에 기반한 개발 스타일이 무엇일까?

확장성(scable)을 가지고, 클라우드 플랫폼에 쉽게 배포할 수 있으며, 지속적인 배포가 가능하도록 만든 것이다. 이를 Software as a service(SaaS)라 한다 위 개발에는 The Tweleve-Factor APP이란 방법론이라는 것이 있다.


Tweleve-Factor App이란?

  1. 코드베이스 ( Codebase )
    앱 : 코드 = 1:1이여야 한다. 너무 당연한 일이라 딱히 와닿지않는다.

  2. 의존관계 ( dependencies )
    패키지 매니저 툴 ( gradle, maven ) 을 이용하여 명시적으로 표기하고 격리
    컨테이너화 되어 있는 경우 Dockerfile을 이용하여 어느 platform에서도 설치할 수 있다.

  3. 설정 ( config )
    애플리케이션 구동 시에 설정 정보들이 주입될 수 있도록 해야 한다. ( 이것도 사실 당연한 부분이다ㅎㅎ )

  4. 지원 서비스 ( backing services )
    백엔드 서비스는 애플리케이션 정상 동작 중 네트워크를 통해 이용하는 모든 서비스이다. 예를 들어, 데이터 저장소 ( MySql ), 메시지 큐잉 시스템 ( RabbitMQ ), 메일을 보내기 위한 SMTP 서비스 ( Postfix ), 캐시 시스템 ( Memcached ) 등이 있다.

    로컬 서비스와 서드파티 서비스를 구별하지 않는다. 애플리케이션 입장에서는 양 쪽 모두 연결된 리소스이며, 설정에 있는 url을 사용해서 접근 된다. 즉, 코드를 수정하기 않고 설정 정보에 따라 전환이 될 수 있어야 한다.



  5. 빌드, 릴리즈, 실행 ( Build, release, run )
    어플리케이션은 빌드, 릴리스, 실행 단계를 엄격하게 분리하여 빌드와 배포, 실행 지속적으로 가능하도록 해야 한다.

  6. 프로세스 ( Processes )

  • Scale up이 툴, 아키텍처, 개발에 영향을 끼치지 않고 가능해야 한다.
  • Dev와 Prod환경의 차이를 최소화해서, 지속적인 배포(CD)가 빠르게 되어야 한다.
  • OS에 의존하지 않으므로써, 최대한 실행환경간 이식성(portability)을 최대화 해야 한다.
  • 설정 자동화를 위해 선언적인 형식을 사용함으로써, 새로운 개발자가 시간 투자할 필요 없도록 한다.
  • 클라우드 플랫폼에 구축하기 적합하여, 서버와 시스템 관리자의 필요성을 없앤다.

이 방법론은 어떤 프로그래밍 언어로 개발되든, 백앤드 서비스(데이터베이스, 메모리 캐시 등)이 어떠한 것을 사용하든 적용할 수 있다고 한다. 위에 정리된 내용이 가능하도록 해주는 12가지 요소를 살펴보자. ( TODO )


 Netflix OSS

Netflix는 마이크로서비스의 선두 주자이다. 그들의 성공한 아키텍처에 들어간 개념들은 오픈 소스 라이브러리로 제공해주었다. 그것이 Spring Cloud에 적용 되었고 Eureka, Ribbon, Zuul과 같은 것들이다. 

Service discovery with Eureka

첫번째로 살펴볼 것은 Spring Cloud Netflix에서 service discovery 역할을 제공해주는 Eureka이다. 이 패키지는 client와 server로 나뉜다.



Eureka Client인 경우에는 'spring-cloud-starter-eureka'를 등록해주어야 한다. Client는 항상 discovery server에 서비스를 등록할 책임이 있는데, 이 역할을 해주는 클래스가 해당 패키지에 있다. ( EurekaRegistration ) 

Eureka Server인 경우에는 'spring-cloud-starter-eureka-server' 패키지를 포함하면 된다. 

Routing with Zuul

다음으로 살펴볼 것은  Zuul을 이용한 라우팅 기능이다. JVM 기반 라우터이며 서버사이드 로드 밸런서이다. 그리고 몇가지 필터를 등록을 할 수 있다. 그래서 인증이나 load shedding, static response handling과 같은 것들을 할 수 있다. 

'spring-cloud-starter-zuul' 패키지를 포함하면 된다. 

마이크로서비스에서는 모든 시스템의 entry point가 되는 API Gateway역할을 하는 것이 Zuul이다. 각각 마이크로서비스 요청 주소는 Eureka Server에서 받아오면 된다. 



기타 유용한 라이브러리들 1 - Security

Spring Security 에서 가능했던 OAuth2, JWT, 기본적인 인증들을 Cloud에서도 사용할 수 있도록 해준다. 'spring-cloud-starter-security' 라이브러리를 포함하면 된다. Spring Cloud Security에서 기본적으로 Spring Security 기능을 포함하고, 거기다가 Cloud에서 사용한 API Gateway에 인증 과정을 넣기 편하도록 해준다. 

기타 유용한 라이브러리들 2 - Automated Testing

마이크로서비스 아키텍처에서 연결 테스트는 더욱 더 중요해지고 있다. 마틴파울러 왈

" integration contract test란 외부 서비스가 해당 서비스를 잘 호출하는지 테스트 해보는 것이다."

라고 하였다. Spring Cloud는 해당 방식을 위한 테스트가 꼭 필요하다. 

'spring-cloud-starter-task'라는 라이브러리를 포함하면 된다. Spring Cloud Task가 short lived microservices를 만들수 있도록 도와준다.