상세 컨텐츠

본문 제목

03장 공조 마이크로서비스 집합 생성

MSA

by 코농이 2021. 4. 7. 16:46

본문

목표

마이크로 서비스를 만들면서 기능을 최소화한 공조 마이크로서비스를 만든다.


기술 요구 사항

도구 설치
   ◆ 깃, 자바, curl, jq(api 응답으로 json을 받은 경우 쉽게 데이터를 가공할 수 있는 json 프로세서), 스프링부트 CLI

$ git --version && java -version && curl --version && jq --version && spring --version

설치 도구 버전 확인

◇ 소스 코드를 폴더에 다운로드 한 후 해당 폴더를 가리키는 환경 변수 $BOOK_HOME 설정

$ export BOOK_HOME=~/Documents/Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud
git clone https://github.com/PacktPublishing/Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud $BOOK_HOME
cd $BOOK_HOME

 

C:\Users\eunbyul\Documents\Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud에 소스코드 다운로드


마이크로서비스 환경 소개

시스템 환경은 복합 서비스인 Product Composite핵심 서비스인 Product, Review, Recommendation으로 구성
세가지 핵심 서비스는 각기 하나의 자원 유형을 담당하며, 복합 마이크로서비스는 세 가지 핵심 서비스의 정보를 집계

각 마이크로서비스가 처리하는 정보
◇ Product  서비스

제품 정보를 관리 
제품 ID(Product ID), 이름(Name), 무게(Weight)

◇ Review 서비스

리뷰 정보 관리
제품 ID(Product ID), 검토ID(ReviewID), 작성자(Author), 제목(Subject), 콘텐츠(Contents)

◇ Recommend 서비스

추천 정보 관리
제품 ID(Product ID), 추천ID(RecommendationID), 작성자(Author), 평점(Rate), 콘텐츠(Contents)

◇ Product Composite 서비스

핵심 서비스에서 수집한 제품 관련 정보 제공
제품 정보, 특정 제품의 리뷰 목록, 특정 제품의 추천 목록

인프라 관련 정보

마이크로서비스는 이를 관리하는 인프라에서 컨테이너로 실행되므로 어떤 컨테이너가 사용자의 요청에 응답하는지 추적해야함
추적이 쉽도록 모든 응답에는 hostname/ip-address:port 형식의 serviceAddress 속성이 추가


골격 마이크로서비스 생성

스프링 이니셜라이저를 사용하여 각 마이크로서비스를 위한 골격 프로젝트를 생성

spring init

빌드 도구로 그래들 사용, 자바 버전, jar로 프로젝트 패키징, 액추에이터, 웹플럭스 모듈 의존성 추가, 스프링 부트 버전  지정

커맨드로 마이크로서비스용 골격 코드 생성

프로젝트 폴더 구조

각 프로젝트에 생성된 파일 확인

find microservices/product-service -type f

스프링 이니셜라이저로 그래들 파일 5개, .gitignore파일, 스프링 부트 파일 3개를 생성

골격 프로젝트 안에는 마이크로서비스를 위한 프로젝트 빌드 파일과 빈  main 클래스, 테스트 클래스가 있다.

 


스프링 부트 파일

ProductServiceAppication.java : 메인 애플리케이션 클래스
@SpringBootApplication을 통해 컴포넌트 검색을 활성화해 애플리케이션 클래스의 패키지와 모든 하위 패키지에서 스프링 컴포넌트와 구성 클래스를 검색함


application.properties : 빈 속성 파일

ProductServiceApplicationTests.java :
제이유닛을 사용해 스프링 부트 애플리케이션을 테스트하도록 구성된 테스트 클래스
@Runwith, @SpringBootTest 애노테이션은 시작 지점에 애플리케이션을 초기화 시킴
즉, 테스트 실행 전에 컴포넌트 검색 및 자동 구성을 사용하여 스프링 애플리케이션 콘텍스트를 설정한다.


그래들 파일

◇ build.gradle : 프로젝트 소스 코드를 컴파일하고 테스트, 패키징하기 위한 빌드 방법을 기술
                                  buildscript는 플러그인 의존성(라이브러리) 관리를 위한 설정

   ◆ springBootVersion : spring init 커맨드를 실행할 때 저장한 것으로 설정
   ◆ apply plugin : org.springframework.boot(팻 JAR 파일을 빌드함)
                                     io.spring.dependency-management(스프링 부트 스타터 의존성을 관리)
    ◆ 플러그인은 중앙 메이븐 저장소에서 받는다.
    ◆ 프로젝트 그룹, 버전, 자바 버전, 의존성이 선언

다음 커맨드로 각 마이크로서비스를 따로 빌드할 수 있다.

cd microservices/product-composite-service; ./gradlew build; cd -; \
cd microservices/product-service; ./gradlew build; cd -; \
cd microservices/recommendation-service; ./gradlew build; cd -; \
 cd microservices/review-service; ./gradlew build; cd -;

그래들에 멀티 프로젝트 빌드 설정

그래들의 멀티 프로젝트 빌드를 이용해 전체 마이크로서비스를 하나의 커맨드로 빌드하는 방법을 살펴본다.

1. settings.gradle 파일을 생성하고 그래들이 빌드할 프로젝트를 입력

1-spring-init 경로에 settings.gradle 파일 생성

2. product-service 프로젝트에서 그래들 실행 파일을 복사하여 멀티 프로젝트 빌드에서 재사용

cp -r microservices/product-service/gradle . &&
cp microservices/product-service/gradlew . &&
cp microservices/product-service/gradlew.bat . &&
cp microservices/product-service/.gitignore .

3. 각 프로젝트에서 그래들 실행 파일을 제거

find microservices -depth -name "gradle" -exec rm -rfv "{}" \; &&
find microservices -depth -name "gradlew*" -exec rm -fv "{}" \;

4. 하나의 커맨드로 전체 마이크로서비스를 빌드

./gradlew build

5. 실행 결과

스프링이니셜라이저로 각 마이크로서비스를 위한 골격 프로젝트를 생성한 후 그래들로 빌드


RESTful API 추가

프로젝트 설정을 마치고 세 가지 핵심 마이크로 서비스에 RestAPI를 추가하는 단계이다.

먼저 api, util 프로젝트를 추가하고 RESTful API를 구현한다.
이 두 프로젝트는 모든 마이크로서비스 프로젝트에서 공유하는 코드를 제공한다.

API 프로젝트와 Util 프로젝트 추가

1. API 정의를 배치할 별도의 그래들 프로젝트를 생성

2. 자바 인터페이스를 사용하여 RESTful API를 설명하고, 모델 클래스로 API 요청 및 응답에 사용할 데이터를 정의

3. 전체 마이크로서비스가 공유하는 헬퍼 클래스를 배치할 util 프로젝트 생성

 

api 프로젝트

 

api 프로젝트는 main 애플리케이션 없이 라이브러리로 프로젝트로만 구성

main 애플리케이션 클래스가 없고 build.gradle  파일이 약간 다르다는 점만 빼면 애플리케이션 프로젝트와 동일함

api 폴더의 자바 파일 구조
ProductService.java 코드

◇ product 서비스는 하나의 API 메서드(getProduct())만 공개

◇ HTTP GET 요청에 메서드를 매핑하고자 @GetMapping 애노테이션을 사용하여
     URL 경로 /product/{productID}에 매서드를 매핑했고, 응답 형식을 JSON으로 지정함

◇ URL 경로의 {ProductId}에는 경로 변수 productID가 매핑됨

◇ 메서드 매개 변수 productID에는 HTTP 요청으로 전달된 값을 매개 변수에 매핑하는 @PathVariable이 붙음

    /product/123에 HTTP GET 요청을 보내면 productId 매개변수를 123으로 설정해 getProduct() 매서드를 호출

getProduct() 메서드는 POJO 기반 모델 클래스인 Product 객체를 반환

product.java 파일의 내용 (생성자, 설정자, 접근자 생략)

util 프로젝트

util 프로젝트의 자바 파일과 구조(예외 클래스, 유틸리티 클래스)

◇ GlobalControllerExceptionHandler와 HttpErrorInfo는 재사용 가능한 유티리티 클래스로
     자바 예외를 적절한 HTTP 상태 코드와 매핑

◇ ServiceUtil.java의 핵심 기능은 마이크로서비스의 호스트 이름, IP 주소, 포트를 검색하는 것

ServiceUtil.java의 getServiceAdress() 메서드를 사용해 마이크로서비스의 호스트 이름, IP 주소, 포트를 검색할 수 있다.


핵심 마이크로서비스 API 구현

Product 서비스 구현

1. microservices/product-service/build.gradle 파일의 의존성 요소에 api 및 util 프로그램을 추가

product-service/build.gradle

2. @componentScan 애노테이션 추가

기본 애플리케이션 ProductServiceApplication.java 클래스에 애노테이션 추가

@componentScan 스프링 부트의 자동 구성 기능을 이용해 api 및 util 프로젝트의 빈을 감지함
se.magnus를 기본패키지로 지정하여 api 및 util 프로젝트의 패키지를 검색하도록 함 


3. ProductServiceImpl.java를 생성

ProductServiceImple.java

◇ ProductService 인터페이스를 구현하는 imple 생성 후 인터페이스에 정의한 URL 경로로 요청이 오면 호출되도록 @RestController 애노테이션을 추가함
생성자를 이용하여 util 프로젝트의 ServiceUtil 클래스 주입
◇ ProductService 인터페이스의 getProduct() 메서드를 재정의하여 API를 구현함
(아직 데이터베이스가 없으므로 ServiceUtil에서 받은 서비스 주소와 인자로 입력된 ProductId를 이용해서 하드 코딩한 응답을 반환함)
5. 포트 번호 및 로깅 수준과 같은 런타임 속성을 설정

product-service/application.yml 속성 파일

5. 마이크로서비스 빌드

cd $BOOK_HOME/Chapter03/2-basic-rest-services &&
./gradlew build &&
java -jar microservices/product-service/build/libs/*.jar &

6. product 서비스를 호출하여 테스트

curl http://localhost:7001/product/123

실행 결과

7. product 서비스 중지

kill $(jobs -p)

처음으로 마이크로서비스를 빌드하고 실행, 테스트 완료


 

'MSA' 카테고리의 다른 글

02장 스프링 부트 소개  (0) 2021.03.17
01장 마이크로서비스 소개  (0) 2021.03.16

관련글 더보기

댓글 영역