본문 바로가기

IT Book Summary/스프링 마이크로 서비스 코딩공작소

Chapter 01

스프링, 클라우드와 만나다.

 

자바와 스프링부트, 스프링 클라우드를 이용해 마이크로 서비스를 구축해보면서,

기존의 모놀리식 monolithic 스프링 애플리케이션을 클라우드에 배포가능한 msa 로 쉽게 마이그레이션 할 수 있겠다.


1.1 마이크로 서비스란?

 

기존의 모놀리식 애플리케이션의 단점

단일 소프트웨어 방식으로 배포되었고,

이 애플리케이션이 크고 복잡해지게 되면 여러 팀의 의사소통 비용이 증가하고,

각 팀의 변경사항이 있을시 앱 전체를 다시 빌드하고 테스트해서 배포해야 하는 단점이 있다.

 

마이크로 서비스의 장점

느슨하게 결합된 작은 분산 서비스이며,

관리하기 쉽고 제한된 책임을 담당하는 컴포넌트로 분해할 수 있다.

핵심은 기능을 분해해서 완전히 독립적이어야 한다는 것.

 

MSA 특징

  • 애플리케이션 로직을 각자 책임이 명확한 작은 컴포넌트들로 분해하여 조합해서 솔루션 제공.
  • 각 컴포넌트는 작은 책임을 담당하고 완전히 상호 독립적으로 배포. 여러 앱에서 재사용.
  • 서비스 소비자와 제공자 사이의 데이터 교환을 위해 HTTP, JSON 경량 통신 프로토콜을 사용함.
  • 마이크로서비스 기반의 애플리케이션을 다양한 언어와 기술로 구축할 수 있음.
  • 하나의 책임을 담당하는 독립적인 소규모 팀
  • 높은 유연성과 자율성, 확장성

1.2 스프링은 무엇이고 마이크로 서비스와 어떤 관련이 있을까?

스프링 개발팀은 개발자들이 모놀리식 애플리케이션에서 이탈하는 것을 알아채고,

스프링 부트와 스프링 클라우드 라는 2가지 프로젝트를 시작함.

스프링의 핵심 기능은 수용하며, 엔터프라이즈 기능을 제거하고,

자바기반의 REST(REpresentational State Transfer) 지향 서비스를 제공한다.

 

스프링 클라우드를 사용하면 클라우드에 마이크로 서비스를 운영, 배포할 수 있다.

클라우드 관리용 마이크로서비스 프레임워크를 공통 프레임워크에 포함하고, 애너테이션을 사용하는것처럼 

기술을 쉽게 사용하고 배포할 수 있게 한다.


1.3 책에서 다루는 내용

  • 설계시 고려사항
  • msa 적합하지 않을때
  • 구축방법
  • 핵심작동패턴
  • 클라우드 사용한 작동패턴 구현
  • 배포 파이프라인 구축

1.4 대상 독자

  • 자바 스프링 개발자
  • msa 관심자

1.5 스프링 부트로 마이크로 서비스 구축

 

마이크로서비스에 HTTP GET 요청 

-> 경로 매핑 - HTTP 요청을 파싱, HTTP 동사와 URL, URL에 정의된 매개변수를 기반으로 경로를 매핑

-> 매개변수 분해 - 경로 내부에 정의된 매개변수를 작업을 수행할 자바 메서드에 매핑

-> JSON 자바객체매핑 - HTTP PUT,POST는 body에 전달된 JSON을 자바 클래스에 매핑

-> 비지니스 로직 실행

-> 자바 JSON 객체 매핑 - 비지니스 로직이 실행되면 자바 객체를 JSON을 변환

-> HTTP 상태 코드로 반환


1.6 애플리케이션 구축 방식을 바꾸는 이유

  • 복잡성이 증가했다
  • 고객은 더 빠른 출시를 원한다
  • 성능 및 확장성
  • 고객은 애플리케이션을 항상 사용할 수 있길 기대한다
  • 유연성 flexible
  • 회복성 resilient - 한 부분의 저하로 전체 시스템 장애로 이어지지 않음
  • 확장성 scalable - 전체 확장이 아닌 작은 단위를 확장

1.7 클라우드랑 정확히 무엇인가?

클라우드 기반 컴퓨팅 세가지 모델

  • IaaS (Infrastructure as a Service)
  • PaaS (Platform as a Service)
  • SaaS (Software as a Service)

+

  • FaaS (Functoin as a Service) -  Amazon Lambda 나 Google Cloud Functions을 사용해 만들고 서버리스 코드로 배포
  • CaaS (Container as a Service) - 클라우드 공급자에게 이식 용이한 가상 컨테이너로 빌드 배포.

1.8 왜 클라우드와 마이크로 서비스인가?

서비스를 어디에 배포할 것인가

  • 물리적 서버 - 용량을 빠르게 늘릴수 없고 수평 확장하는데 비용이 많이듬.
  • 가상 머신 이미지 - 서비스를 이미지에 패키징한 후 신석하게 클라우드에 배포 시작 가능.
  • 가상 컨테이너 - 가상머신 이미지 기반의 서비스 배포를 확장한 것.

서버 탄력성을 가지므로 애플리케이션 또한 회복력이 높다.

실습은 모든 마이크로 서비스 관련 인프라스트럭처를 도커 컨테이너를 사용해 IaaS 기반 클라우드 공급자에게 배포할 것이다.

  • 간소화된 인트라스트럭처 관리
  • 엄청난 수평 확장성
  • 지리적 분산을 이용한 높은 중복성

PaaS 기반 클라우드 솔루션을 이요하면 개발이 빠르지만

IaaS 형태의 런타임 엔진에 엮이지 않는 클라우드 개발이 유연성이 좋다.


1.9 마이크로서비스는 코드 작성 이상을 의미

 

고려되어야 할 주제

  • 적정 크기
    마이크로 서비스가 과도한 책임을 맡지않고 적절한 크기로 만드는 것.
  • 위치 투명성
    서비스의 다수 인스턴스가 빨리 시작하고 종료될때 서비스 호출에 대한 물리적 상세정보 관리법
  • 회복성
    장애가 발생한 서비스를 우회하면서 어떻게 애플리케이션이 전반적 무결성을 유지할 것인지.
  • 반복성
    서비스 인스턴스가 시작할 때마다 인스턴스 구성과 코드 베이스를 동일하게 만드는 법.
  • 확장성
    서비스간 의존성을 최소화하고 마이크로 서비스를 원만하게 확장할 수 있는 법.

 

패턴 기반의 접근방법 6가지

1 - 핵심 개발 패턴 core development patterns - 기본 서비스 설계에 대한 주제

서비스 세분성

- 서비스가 담당해야할 적정 책임수준

통신 프로토콜

- 클라이언트와 서비스가 데이터를 교환하는 방법

인터페이스 설계

- 서비스 앤드포인트를 클라이언트에 공개하는 방법

구성관리

- 서비스가 애플리케이션별 구성을 관리해 코드와 구성이 독립적인 개체가 되는 방법

서비스간 이벤트 프로세싱

- 이벤트를 사용해 서비스 간 상태 및 데이터 변경 사항을 통신하는 방법


2 - 라우팅 패턴 routing patterns - 요청을 어떻게 서비스 인스턴스에 전달하는가 

서비스 디스커버리

- 서비스 위치를 어떻게 탐색하는 법, 오작동 인스턴스 제거.

서비스 라우팅

- 모든 서비스의 단일 진입점을 제공하는 방법. 라우팅 제공 법.

 

3 - 클라이언트 회복성 패턴 client resiliency patterns

  • 클라이언트 측 부하 분산 client-side load balancing
    여러 호출이 분산되도록 인스턴스 위치를 캐싱하는 법.
  • 회로 차단기 패턴 circuit breakers pattern
    고장난 서비스를 호출하지 않게 하는 법. 
  • 폴백패턴 fallback pattern
    호출이 실패할때 다른 대체수단을 사용해 서비스가 작업을 수행하는 플러그인 매커니즘
  • 벌크헤드 패턴 bulkhead pattern
    분산 자원을 사용 오작동하는 서비스 호출하나가 나머지 애플리케이션에 부정적 영향을 미치지 않도록 구분하는 법.

 

4 - 보안 패턴 security patterns

  • 인증 
  • 인가
    자격을 수행할 자격
  • 자격 증명 관리와 전파
    OAuth와 JWT

 

5 - 로깅 및 추적 패턴 logging and tracing patterns

  • 로그 상관관계
    단일 트랜젝션에 대해 여러 서비스간 생성된 모든 로그를 연결하는 법.
    고유 식별자 상관관계 아이디 구현.
  • 로그 수집
    개별 인스턴스에서 생성된 모든 로그를 질의 가능한 단일 데이터베이스로 취합하는 방법. 로그검색.
  • 마이크로서비스 추적
    클라이언트 트랜젝션 시각화, 관련된 서비스 특성 이해 방법.

 

6 - 빌드 및 배포 패턴 build and development patterns

빌드 및 파이프라인을 변경해 마이크로 서비스와 서버를 단일 작업 단위로 배포하는 방법

  • 빌드 및 배포 파이프라인
    반복 가능한 원클릭 빌드와 배포
  • 코드형 인프라스트럭처
    코드로 서비스 프로비저닝
  • 불변서버
    이미지를 생성하고 배포 후 변경불가능 하게.
  • 피닉스 서버
    서버 오래 실행시 구성편차를 줄이기 위해 정기적으로 해체 재생성.

 


1.10 스프링 클라우드로 마이크로 서비스 구축

 

1- 스프링 부트

REST 기반 마이크로 서비스 구축

 

2 - 스프링 클라우드 컨피그

중앙집중식 서비스, 깃, 콘설, 유레카 오픈소스 프로젝트와도 통합.

 

3 - 스프링 클라우드 서비스 디스커버리

서버가 배포된 물리적 위히를 추상화. 서비스 인스턴스가 시작하고 종료할 때 등록과 말소 처리

 

4 - 스프링 클라우드 / 넷플릭스 히스트릭스와 리본
히스트릭스 - 회로차단기와 벌크헤드 같은 서비스 클라이언트 패턴을 신속하게 구현.

리본 - 서비스 호출에 대한 클라이언트 측 부하분산기능.

 

5 - 스프링 클라우드 / 넷플릭스 주울

서비스 요청을 대리하는 서비스 게이트웨이

 

6 - 스프링 클라우드 스트림

경량 메세지 프로세싱을 쉽게 통합.

 

7 - 스프링 클라우드 슬루스

애플리케이션 안에서 사용되는 HTTP 호출과 메시지 채널에 고유 추적 식별자를 통합하여 트랜잭션 추적.

 

8 - 스프링 클라우드 시큐리티

토큰기반 인증. JWT, OAuth2

 

9 - 프로비저닝

빌드와 배포 파이프라인. Travis CI, Docker 이용.


1.11 예제로 배우는 스프링 클라우드

 

서비스 디스커버리와 회로차단기, 벌크헤드, 원격 서비스에 대한

클라이언트 측 부하 분산 기능을 Hello World 예제에 통합

 

@SpringBootApplication
@RestController
@RequestMapping(value="hello")
@EnableCircuitBreaker
@EnableEurekaClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @HystrixCommand(threadPoolKey="helloThreadPool")
    public String helloRemoteServiceCall(String firstName, String lastName) {
        ResponseEntity<String> restExchange = restTemplate.exchange(
                                                  "http://logical-service-id/name/[ca]{firstName}/{lastName}",
                                                  HttpMethod.GET,
                                                  null, String.class, firstName, lastName
                                                  );
        return restExchange.getBody();                                          
    }

    @RequestMapping(value="/{firstName}/{lastName}",method = RequestMethod.GET)
    public String hello( @PathVariable("firstName") String firstName,
                         @PathVariable("lastName") String lastName) {
        return helloRemoteServiceCall(firstName, lastName);
    }
}

 

@HystrixCommand 애너테이션은 두가지 작업을 수행

메서드 호출을 히스트릭스가 관리하는 스레드 풀에 위임. 호출이 오래걸리면 개입하고 호출 중단. 회로차단 기법.

히스트릭스가 관리하는 helloThreadPool 스레드풀 만듬.

 

RestTemplate 클래스도 호출하려는 서비스의 논리적 서비스 ID를 전달

 

이렇게 단지 애너테이션 몇개로 마이크로서비스에 많은 기능을 추가 할 수 있음.

 


1.12 예제와 관련성 확인

 

가상의 회사 소트메카닉스에서 도입하려고 하는

새로운 마이크로서비스 아키텍처로 재구축되는 기존 비지니스로직 예제로 스토리를 이어나갈 것이다.

 


1.13 요약

 

  • 마이크로 서비스는 특정 영역을 담당하는 작은 기능 부분.
  • 산업 표준은 없으나 원칙기반의 접근 방식을 취하고 REST 및  JSON 개념과 연동함.
  • 핵심 개발패턴과 라우팅, 클라이언트 회복성, 보안, 로깅, 빌드 및 배포 패턴같은 여러 개발패턴이 있다.
  • 스프링 부트와 스프링 클라우드
  • 몇개의 애너테이션만으로 마이크로 서비스를 신속하게 구축 가능.
  • 스프링 클라우드는 넷플릭스나 하시코프 같은 회사의 오픈소스를 집약함.
    애너테이션을 이용해 설정과 구성을 단순화.