Post

클라우드 네이티브 인 액션(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
This post is licensed under CC BY 4.0 by the author.