MSA Dockerizing 2

letthem·2025년 3월 18일

LG CNS AM CAMP 1기

목록 보기
34/42
post-thumbnail

MSA Dockerizing 1에 이어서 ..

apigateway-service 삭제 후 다시 만들기

mvn clean compile package -DskipTests=true

docker build --no-cache --tag apigateway-service:1.0 -f Dockerfile .

docker run -d -p 8000:8000 -e spring.rabbitmq.host=rabbitmq --network ecommerce-network --name apigatway-service apigateway-service:1.0

테스트 전략 중요
1. Unit Test
2. 통합 Test : 123,234, 345, 456
3. Component Test : 주고받는 데이터 확인 1->2, 2->3. unit간 통신 테스트
4. Contract Test : microservice API 테스트
5. End to End Test : 처음부터 끝까지
위로 갈 수록 일 많음. 아래로 내려갈 수록 비용 높아짐

나중에 팀플할 때도 테스트 전략 먼저 짜고 테스트 시나리오 짜기!

kafka server RUN

docker run -d -p 9092:9092 --name broker --network ecommerce-network apache/kafka:latest

Zipkin 네트워크 추가

zipkin으로 cd

  1. docker-compose
  • network 옵션
version: '3'
services:
  zipkin:
    image: openzipkin/zipkin
    ports:
      - "9411:9411"
    environment:
      - STORAGE_TYPE=mysql
      - MYSQL_DB=zipkin
      - MYSQL_USER=zipkin
      - MYSQL_PASS=zipkin
      - MYSQL_HOST=mysql
    networks: # 추가
      my-network:
  mysql:
    image: mysql:5.7
    platform: linux/amd64
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: zipkin
      MYSQL_USER: zipkin
      MYSQL_PASSWORD: zipkin
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3307:3306"
    networks: # 추가
      my-network:

# 추가
networks:
  my-network:
    external: true
    name: ecommerce-network
  1. docker network connect
  • container 추가

1번 방법으로 한 이후,
docker-compose up -d : docker-compose.yml 바탕으로 이미지 빌드

docker network inspect ecommerce-network
이렇게 7가지 서비스가 ecommerce-network에 잘 연결된 것을 확인할 수 있다.

"Name": "broker",
"IPv4Address": "172.19.0.5/16",
 
"Name": "rabbitmq",
"IPv4Address": "172.19.0.4/16",
 
"Name": "service-discovery",
"IPv4Address": "172.19.0.3/16",
  
"Name": "zipkin-mysql-1",
"IPv4Address": "172.19.0.8/16",
   
"Name": "zipkin-zipkin-1",
"IPv4Address": "172.19.0.7/16",
    
"Name": "apigatway-service",
"IPv4Address": "172.19.0.6/16",
      
"Name": "config-service",
"IPv4Address": "172.19.0.2/16",

mariadb도 연결

docker run -d -p 3306:3306 --name mariadb-server --network my-network -e MARIADB_ROOT_PASSWORD=test1357 mariadb:latest


🖥️ Order service


원래는 이렇게 localhost:9092로 잘 동작했지만,

이젠

broker:9092 이렇게 컨테이너 이름으로 바꿔야한다.


여기에서도 localhost 대신 mariadb-server로 이름을 바꾸어줘야한다.

  • application.yml 파일 직접 바꾸는 방법
  • 또는 아래처럼 -e 옵션으로 동적으로 설정 바꿀 수도 있다.

주석 해제

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

@EnableKafka
@Configuration
public class KafkaProducerConfig {
    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> properties = new HashMap<>();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker:9092");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        return new DefaultKafkaProducerFactory<>(properties);
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
}

하드 코딩 VS 동적 실행

=> 동적 실행 ❤️

broker:9092로 변경 (java 파일이므로 command line에서 직접 수정 불가 -> 하드코딩. 바뀔 가능성은 있다.)
하드 코딩하면 빌드 다시해야 함 -> 도커 이미지 생성 -> 부득이하게 서버 downtime 거쳐야 함

java 파일 말고 카프카 관련 설정을 application.yml 이런 데서 갖고오도록 코드를 바꿔서
command line에서 -e 옵션으로 실행 시점에 동적으로 바꿀 수 있음. 매번 command line 치기 번거로우니 따로 yml 바꿔서 호출 -> script 실행

command line에서 명령어로 치는 법

docker run -d --network ecommerce-network \
--name order-service \
-e "spring.zipkin.base-url=http://zipkin-zipkin-1:9411" \
-e "eureka.client.serviceUrl.defaultZone=http://service-discovery:8761/eureka/" \
-e "spring.datasource.url=jdbc:mariadb://mariadb-server:3306/mydb" \
-e "spring.rabbitmq.host=rabbitmq" \
-e "management.zipkin.tracing.endpoint=http://zipkin-zipkin-1:9411/api/v2/spans" \
order-service:1.0

order-service>docker-compose.yml

# Use root/example as user/password credentials
version: '3.1'

services:
  order-service:
    image: order-service:1.0

    environment:
      spring.rabbitmq.host: rabbitmq
      spring.zipkin.base-url: http://zipkin-zipkin-1:9411
      spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
      eureka.client.service-url.default-zone: http://service-discovery:8761/eureka/
      management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans
    networks:
      my-network:

networks:
  my-network:
    external: true
    name: ecommerce-network

order-service로 cd

mvn clean compile package -DskipTests=true

Dockerfile 만들기

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

빌드
docker build --tag order-service:1.0 -f Dockerfile .

실행
> ==docker-compose -f docker-compose-order.yml up -d

에러나서 kafka(broker)랑 order-service 다시 내리기

zipkin에 docker-compose-kafka.yml 만들기

# Use root/example as user/password credentials
version: '3.1'

services:
  broker:
    image: apache/kafka:latest
    ports:
      - "9092:9092"
    container_name: broker
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://broker:9092,CONTROLLER://broker:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3
    networks:
      my-network:

networks:
  my-network:
    external: true
    name: ecommerce-network

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092 이게 없어서 났던 오류임. 위처럼 설정해주고 다시 up 시키면 오류 안 남

zipkin으로 이동해서
docker-compose -f docker-compose-kafka.yml up -d


kafka(broker)가 zipkin 안에서 실행되는 중

docker-compose -f .\docker-compose-kafka.yml exec -it broker bash
컨테이너 내부 진입

e9734eedb6b5:/$ cd /opt/kafka/bin
e9734eedb6b5:/opt/kafka/bin$ ./kafka-topics.sh --bootstrap-server broker:9092 --list

접속 잘 된 것 확인 !

다시 order-service로 와서
order-service 이미지 지우고

mvn clean compile package -DskipTests=true

docker build --no-cache --tag order-service:1.0 -f .\Dockerfile .

docker-compose -f .\docker-compose-order.yml up -d

이제 order-service 잘 작동된다 !!!!!!!!!!!!!!

주문 🔽

orders 테이블 확인 🔽

전체 🔽

🖥️ Catalog service

catalog-service 기동

  1. catalog-service 소스 코드 수정
    • 현재 DB는 H2를 사용하고 있음
    • H2를 Mariadb로 변경해도 됨
  2. maven build
  3. docker image 생성
  4. docker-composer 파일 또는 docker 명령어 실행
  5. catalog-service가 기동되면서, 재고의 수량이 업데이트되는지 확인

KafkaConsumerConfig
broker:9092로 수정

application.yml

server:
  port: 20000

spring:
  application:
    name: catalog-service
  zipkin:
    base-url: http://127.0.0.1:9411
    enabled: true
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true
    database: MYSQL
    defer-datasource-initialization: true # 테이블을 가장 먼저 생성
  sql:
    init:
      mode: always
  #  datasource:
  #    driver-class-name: org.h2.Driver
  #    url: jdbc:h2:mem:testdb
  #    username: sa
  #   password:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/mydb
    username: root
    password: test1357
#    data: classpath:post.sql

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka

management:
  tracing:
    sampling:
      probability: 1.0
    propagation:
      consume: b3
      produce: b3_multi
  zipkin:
    tracing:
      endpoint: "http://localhost:9411/api/v2/spans"
  endpoints:
    web:
      exposure:
        include: health, httptrace, info, metrics, prometheus

logging:
  level:
    com.example.catalogservice: INFO
  pattern:
    correlation: '%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]'

여기서

  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true
    database: MYSQL
    defer-datasource-initialization: true # 테이블을 가장 먼저 생성
  sql:
    init:
      mode: always

이 코드로 인해 테이블 생성을 가장 먼저 한다

pom.xml에 추가

<!-- Mariadb -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.7.2</version>
</dependency>

Dockerfile

FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/catalog-service-1.0.jar catalog-service.jar
ENTRYPOINT ["java", "-jar", "catalog-service.jar"]

docker-compose-catalog.yml

# Use root/example as user/password credentials
version: '3.1'

services:
  catalog-service:
    image: catalog-service:1.0

    environment:
      spring.zipkin.base-url: http://zipkin-zipkin-1:9411
      spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
      eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
      management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans

    networks:
      my-network:

networks:
  my-network:
    external: true
    name: ecommerce-network

실행 순서

  1. 스프링 빌드
    mvn clean compile package -DskipTests=true
  2. 도커 이미지 생성
    docker build --no-cache --tag catalog-service:1.0 -f .\Dockerfile .
  3. 이미지로 컨테이너 실행
    docker-compose -f .\docker-compose-catalog.yml up -d

초기 상태

10개씩 두 번 POST

100 -> 80 로 stock 줄어든 것 확인

  • order-service: 메시지 발행(producer)
  • kafka: 중간 브로커
  • catalog-service: 메시지에서 정보 빼와서 자기 DB에 반영(consumer)

현 상태 🔽

0개의 댓글