클라우드 네이티브 인 액션(1)
클라우드 네이티브 스프링 인 액션 서적의 데모 프로젝트를 모방하였습니다. 깃 레포지토리
□ 데모 프로젝트 생성
책 자체가 스프링에 대한 초심자(?)에 대한 책은 아니므로 데모 프로젝트를 구성하는데 많은 시간을 할애하지 않았다.
환경
- gradle 8.8
- java 17
- spring 3.3.1
- Intellij
- Mac M1, M2
의존 라이브러리
- Lombok
- Spring-boot-starter-web
위 환경에 맞춰서 프로젝트를 생성하면 된다.
□ 데모 컨트롤러 제작
1
2
3
4
5
6
7
8
@RestController
public class HomeController {
@GetMapping("/")
public String getGreeting(){
return "클라우드 네이티브 스프링 인 액션 예제 입니다.";
}
}
간단한 컨트롤러를 제작한다.
□ 테스트 실행
gradle 기준으로 테스트는 다음과 같이 진행한다.
1
./gradlew test
□ 실행
Intellij에서 실행할 수 있지만 gradle을 통해서도 실행할 수 있다.
1
./gradlew bootRun
□ 도커 이미지로 만들어 컨테이너로 실행
1
./gradlew bootBuildImage
클라우드 네이티브 빌드팩을 통해서 의존성이나 도커파일 작성없이 애플리케이션을 컨테이너화 시킬 수 있다.
처음 명령어 실행시에는 조금 오래 걸릴 수 있으나 완료된 후에는
1
2
3
4
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
catalog-service 0.0.1-SNAPSHOT 139cec0bf9e2 44 years ago 322MB
이렇게 이미지가 생성된다.
CREATED가 44년전이라는 것은 클라우드 네이티브 빌드팩의 규칙이라니 넘어가면 될 것 같다.
1
2
> docker run --rm --name catalog-service -p 8080:8080 \
> catalog-service:0.0.1-SNAPSHOT
해당 명령어를 통해 컨테이너화하여 실행하면 http://localhost:8080 으로 접속하여 확인할 수 있다.
□ 쿠버네티스로 실행
먼저 minikube
가 설치되어야하는데, 애플 실리콘 칩 기준 사용자 환경에 따라 설치가 불편할 때가 있다.
1
2
3
4
5
> brew install minikube
>minikube version main [f84461a]
minikube version: v1.33.1
commit: 5883c09216182566a63dff4c326a6fc9ed2982ff
minikube 드라이버로 hyperkit-v은 지원안하다는 말이 있으므로 docker 드라이버로 실행해야한다.
1
2
3
> minikube start --driver=docker
# docker driver를 default설정으로
> minikube config set driver docker
여기서 잘 시작된다면 괜찮지만 docker driver를 찾을 수 없다는 등의 내용이 나오면 docker를 삭제한 뒤,
1
> brew install --cask docker
로 재설치해주자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 도커 로컬 클러스터로 이미지 가져옴
> minikube image load catalog-service:0.0.1-SNAPSHOT
# 디플로이먼트 생성
> kubectl create deployment catalog-service --image=catalog-service:0.0.1-SNAPSHOT
# 디플로이먼트 확인
> kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
catalog-service 1/1 1 1 55s
# pod 객체 확인
> kubectl get pod
NAME READY STATUS RESTARTS AGE
catalog-service-7d9c85ff7f-b74sr 1/1 Running 0 11m
# port 노출
> kubectl expose deployment catalog-service --name=catalog-service --port=8080
# 확인
> kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
catalog-service ClusterIP 10.103.118.238 <none> 8080/TCP 25s
# port forward
> kubectl port-forward service/catalog-service 18000:8080
Forwarding from 127.0.0.1:18000 -> 8080
Forwarding from [::1]:18000 -> 8080
이후, http://localhost:18000에 접근하면
와 같이 뜨면 된다.
정리하자면
간단한 스프링 예제를 만들어서
gradle, docker, minikube로 서비스를 띄워보았다.
새로운 프로젝트에서는 다음과 같은 기술들이 쓰일 수 있다고 한다.
- 웹과 상호작용
- Spring webflux: 여러 서비스가 연관되어 있을수록 이벤트형식의 프로그래밍이 문제를 일으킬 소지가 적음.
- Spring Cloud Stream: 서비스간 데이터 흐름 구성
- Spring Cloud Function: 메시지 처리를 위한 함수, 서버리스 구성
- 데이터
- JDBC
- R2DBC
- Flyaway: 스미카 마이그레이션
- Redis: 세션 데이터 저장
- Spring Session: 세션 구현
- Spring AMQP, Rabbit MQ: 메시지 처리 구현
- 설정
- Spring Cloud Config: 외부 설정 서버
- Config Map, Secret: Kubenates에서 사용
- 라우팅
- 쿠버네티스
- Spring Cloud Gateway: API 내부 변경시 외부에 영향을 미치지 않도록
- 관측 가능성
- Spring Boot Actuactor, Promethus, Grafana: 서비스 상태 시각화
- OpenTelemetry, Grafana Tempo: 분산추적기능 및 시각화
- Fluent Bit, Loki: Spring 로그 확인
- 복원력
- Project Reactor, Spring Cloud Circuit Breaker: 재시도, 타임아웃 등 기타 패턴 구현
- 보안
- Keycloak: 신원확인
- Spring Security: 보안, 인증 표준 제공
- OAuth2, OpenIDConeect
- 테스트
- Junit5
- 빌드, 배포
- 스프링 네이티브, 그랄VM
- Git Action
- GitOps,Argo CD
- UI
- Angular Framework