서버 구성
서버 구성요소
- Git : 소스/프로파일 관리
- Config Server : 프로파일/설정 정보
- Eureka Server: 마이크로서비스 등록/검색
- API Gateway Server: 마이크로서비스 부하 분산/서비스 라우팅
- Microservices: 회원, 주문, 상품
- Queuing System: 마이크로서비스 간 메시지 발행/구독
마이크로서비스 (API) 구성요소
- 회원 user-service: 사용자 정보 등록, 조회, 사용자정보/주문내역 조회
- 주문 order-service: 주문 등록, 주문 확인
- 상품 catalog-service: 상품 목록
프로젝트 환경
- spring boot 3.4.1
- java 17
- h2 database, jpa
Eureka + Spring Cloud Gateway
이 둘은 클라우드 네이티브 시스템에서 로드밸런서와 API 게이트웨이 역할을 한다.
그 역할은 다음과 같다.
유레카에 Spring cloud gateway 서비스와, 마이크로 서비스들을 등록한다.
마이크로 서비스는 설정한 바에 따라서 (server: port: 0)매번 실행될 때 마다 포트번호가 랜덤으로 지정되는데, api gateway는 routing 기능을 통해 마이크로서비스의 위치를 유레카에서 알아와 포워딩시킬 수 있다.
유레카와 스프링 클라우드 게이트웨이의 자세한 설정은 포스팅해둔 해당 글에서 확인할 수 있다.
1) Srping cloud gateway 서비스 : application.yml 설정
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
eureka와 routes 설정이 필요하다.
클라이언트가 해당 api gateway 서비스의 /user-service/라는 패스로 요청하게되면,
routes 설정에서 lb(=eureka) 서버의 USER-SERVICE라는 이름을 가진 어플리케이션의 주소로 포워딩한다.
‼️주의할 점은, api gateway는 포워딩 할때 path값까지 포함한다는 것이다.
예를들어 http://apigateway주소/user-service/.. 로 호스트가 요청한다면 path까지 전달해 http://마이크로서비스주소/user-service/.. 로 전달하게된다.
따라서 마이크로서비스에서는 path값까지 URI 주소를 맞춰주어야 한다. (아니면 404 not found)
이게 싫다면, api gateway에서 설정을 추가해주면 된다.
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
- Method=POST
filters:
- RemoveRequestHeader=Cookie
- RewritePath=/user-service/(?<segment>.*), /\${segment}
RewritePath 설정을 통해 user-service로 들어온 것을 모두 없애서 보낼 수 있다.
즉, 클라이언트에서 http://apigateway주소/user-service/.. 로 보낸 요청을 http://마이크로서비스주소/..로 변경하여 보낸다.
마이크로 서비스 기능
1. 회원 user-service
user-service는 위에서 소개한 것처럼 사용자와 관련된 서비스를 담당한다.
DB는 H2 Database를 사용한다.
H2 Database 특징
- 자바로 작성된 오픈소스 RDBMS
- Embedded DB
- Server-client 가능
- JPA 연동 가능
spring boot 3점대를 사용할 경우, 버전을 높여서 사용해야 하기 때문에 기본적으로 application.yml에 db설정이 필요하다.
1) application.yml
spring:
application:
name: user-service
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password:
jpa:
hibernate:
ddl-auto: update
h2:
console:
enabled: true
settings:
web-allow-others: true
path: /h2-console
embedded DB이므로 어플리케이션을 띄울 때 기본으로 사용할 db(여기서는 testdb)를 설정해주어야한다.
2) dependency (maven - pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
spring boot 3점대에서는 위와 같이 devtools와 jpa, h2 의존성을 알맞게 설정해주어야 한다.
그렇지 않으면 h2가 실행되지 않아 404에러가 뜨거나, testdb 생성되지 않을 수 있다.
그리고 lombok의 경우 꼭 버전을 명시해주어야 오류 없이 플러그인을 사용할 수 있다.
'프로젝트 Project' 카테고리의 다른 글
MSA 앱 만들기 - 2. 로드밸런서 : 서비스 디스커버리 Eureka (1) | 2025.01.06 |
---|---|
API 명세서 - Swagger + Rest Docs (4) | 2024.08.06 |
API 명세서 - Swagger 적용하기 (feat. Spring security) (2) | 2024.08.06 |
테스트코드 작성하기 (0) | 2024.08.06 |
OAuth2 로그인 구현하기 (1) | 2024.08.06 |