Login Service 적용하기
📘DB 만들기
DB 만들기에서 진행했던 내용에 docker-compose.yml에
networks:
default:
external:
name: msa
내용만 추가해서 새로 생성한 뒤에 schema와 table을 차례대로 생성했다.
CREATE TABLE `users` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`USER_ID` varchar(10) NOT NULL,
`NAME` varchar(20) NOT NULL,
`PW` varchar(150) NOT NULL,
`ADDRESS1` varchar(10) DEFAULT NULL,
`ADDRESS2` varchar(50) DEFAULT NULL,
`ADDRESS3` varchar(50) DEFAULT NULL,
`TEL` varchar(20) DEFAULT NULL,
`CREATED_AT` varchar(45) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `USER_ID_UNIQUE` (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
🔨Config 수정
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka:8761/eureka
token:
expiration_time: 86400000 #ms단위
secret: 비밀번호 키
spring:
jpa:
hibernate:
ddl-auto: none
show-sql: true
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://maria:3306/스키마
username: db 아이디
password: db 비밀번호
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka:8761/eureka
token:
expiration_time: 86400000 #ms단위
secret: 비밀번호 키
spring:
jpa:
hibernate:
ddl-auto: none
show-sql: true
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://maria:3306/스키마
username: db 아이디
password: db 비밀번호
설정 값을 다음과 같이 수정해주었다.
그리고 파일도 login-prod
로 profile이 작동하도록 파일을 하나 더 생성했다.
🐋Dockerfile 작성하기
FROM openjdk:11-ea-27-jdk-slim
VOLUME /tmp
# jar파일 복사
COPY build/libs/login-service-1.0.jar login.jar
ENTRYPOINT ["java","-jar","login.jar"]
🐋docker-compose.yml 작성하기
우리가 환경변수에서 지정해야할 부분은 Config Server와 Profile 이름이다.
version: '3.7'
services:
login:
image: "ililil9482/login:1.0"
container_name: login
environment:
- spring.cloud.config.uri=http://config:8888
- spring.cloud.config.profile=prod
networks:
default:
external:
name: msa
여기서 중요한 포인트는 따로 port나 expose를 통해 컨테이너끼리 연결을 하지 않아도 된다는 점이다. 그 이유는 Eureka에 서버를 등록해서 eureka가 gateway로 요청이 들어왔을 때 해당 서버로 연결해주는 기능을 하고 있기 때문에 따로 port나 expose를 통해서 연결할 필요 없이 service 이름으로만 연결된다는 점을 이해하고 넘어가자!
🤵♂️jenkins 파이프라인 작성하기
pipeline {
agent any
stages {
stage('Clone') {
steps {
git branch: 'main', credentialsId: '8e8302f1-6b98-4bfe-9981-2e027e49089b', url: 'https://github.com/juno-choi/jayeon-login.git'
}
}
stage('Clean') {
steps {
sh 'cd /var/jenkins_home/workspace/login'
sh 'chmod +x gradlew'
sh './gradlew clean'
}
}
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('HUB Push') {
steps {
sh 'docker build -t ililil9482/login:1.0 .'
sh 'docker push ililil9482/login:1.0'
}
}
stage('Down') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose down',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
stage('Up') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose up -d',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
}
}
FROM openjdk:11-ea-27-jdk-slim
VOLUME /tmp
# jar파일 복사
COPY build/libs/login-service-1.0.jar login.jar
ENTRYPOINT ["java","-jar","login.jar"]
우리가 환경변수에서 지정해야할 부분은 Config Server와 Profile 이름이다.
version: '3.7'
services:
login:
image: "ililil9482/login:1.0"
container_name: login
environment:
- spring.cloud.config.uri=http://config:8888
- spring.cloud.config.profile=prod
networks:
default:
external:
name: msa
여기서 중요한 포인트는 따로 port나 expose를 통해 컨테이너끼리 연결을 하지 않아도 된다는 점이다. 그 이유는 Eureka에 서버를 등록해서 eureka가 gateway로 요청이 들어왔을 때 해당 서버로 연결해주는 기능을 하고 있기 때문에 따로 port나 expose를 통해서 연결할 필요 없이 service 이름으로만 연결된다는 점을 이해하고 넘어가자!
🤵♂️jenkins 파이프라인 작성하기
pipeline {
agent any
stages {
stage('Clone') {
steps {
git branch: 'main', credentialsId: '8e8302f1-6b98-4bfe-9981-2e027e49089b', url: 'https://github.com/juno-choi/jayeon-login.git'
}
}
stage('Clean') {
steps {
sh 'cd /var/jenkins_home/workspace/login'
sh 'chmod +x gradlew'
sh './gradlew clean'
}
}
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('HUB Push') {
steps {
sh 'docker build -t ililil9482/login:1.0 .'
sh 'docker push ililil9482/login:1.0'
}
}
stage('Down') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose down',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
stage('Up') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose up -d',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
}
}
pipeline {
agent any
stages {
stage('Clone') {
steps {
git branch: 'main', credentialsId: '8e8302f1-6b98-4bfe-9981-2e027e49089b', url: 'https://github.com/juno-choi/jayeon-login.git'
}
}
stage('Clean') {
steps {
sh 'cd /var/jenkins_home/workspace/login'
sh 'chmod +x gradlew'
sh './gradlew clean'
}
}
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('HUB Push') {
steps {
sh 'docker build -t ililil9482/login:1.0 .'
sh 'docker push ililil9482/login:1.0'
}
}
stage('Down') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose down',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
stage('Up') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'publisher',
transfers: [
sshTransfer(cleanRemote: false,
excludes: '',
execCommand: 'cd /msa/login && sudo docker-compose up -d',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)
])
}
}
}
}
정상적으로 login-service가 등록이 되었다. 이제 요청을 해보자!
👊테스트
✅회원가입
포스트맨에서 지정된 url로 회원가입을 요청했고 정상적으로 실행되었다.
그 후에 db에도 우리가 생각한 로직대로 정상적으로 로그인처리가 되었다.
✅로그인
정상적으로 로그인 처리되었으며 token을 발급하여 반환하는 로직을 확인할 수 있다.
당장 kafka까지 필요하지 않아서 서비스 자체에서 db로 insert를 날리고 있지만 order service를 개발하면서 kafka로 변경하는 작업을 진행해야겠다.
✖️적용하면서 헤맸던 점
maria db의 데이터가 컨테이너를 내렸다 올려도 그대로 살아있어야 하는데 데이터가 날라가는 현상이 있었다. 다른 mariadb는 /var/lib/mysql
아래에 데이터가 저장되어서 해당 경로로 볼륨을 잡았다고 했기에 나도 그렇게 했다. 근데 데이터가 볼륨 폴더 안에 아무것도 저장되지 않았다. 그래서 찾아본 결과
내 데이터베이스는 왜 인지는 아직 모르겠으나 /config/databases
아래로 잡혀있는 것이였다 ㅜㅜ 그래서 해당 경로로 볼륨을 잡아서 실행해주니 컨테이너가 내렸다 올라와도 정상적으로 실행되었다!
Author And Source
이 문제에 관하여(Login Service 적용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ililil9482/Login-Service-적용하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)