마이크로 서비스를 만들면서 기능을 최소화한 공조 마이크로서비스를 만든다.
◇ 도구 설치
◆ 깃, 자바, 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
시스템 환경은 복합 서비스인 Product Composite와 핵심 서비스인 Product, Review, Recommendation으로 구성
세가지 핵심 서비스는 각기 하나의 자원 유형을 담당하며, 복합 마이크로서비스는 세 가지 핵심 서비스의 정보를 집계
제품 정보를 관리
제품 ID(Product ID), 이름(Name), 무게(Weight)
리뷰 정보 관리
제품 ID(Product ID), 검토ID(ReviewID), 작성자(Author), 제목(Subject), 콘텐츠(Contents)
추천 정보 관리
제품 ID(Product ID), 추천ID(RecommendationID), 작성자(Author), 평점(Rate), 콘텐츠(Contents)
핵심 서비스에서 수집한 제품 관련 정보 제공
제품 정보, 특정 제품의 리뷰 목록, 특정 제품의 추천 목록
마이크로서비스는 이를 관리하는 인프라에서 컨테이너로 실행되므로 어떤 컨테이너가 사용자의 요청에 응답하는지 추적해야함
추적이 쉽도록 모든 응답에는 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 -;
그래들의 멀티 프로젝트 빌드를 이용해 전체 마이크로서비스를 하나의 커맨드로 빌드하는 방법을 살펴본다.
cp -r microservices/product-service/gradle . &&
cp microservices/product-service/gradlew . &&
cp microservices/product-service/gradlew.bat . &&
cp microservices/product-service/.gitignore .
find microservices -depth -name "gradle" -exec rm -rfv "{}" \; &&
find microservices -depth -name "gradlew*" -exec rm -fv "{}" \;
./gradlew build
프로젝트 설정을 마치고 세 가지 핵심 마이크로 서비스에 RestAPI를 추가하는 단계이다.
먼저 api, util 프로젝트를 추가하고 RESTful API를 구현한다.
이 두 프로젝트는 모든 마이크로서비스 프로젝트에서 공유하는 코드를 제공한다.
1. API 정의를 배치할 별도의 그래들 프로젝트를 생성
2. 자바 인터페이스를 사용하여 RESTful API를 설명하고, 모델 클래스로 API 요청 및 응답에 사용할 데이터를 정의
3. 전체 마이크로서비스가 공유하는 헬퍼 클래스를 배치할 util 프로젝트 생성
api 프로젝트
api 프로젝트는 main 애플리케이션 없이 라이브러리로 프로젝트로만 구성
main 애플리케이션 클래스가 없고 build.gradle 파일이 약간 다르다는 점만 빼면 애플리케이션 프로젝트와 동일함
◇ 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 객체를 반환
util 프로젝트
◇ GlobalControllerExceptionHandler와 HttpErrorInfo는 재사용 가능한 유티리티 클래스로
자바 예외를 적절한 HTTP 상태 코드와 매핑
◇ ServiceUtil.java의 핵심 기능은 마이크로서비스의 호스트 이름, IP 주소, 포트를 검색하는 것
Product 서비스 구현
1. microservices/product-service/build.gradle 파일의 의존성 요소에 api 및 util 프로그램을 추가
2. @componentScan 애노테이션 추가
@componentScan 스프링 부트의 자동 구성 기능을 이용해 api 및 util 프로젝트의 빈을 감지함
se.magnus를 기본패키지로 지정하여 api 및 util 프로젝트의 패키지를 검색하도록 함
3. ProductServiceImpl.java를 생성
◇ ProductService 인터페이스를 구현하는 imple 생성 후 인터페이스에 정의한 URL 경로로 요청이 오면 호출되도록 @RestController 애노테이션을 추가함
◇ 생성자를 이용하여 util 프로젝트의 ServiceUtil 클래스 주입
◇ ProductService 인터페이스의 getProduct() 메서드를 재정의하여 API를 구현함
(아직 데이터베이스가 없으므로 ServiceUtil에서 받은 서비스 주소와 인자로 입력된 ProductId를 이용해서 하드 코딩한 응답을 반환함)
5. 포트 번호 및 로깅 수준과 같은 런타임 속성을 설정
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)
처음으로 마이크로서비스를 빌드하고 실행, 테스트 완료
02장 스프링 부트 소개 (0) | 2021.03.17 |
---|---|
01장 마이크로서비스 소개 (0) | 2021.03.16 |
댓글 영역