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
프로메테우스 설정
targets : 서버 hostname:port 여러개 등록 가능
도커 내부에 서버 등록하고 싶을 경우 host.docker.internal 으로 설정하면 인식
외부ip로 하면 내부 로컬 서버를 인식
작성한 설정파일을 토대로 컨테이너에 올라갑니다.
모니터링과 관련한 자세한 설정은 해당 게시물에 포스팅하였습니다.
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를 활용한 스프링부트 서비스 배포
그리고 도커 컨테이너 사이에 도커네트워크를 만들어 연결해야하는 것과
도커 컨테이너와 로컬과 연동은 host.docker.internal 으로 해야한다는 점
그리고 멘토링 하면서 알게된 점은 프로트와의 협업에서는
컨트롤러와 가짜 데이터를 넣어 배포를 해주어 테스트 환경을 만들어 주고 (무료이여도됨)
기능 개발 뒤 연동하는 것!
몽고DB 쿼리문 작성은 다음 블로그 참고
2022 스마일게이트 윈터데브캠프를 통해 성장하기 5 - MongoDB 쿼리 자유롭게 사용하기 (tistory.com)
'Dev > [프로젝트] 2022 Winter Dev Camp' 카테고리의 다른 글
2022 스마일게이트 윈터데브캠프를 통해 성장하기 8 - 스웨거(Springdocs)로 API 문서 제공 (0) | 2023.03.09 |
---|---|
2022 스마일게이트 윈터데브캠프를 통해 성장하기 7 - 성능 측정, 성능 향상을 위한 리팩토링, 수정과 보완 (0) | 2023.03.05 |
2022 스마일게이트 윈터데브캠프를 통해 성장하기 5 - MongoDB 쿼리 자유롭게 사용하기 (0) | 2023.03.03 |
2022 스마일게이트 윈터데브캠프를 통해 성장하기 4 - 구현 : 접속상태 서비스 (0) | 2023.03.01 |
2022 스마일게이트 윈터데브캠프를 통해 성장하기 3 - 구현 : 채팅 서비스 (0) | 2023.02.28 |
댓글