본문 바로가기
Dev/[프로젝트] 2022 Winter Dev Camp

2022 스마일게이트 윈터데브캠프를 통해 성장하기 6 - 프로젝트 배포

by javapp 자바앱 2023. 3. 4.
728x90

 

1. 개요

개발 도중 모바일과 서버의 연동테스트를 하는 시간을 가졌습니다.

현재 GitHub를 통해서만 코드를 공유하고 있고 로컬환경에서만 개발하고 있었기 때문에 모바일과 서버가 연결할 수 없었습니다.

 

팀회의 결과 도커에 올려서 모바일 개발자가 이미지를 받아 서버를 실행시키는 방법도 있었지만 그러기엔 복잡한 과정을 거쳐야했기에 서버를 배포해서 모바일 개발자들이 연동 테스트를 하기로 하였습니다.

 

현재 Spring Boot 서버는 MSA구조로 인증, 유저, 알림, 채팅, 접속상태 마이크로서비스, 2개의 메인 DB (MySQL, MongoDB), 레디스, 카프카를 운영중입니다.

 

ec2 하나에 모두 넣자는 의견이 있었지만

마이크로서비스들과 레디스, 카프카는 ec2에 넣고

MySQL은 AWS RDS, MongoDB는 Mongo Atlas 클라우드로 연동했습니다.

모바일과 연동테스트 목적의 배포였기 때문에 최소한 간소화시켜 AWS ec2에 올렸습니다.

한 EC2에 스프링서버들과 kafka를 실행시켰고 도커를 설치하여 토큰 저장용인 redis와 모니터링을 위한 Grafana를 올렸습니다.

MySQL은 AWS RDS, MongoDB는 Mongodb Atlas와 연동하였습니다.

 

 

2. EC2 생성

 

ec2 생성과 기본 VPC, 탄력적 IP , 보안그룹 (SSH 등 추가)

( EC2의 세부적인 설정 과정은 생략)

 

 

3. ec2에 jar 배포

$ ./gradlew clean build 
$ sudo chmod 777 ./gradlew  (위의 명령어가 안된다면)
// 윈도우에서 테스트없이 빌드 : 
./gradlew clean build -x test

 

백그라운드

터미널을 꺼도 애플리케이션이 돌아가게 하고 싶을 때

nohup java -jar ./build/libs/chat-0.0.1-SNAPSHOT.jar &
포트 확인 netstat -ano | grep “~~~”
  • nohup은 터미널을 꺼도 애플리케이션이 꺼지지 않도록 하는 명령어
  • &는 애플리케이션이 백그라운드에서 돌아갈 수 있도록 하는 명령어

실행시 "nohup: ignoring input and appending output to 'nohup.out'" 메시지가 생기면 실행 성공

exit 나가기 [AWS/Linux] AWS EC2 서버 무중단 배포 및 백그라운드에서 실행시키는 방법 (tistory.com)

 

jps -m // 실행중인 프로세스

 

백그라운드 로그를 보고 싶은 경우

tail -f nohup.out

nohup.out은 nohup으로 실행한 애플리케이션의 로그를 볼 수 있는 파일

종료하고 싶은 경우 control + c하면 애플리케이션 종료 없이, 로그 보기만 종료

 

 

백그라운드 실행 종료

백그라운드 실행을 종료할 때는 실행 중인 포트에서 동작하고 있는 프로세스 id를 파악해서 종료시켜야 한다.

8080 포트의 프로세스 id 확인

sudo lsof -t -i:8080

프로세스 종료

kill -9 [프로세스 id]

여유 디스크 공간 보기 df -hT /dev/xvda1

 

 

 

4. 카프카 설치

[아파치 카프카 입문과 활용] 2. Apache kafka 설치, 실행, CLI

 

주키퍼 실행

PS C:\\kafka> bin/windows/zookeeper-server-start.bat config/zookeeper.properties

리눅스 / Amazon Linux 2 AMI

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

 

카프카 실행

PS C:\\kafka> bin/windows/kafka-server-start.bat config/server.properties

리눅스 / Amazon Linux 2 AMI

bin/kafka-server-start.sh -daemon config/server.properties

 

실행중인 JVM 프로세스 확인

jps -m
$ tail -f logs/*

Ctrl + c # 종

 

 

application 설정

spring:
  kafka:
    bootstrap-servers: localhost:9092
    chat-consumer:
      group-id: chat-group
    room-consumer:
      group-id: room-group
kafka:
  topic:
    chat-name: message
    room-name: room

도커에 카프카가 실행되어 있는 경우

localhost 대신 host.docker.internal 으로 설정

 

 

이슈

kafka java.io.IOException: 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다

→ C:\tmp\zookeeper 삭제

→ C:\kafka\kafkaexecution-logs 삭제

log.dirs=/tmp/kafka-logs

 

 

 

5. 도커

도커 설치 후 레디스와 프로메테우스, 그라파나 실행

(레디스 등 세부 설정은 생략)

 

레디스 설정

spring:
  redis:
    host: 127.0.0.1
    port: 6379

 

 

프로메테우스 설정

prometheus.yml

targets : 서버 hostname:port 여러개 등록 가능

도커 내부에 서버 등록하고 싶을 경우 host.docker.internal 으로 설정하면 인식

외부ip로 하면 내부 로컬 서버를 인식

작성한 설정파일을 토대로 컨테이너에 올라갑니다.

 

모니터링과 관련한 자세한 설정은 해당 게시물에 포스팅하였습니다.

 

Spring Cloud (MSA) - 모니터링 (Actuator, Prometheus, Grafana)

개요 배포를 한 뒤에 내가 내가 배포한 서버가 잘 동작하는지 어떻게 동작하고 있는지 서버의 상태를 확인할 수가 없었습니다. 그래서 모니터링하는 기술들이 있었는데 적용해본 기술들은 다음

javapp.tistory.com

 

 

6. AWS RDS

MySQL은 AWS RDS를 사용하여 생성하고 서버들과 연결하였습니다.

 

application 설정

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://plop-rds.cyjccp4psnuz.ap-northeast-2.rds.amazonaws.com:3306/plop?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
    username: ${PLOP_DB_USER}
    password: ${PLOP_DB_PWD}

username과 password는 환경변수를 통해 입력이 되도록 보안처리되어있습니다.

 

워크벤치와 연결

연결 완료

 

 

7. MongoDB Atlas

Atlas라는 클라우드 환경에 MongoDB와 연동하였습니다.

 

모니터링과 Collections 도 확인가능

 

로컬에서는 개인 IP 주소, EC2와 연동할 때는 ec2 외부 IP 주소를 등록합니다.

 

스프링부트와 연동

application.yml

spring:
  data:
    mongodb:
      uri: mongodb+srv://plop:비밀번호@mycluster.abc.mongodb.net/plop?retryWrites=true&w=majority

 

 

이렇게 해서 간단하게 배포를 해보았는데요. 하다보니깐 불편한 점이 있었습니다.

MSA 구조다 보니 부트 서버들이 많았습니다. 그래서 여러 서버들을 하나씩 실행시켜야 했습니다.

그에 대한 방법으로

스크립트를 만들어 한번에 실행시키는 방법

AWS CodeDeploy와 S3를 활용한 스프링부트 서비스 배포

Docker compose를 이용한 배포

 

그리고 도커 컨테이너 사이에 도커네트워크를 만들어 연결해야하는 것과

도커 컨테이너와 로컬과 연동은 host.docker.internal 으로 해야한다는 점

 

그리고 멘토링 하면서 알게된 점은 프로트와의 협업에서는 

컨트롤러와 가짜 데이터를 넣어 배포를 해주어 테스트 환경을 만들어 주고 (무료이여도됨)

기능 개발 뒤 연동하는 것!

 

몽고DB 쿼리문 작성은 다음 블로그 참고

2022 스마일게이트 윈터데브캠프를 통해 성장하기 5 - MongoDB 쿼리 자유롭게 사용하기 (tistory.com)

 

 

 

댓글