반응형

1. 서론

이번 포스팅에서는 스프링 마이크로서비스 코딩 공작소의 1장인 스프링, 클라우드와 만나다 에 대해 알아보도록 하겠습니다.

 

2. 마이크로 서비스란?

마이크로서비스 개념이 발전하기 전, 대부분의 프로젝트들은 모놀리식 아키텍처 형태였습니다.

 

모놀리식의 단점으로는 크고 복잡해질수록 프로젝트를 담당하는 각 팀의 의사소통과 조정 비용이 증가한다는 점이 있습니다.

 

이 단점을, 극복하기 위해 마이크로서비스라는 아키텍처 개념이 나왔고, 특징은 아래와 같습니다.

마이크로서비스는 느슨히 결합된 작은 분산 서비스라고 이해하시면 좋습니다.

 

  1. 어플리케이션 로직을 각자 작은 컴포넌트들로 분해하고 이들을 조합하여 사용
  2. 각 컴포넌트는 작은 책임 영역을 담당하고 완전히 상호 독립적으로 배포되며, 재사용이 가능.
  3. 각 컴포넌트간의 데이터 교환을 위해 HTTP와 JSON 같은 경량 통신 프로토콜을 사용.
  4. 마이크로서비스 기반의 어플리케이션을 다양한 언어와 기술로 구축 가능
  5. 명확히 정의된 책임 영역을 담당하는 조직 운영 가능

 

위 특징들로 인해 어플리케이션은 높은 확장성과 회복성을 얻을 수 있습니다.

 

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

스프링은 자바 객체간의 의존성 관리를 제공하는 프레임워크입니다.

 

스프링은 현재도 꾸준히 활발한 커뮤니티와 발전이 되고 있으며, 모놀리식에서 마이크로서비스라는 변화에도 맞춰

아래 2개의 프로젝트를 제공합니다.

 

  • 스프링 부트
  • 스프링 클라우드

 

이번 포스팅 책은 프로젝트를 마이크로서비스로 만들때, 위 스프링 부트와 스프링 클라우드를 기반으로 만드는 것을 소개합니다.

 

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

위에서 말씀드린것과 같이 스프링 부트와 스프링 클라우드를 기반으로 만들기 때문에 간단히 스프링 부트기반의 간단한 프로젝트를 예제로 살펴보겠습니다.

각자 ide를 통해 spring boot 프로젝트 생성까지 가능하다고 생각하고 진행하겠습니다.

 

예제는 간단하게 http 요청을 받아 문자열 응답을 주는 예제입니다.

 

먼저, spring boot 프로젝트를 생성하셨다면, 'org.springframework.boot:spring-boot-starter-web' 의존성을 추가합니다.

gradle 이라면 build,gradle 파일에 dependencies에 implementation 'org.springframework.boot:spring-boot-starter-web' 를 추가합니다.

 

아래와 같은 자바 클래스를 하나 만듭니다.

간단히, hello/{firstName}/{lastNam} URI로 엔드포인트를 하나 만들어 반환하는 어플리케이션입니다.

 

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

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

    @RequestMapping(value = "/{firstName}/{lastName}", method = RequestMethod.GET)
    public String hello(@PathVariable("firstName") String firstName, @PathVariable("lastName") String lastName) {
        return String.format("{\"message\":\"Hello %s %s\"}", firstName, lastName);
    }
}

 

  • @SpringBootApplication 은 스프링 부트 서비스의 진입점인 클래스에 지정합니다.
  • @RestController 는 엔드포인트를 만드는 클래스에 지정합니다.
  • @RequestMapping 은 http 요청 uri를 해당 클래스로 매핑하는 역할을 합니다.
  • @PathVariable 은 URL에 전달된 매개변수를 자바 타입으로 매핑해주는 역할을 합니다.

 

위 main을 수행하게되면, 8080 포트로 spring-boot-starter-web이 가지고 있는 내장 톰캣이 구동됩니다.

 

확인을 위해 browser를 열어 아래와 같이 URL을 입력하면 올바르게 응답이 오는것을 확인할 수 있습니다.

 

 

 

 

 

 

 

반응형

 

 

 

 

 

 

 

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

요즈음 어플리케이션을 바라보는 방식이 아래 현상에 영향을 받고 있습니다.

 

  • 복잡성 증가: 어플리케이션은 여러 서비스와 데이터베이스 뿐만이 아닌 외부 서비스와도 통신이 필요합니다.
  • 고객은 더 빠른 출시를 원함
  • 성능 및 확장성 : 어플리케이션은 처리해야할 양에 따라 확장성있게 증가 및 감소해야합니다.
  • 고객은 어플리케이션을 항상 사용할 수 있길 기대: 어플리케이션은 항상 사용이 가능해야 하기 때문에 회복성이 높아야합니다.

 

위 현상으로 인해, 어플리케이션을 마이크로서비스로 구축 시 아래와 같은 장점을 취할 수 있습니다.

 

  1. 유연성 : 코드 단위가 작아져 변경에 대해서 복잡성이 낮아집니다.
  2. 회복성 : 여러 어플리케이션으로 운용되기 때문에 하나의 에러가 전체 어플리케이션에 영향이 가지 않습니다.
  3. 확장성 : 서비스들이 작아져 확장하기에 용이합니다.

 

때문에, 잘 만든 마이크로서비스 어플리케이션은 아래와 같이 정의할 수 있습니다.

 

마이크로 서비스는 확장가능하고 회복적이며 유연한 어플리케이션

 

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

 

마이크로서비스 기반 아키텍처는 각 서비스를 독립된 개별 산출물로 패키징하고 배포함을 의미합니다.

 

때문에, 어플리케이션은 경량화되며 서로 독립적이고 이러한 장점을 극대화하기에는 클라우드와 찰떡궁합입니다.

 

왜냐하면, 클라우드를 통해 어플리케이션의 확장성이 용이해지고

경량화 된 어플리케이션이기 때문에 고성능의 물리적 서버까지는 필요가 없어졌기 때문입니다.

 

 

 

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

마이크로서비스 작성 시에는 아래와 같은 항목들을 고려해야합니다.

 

  1. 적정 크기 : 마이크로서비스가 과도한 책임을 맡지 않도록 적정한 크기로 만드는 방법
  2. 위치 투명성 : 서비스 클라이언트에 영향을 주지 않고 서비스 인스턴스를 추가/삭제할 수 있는 방법
  3. 회복성 : 서비스에 문제가 있을 때, 서비스 클라이언트는 '빨리 실패'하는 방법
  4. 반복성 : 새로운 서비스 인스턴스가 시작될 때마다 기존 인스턴스와 동일한 코드와 구성으로 유지할 수 있는 방법
  5. 확장성 : 서비스 간 의존성을 최소화하여 확장할 수 있는 방법

 

포스팅하는 책에서는 위 항목들을 아래와 같은 패턴 기반으로 접근하며, 사용하는 기술로는 스프링 부트와 스프링 클라우드입니다.

 

  • 핵심 개발 패턴
  • 라우팅 패턴
  • 클라이언트 회복성 패턴
  • 보안 패턴
  • 로깅 및 추적 패턴
  • 빌드 및 배포 패턴

 

1) 핵심 개발 패턴

 

핵심 개발 패턴은 아래 사항들을 중점적으로 다룹니다.

 

  1. 서비스 세분성 : 각 마이크로서비스가 정적 수준의 책임을 갖게 하는 방법
  2. 통신 프로토콜 : 마이크로서비스간의 데이터 교환
  3. 인터페이스 설계 : 개발자가 서비스 호출에 사용하는 실제 서비스 인터페이스를 설계
  4. 서비스간 이벤트 프로세싱 : 서비스간 의존성을 최소화하고 어플리케이션 회복성을 높이기 위한 방법

 

2) 라우팅 패턴

 

클라우드 기반 어플리케이션들은 수백 개의 마이크로 인스턴스가 실행 중일 수 있습니다.

때문에, 서비스의 물리적 IP 주소를 추상화하고 서비스 호출에 대한 단일 진입점을 만들어야 하는 필요성이 있습니다.

 

이를 위해, 서비스 디스커버리와 서비스 라우팅이라는 기능을 사용합니다.

 

  • 서비스 디스커버리 : 클라이언트에서 서비스의 물리적 위치를 추상화하여 투명하게 새 인스턴스를 추가하고 제거하는것을 제공
  • 서비스 라우팅 : 마이크로서비스 클라이언트에 인가 및 인증, 콘텐츠 검사 등 정책 시행 지점으로 사용되는 논리적 단일 URL을 제공

 

3) 클라이언트 회복성 패턴 

 

마이크로서비스 아키텍처는 한개의 서비스 문제가 서비스 소비자에게 연쇄적으로 발생하지 않도록 아래와 같은 4가지 클라이언트 회복성 패턴을 다룹니다.

 

  1. 클라이언트 측 부하 분산 : 서비스 클라이언트는 서비스 디스커버리에서 검색한 엔트포인트를 캐싱하고 인스턴스 간 서비스의 호출 부하를 분산합니다.
  2. 회로 차단기 패턴 : 서비스 클라이언트가 실패한 서비스를 반복적으로 호출하지 않게 하기 위해, 회로 차단기가 '빨리 실패'하도록 합니다.
  3. 폴백 패턴 : 클라이언트가 실패할 때, 데이터를 검색 등의 대체 방법을 제공합니다.
  4. 벌크헤드 패턴 : 오작동하는 서비스 하나가 클라이언트의 모든 리소스를 차지하지 않도록 클라이언트에서 다른 서비스 호출을 격리합니다.

 

4) 보안 패턴

 

해당 포스팅 책에서는 아래 3가지 보안패턴을 다룹니다.

 

  1. 인증
  2. 인가
  3. 자격 증명 관리와 전파 : 서비스 클라이언트가 여러 서비스 호출에서 자격 증명을 항상 제시하지 않아도 되는 방법

 

5) 로깅 및 추적 패턴

 

마이크로서비스의 단점은 어플리케이션과 서비스안에서 어떤일이 있어났는지 디버깅과 추적이 어렵다는 점입니다.

 

때문에, 아래와 같은 로깅 및 추적관련 패턴이 있습니다.

 

  • 로그 상관관계: 단일 트랜잭션에 대해 여러 서비스간 생성된 모든 로그를 상관관계를 매기는 방법
  • 로그 수집 : 개별 서비스 인스턴스에서 생성된 모든 로그를 질의 가능한 단일 데이터베이스로 취합하는 방법
  • 마이크로서비스 추적 : 트랜잭션과 연관된 모든 서비스에서 클라이언트 트랜잭션 흐름을 시각화하는 방법

 

6) 빌드 및 배포 패턴

 

마이크로서비스 아키텍처는 각 인스턴스가 모두 동일해야 한다는 점입니다.

이 말은, 서버가 배포된 이후의 변경으로 발생하는 '구성 편차'가 없어야 한다는 의미입니다.

 

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

 

위 패턴들에 사용할 기술들은 아래 그림으로 한눈에 볼 수 있습니다.

스프링 클라우드와 넷플릭스가 있습니다.

 

 

9. 마무리

 

이번 포스팅에서는 스프링, 클라우드와 만나다에 대해 간단한 소개와 설명을 했습니다.

다음에는 스프링 부트로 마이크로서비스 구축에 대해 포스팅하겠습니다.

반응형

+ Recent posts