개요
이 튜토리얼에서는 Spring Boot, Spring 클라우드, MongoDB 사용하여 마이크로서비스 아키텍처를 빌드 방법을 보여줍니다. 특히 이 튜토리얼에서는 함께 작동하여 완전한 애플리케이션 형성하는 여러 서비스를 만드는 방법을 안내합니다.
전체 소스 코드 다음 GitHub 리포지토리에서 찾을 수 있습니다.
Spring Boot
Spring Boot는 Spring Framework를 기반으로 구축된 프레임워크 입니다. 자동 구성, 기본값 및 프로덕션 지원 기능을 추가하여 Spring Data MongoDB 와의 통합을 포함하여 Spring 기반 Java 애플리케이션 빌드를 간소화합니다. 자세한 내용은 Spring Boot 문서를 참조하세요.
Spring Cloud
Spring Cloud는 분산된 시스템 및 마이크로서비스를 구축하기 위한 도구 컬렉션 입니다. 구성 관리, 서비스 검색 및 지능형 라우팅을 위한 기능을 제공합니다. 자세한 내용은Spring 클라우드 문서를참조하세요.
튜토리얼
이 튜토리얼에서는 다음 조치를 수행하는 방법을 보여줍니다.
전제 조건 확인
예시 리포지토리 복제
config 서버 설정
서비스 레지스트리 설정
API 게이트웨이 구성
MongoDB 마이크로서비스 생성
REST API 테스트
전제 조건을 확인합니다.
시작하기 전에 다음 항목이 설치되어 있는지 확인합니다.
JDK( Java 개발 키트) 21 이상. Oracle 웹사이트에서 JDK를 다운로드 할 수 있습니다.
Git
MongoDB (로컬 개발을 위한 두 가지 배포). 로컬에서 MongoDB 설정하다 방법을 학습하려면 Docker 사용하여 로컬 Atlas 배포 만들기 가이드를 참조하세요.
예시 리포지토리를 복제합니다.
다음 명령을 실행 하여 마이크로서비스 애플리케이션 및 구성 리포지토리를 복제합니다.
git clone git@github.com:mongodb-developer/microservices-architecture-mongodb.git git clone git@github.com:mongodb-developer/microservices-architecture-mongodb-config-repo.git
microservices-architecture-mongodb 리포지토리 의 README.md 파일 에 있는 지침에 따라 각 서비스를 시작합니다.
config 서버 설정합니다.
config 서버 마이크로서비스에 대한 모든 설정 파일을 단일 리포지토리 내에 저장합니다.
config 서버 구성은 microservices-architecture-mongodb/config-server/src/main/resources/application.properties 파일 에 정의되어 있습니다.
spring.application.name=config-server server.port=8888 spring.cloud.config.server.git.uri=${HOME}/Work/microservices-architecture-mongodb-config-repo spring.cloud.config.label=main
이 구성은 마이크로서비스 구성과 사용할 브랜치를 저장하는 Git 리포지토리 의 위치 지정합니다.
config 서버 애플리케이션 microservices-architecture-mongodb/config-server/src/main/java/com/mongodb/configserver/ 디렉토리 에 있는 다음 Java 클래스에 정의되어 있습니다.
package com.mongodb.configserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
참고
@EnableConfigServer 주석은 Spring Boot 애플리케이션 에서 config 서버 기능을 활성화합니다.
서비스 레지스트리를 설정합니다.
서비스 레지스트리는 실행 마이크로서비스와 해당 위치를 추적합니다. 다른 서비스는 이 정보를 사용하여 필요한 마이크로서비스와 통신합니다.
서비스 레지스트리 구성은 다음 속성 파일 에 정의되어 있습니다.
spring.application.name=service-registry server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
마지막 두 속성은 서비스 레지스트리가 자체적으로 등록되지 않도록 합니다.
서비스 레지스트리 애플리케이션 microservices-architecture-mongodb/service-registry/src/main/java/com/mongodb/serviceregistry/ 디렉토리 에 있는 다음 Java 클래스에 정의되어 있습니다.
package com.mongodb.serviceregistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; public class ServiceRegistryApplication { public static void main(String[] args) { SpringApplication.run(ServiceRegistryApplication.class, args); } }
참고
@EnableEurekaServer 주석은 Spring Boot 애플리케이션 에서 서비스 레지스트리 기능을 활성화합니다.
API 게이트웨이를 구성합니다.
API 게이트웨이는 모든 마이크로서비스 액세스 할 수 있는 단일 진입 점 제공합니다. 게이트웨이는 요청을 여러 마이크로서비스에 분산하고 보안, 모니터링 및 기타 문제를 처리합니다.
API 게이트웨이 구성은 microservices-architecture-mongodb/api-gateway/src/main/resources/application.yml 파일 에 정의되어 있습니다.
server: port: 8080 spring: application: name: api-gateway cloud: gateway: routes: - id: company-service uri: lb://company-service predicates: - Path=/api/company/**,/api/companies - id: employee-service uri: lb://employee-service predicates: - Path=/api/employee/**,/api/employees eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ instance: hostname: localhost
이 구성은 회사 및 직원 서비스에 대한 경로를 정의하고 게이트웨이를 서비스 레지스트리에 등록합니다.
MongoDB 마이크로서비스를 생성합니다.
이 애플리케이션 에는 회사 서비스와 직원 서비스라는 두 가지 마이크로서비스가 포함되어 있습니다. 각 microservices 자체 MongoDB 인스턴스 에 연결하여 독립성을 유지합니다.
회사 서비스 구성은 microservices-architecture-mongodb-config-repo/company-service.properties 파일 에 정의되어 있습니다.
spring.data.mongodb.uri=${MONGODB_URI_1:mongodb://localhost:27017} spring.threads.virtual.enabled=true management.endpoints.web.exposure.include=* management.info.env.enabled=true info.app.name=Company Microservice info.app.java.version=21 info.app.type=Spring Boot server.port=8081 eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.instance.hostname=localhost
직원 서비스 구성은 microservices-architecture-mongodb-config-repo/employee-service.properties 파일 에 정의되어 있습니다.
spring.data.mongodb.uri=${MONGODB_URI_2:mongodb://localhost:27018} spring.threads.virtual.enabled=true management.endpoints.web.exposure.include=* management.info.env.enabled=true info.app.name=Employee Microservice info.app.java.version=21 info.app.type=Spring Boot server.port=8082 eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.instance.hostname=localhost
참고
로컬 개발의 경우 회사 서비스는 포트 27017 에서 MongoDB 에 연결하고 직원 서비스는 포트 27018에서 MongoDB 에 연결합니다. 프로덕션의 경우 별도의 MongoDB Atlas 클러스터를 사용하고 MONGODB_URI_1 및 MONGODB_URI_2 환경 변수를 사용하여 연결 문자열을 설정하십시오.
REST API를 테스트합니다.
모든 서비스를 시작한 후 다음 서비스가 실행 중인지 확인하여 마이크로서비스 아키텍처가 올바르게 작동하는지 확인합니다.
포트 8888의 config 서버
포트 8761의 서비스 레지스트리
포트 8080의 API 게이트웨이
포트 8081의 회사 서비스
포트 8082의 직원 서비스
또한 포트 27017 및 27018에서 2개의 MongoDB 인스턴스가 실행 거나 2개의 MongoDB Atlas 클러스터가 있는지 확인합니다.
다음 명령을 실행 하여 테스트 스크립트 실행합니다.
./2_api-tests.sh
이 스크립트 회사와 직원을 생성한 다음 REST API 사용하여 조회합니다. 스크립트 가 반환하는 출력은 다음과 유사합니다.
DELETE Companies 2 DELETE Employees 2 POST Company 'MongoDB' POST Company 'Google' GET Company 'MongoDB' by 'id' { "id": "661aac7904e1bf066ee8e214", "name": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00" } GET Company 'Google' by 'name' { "id": "661aac7904e1bf066ee8e216", "name": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00" } GET Companies [ { "id": "661aac7904e1bf066ee8e214", "name": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00" }, { "id": "661aac7904e1bf066ee8e216", "name": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00" } ] POST Employee Maxime POST Employee Tim GET Employee 'Maxime' by 'id' { "id": "661aac79cf04401110c03516", "firstName": "Maxime", "lastName": "Beugnet", "company": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00", "joined": "2018-02-12T00:00:00.000+00:00", "salary": 2468 } GET Employee 'Tim' by 'id' { "id": "661aac79cf04401110c03518", "firstName": "Tim", "lastName": "Kelly", "company": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00", "joined": "2023-08-23T00:00:00.000+00:00", "salary": 13579 } GET Employees [ { "id": "661aac79cf04401110c03516", "firstName": "Maxime", "lastName": "Beugnet", "company": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00", "joined": "2018-02-12T00:00:00.000+00:00", "salary": 2468 }, { "id": "661aac79cf04401110c03518", "firstName": "Tim", "lastName": "Kelly", "company": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00", "joined": "2023-08-23T00:00:00.000+00:00", "salary": 13579 } ]
직원 서비스는 회사 서비스를 쿼리하여 회사 세부 정보를 조회 . 다음 코드는 직원 서비스가 서비스 레지스트리를 통해 회사 서비스와 통신하는 방법을 보여줍니다.
private CompanyDTO getCompany(String company) { String url = "http://company-service/api/company/name/"; CompanyDTO companyDTO = restTemplate.getForObject(url + company, CompanyDTO.class); if (companyDTO == null) { throw new EntityNotFoundException("Company not found: ", company); } return companyDTO; }
URL IP 주소 와 포트가 아닌 이름으로 회사 서비스를 참조하므로 서비스 레지스트리가 올바르게 작동하는지 확인할 수 있습니다.
추가 리소스
Spring 및 MongoDB 사용하여 마이크로서비스를 빌드하는 방법에 대해 자세히 학습 다음 리소스를 참조하세요.