Spring Cloud + MSA 애플리케이션 개발 16(애플리케이션 배포 2 - Docker Container)

지원·2024년 3월 5일
0

MSA개발

목록 보기
15/15

Zipkin

  • zipkin.io 에 들어가보면 quickstart 에서 Docker 부분을 보면 컨테이너로 바로 실행할 수 있는 명령이가 있다.
  • docker run -d -p 9411:9411 openzipkin/zipkin
  • 여기에 --network , -name 만 넣어주면 된다.
  • docker run -d -p 9411:9411 --network ecommerce-network --name zipkin openzipkin/zipkin

Deployed Services

앞으로 user-service , order-serivce , catalog-service 를 배포할 것인데 해당 service 들은 Ip Address 는 크게 상관하지 않아도 된다.

  • 어차피 apigateway-service 를 통해서 가기 떄문에 IP 주소는 상관없다.

User Microservice

Dockerfile 만들고 Image 만들고 Container 만들기

현재 git 에 올린 user-service.application.yml 에서는 gateway:ip 부분에 실제 apigateway-service 의 ip 주소를 넣어줘야 한다.

  • 주소를 알기 위해서 docker inspect apigateway-service 명령어를 실행하면 된다.
  • 그래서 저 정보는 우리가 config-service 에서 가져오는데, 해당 정보는 git 에다가 올리고 사용하기 때문에 git 에 들어가서 user-service.yml 파일을 수정하면 된다.

Dockerfile

FROM openjdk:21-ea-11-slim
VOLUME /tmp
COPY target/user-service-1.0.jar UserService.jar
ENTRYPOINT ["java","-jar","UserService.jar"]

mvn comile -> docker build -> docker run

  1. mvn clean compile package -DskipTests=true
  2. docker build -t supportkim/user-service:1.0 .
    -> 필요하다면 docker push supportkim/user-service:1.0
  3. docker run -d --network ecommerce-network --name user-service
    -e "spring.cloud.config.uri=http://config-service:8888"
    -e "spring.rabbitmq.host=rabbitmq"
    -e "spring.zipkin.base-url=http://zipkin:9411"
    -e "eureka.client.service-url.defaultZone=http://discovery-service:8761/eureka/"
    -e "logging.file=/api-logs/users-ws.log"
    supportkim/user-service:1.0
  • config-service 와 연동하기 위해 연결
  • rabbitmq 정보 넘기기
  • zipkin 정보 넘기기
  • 유레카 서버에 등록하기 위해서 eureka url 넘기기
  • 로그 저장을 위한 파일
  • supportkim/user-service:1.0 이라는 이미지로 컨테이너 생성
  • 접근할 때 http://CONATAINER_NAME:PORT번호 으로 접근하면 된다.

유레카 서버에 들어가보면 user-service 가 정상적으로 등록된 것을 확인할 수 있다.

Order Microservice

Dockerfile 만들고 Image 만들고 Container 만들기

@EnableKafka
@Configuration
public class KafkaProducerConfig {

    @Bean
    public ProducerFactory<String,String> producerFactory() {
    // 서버 주소 변경
        Map<String,Object> properties = new HashMap<>();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "172.18.0.101:9092"); 
    }
}
  • local 주소를 현재 컨테이너에 올린 kafka IP 주소로 바꿔줘야 한다.
  • 추가로 application.yml 파일에서 datasource 를 h2 에서 mariadb 로 바꿔준다.

DockerFile

FROM openjdk:21-ea-11-slim
VOLUME /tmp
COPY target/order-service-1.0.jar OrderService.jar
ENTRYPOINT ["java","-jar","OrderService.jar"]

mvn compile -> docker build -> docker run

docker run -d --network ecommerce-network
--name order-service
-e "spring.cloud.config.uri=http://http://config-service:8888"
-e "spring.rabbitmq.host=rabbitmq"
-e "spring.zipkin.base-url=http://zipkin:9411"
-e "eureka.client.service-url.defaultZone=http://discovery-service:8761/eureka/
-e "logging.file=/api-logs/orders-ws.log"
-e "spring.datasource.url=jdbc:mariadb://mariadb:3306/mydb"
supportkim/order-service:1.0

Catalog Microservice

Dockerfile 만들고 Image 만들고 Container 만들기

@EnableKafka
@Configuration
public class KafkaConsumerConfig {
    @Bean
    public ConsumerFactory<String,String> consumerFactory() {
        Map<String,Object> properties = new HashMap<>();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "172.18.0.101:9092");
}
  • order-service 와 비슷한 맥락으로 Consumer 부분을 수정

mvn clean compile -> docker build -> docker run

  • docker build -t supportkim/catalog-service:1.0 .
  • docker push supportkim/catalogs-service:1.0

docker run -d --network ecommerce-network
--name catalogs-service
-e "spring.cloud.config.uri=http://http://config-service:8888"
-e "spring.rabbitmq.host=rabbitmq"
-e "eureka.client.service-url.defaultZone=http://discovery-service:8761/eureka/
-e "logging.file=/api-logs/orders-ws.log"
supportkim/catalog-service:1.0

Test

그동안 테스트 했던 것 처럼 POSTMAN 으로 회원가입 , 로그인 , /health , 조회 , 주문등등 다양한 요청이 정상적으로 호출된다.

local 에서 직접 서버를 하나하나씩 띄우지 않고 같은 네트워크안에 컨테이너를 올려서 사용한 것이다!

Multi Profiles

  • mvn spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=production
  • java -Dspring.profiles.active=default XXXX.jar

개발 환경은 Local IP 로 , 상용 환경은 AWS EC2 로 개발하려고 한다고 가정해보자.

  • 전에 했던것 처럼 상용 환경에서 A-dev.yml , A-prod.yml 이런식으로 설정한 다음에 상황에 맞게 원하는 yml 파일을 적용시킬 수 있다.

@Profile

@Component
@Profile("dev")
public class RedisConnector {
}

@Component
@Profile("prod")
public class MysqlConnector {
}
  • 위와 같이 @Profile 애노테이션을 사용해도 된다.

참고자료

profile
덕업일치

0개의 댓글