
MSA Dockerizing 1에 이어서 ..
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 : 처음부터 끝까지
위로 갈 수록 일 많음. 아래로 내려갈 수록 비용 높아짐
나중에 팀플할 때도 테스트 전략 먼저 짜고 테스트 시나리오 짜기!
docker run -d -p 9092:9092 --name broker --network ecommerce-network apache/kafka:latest
zipkin으로 cd
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-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",

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

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

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

여기에서도 localhost 대신 mariadb-server로 이름을 바꾸어줘야한다.
주석 해제
<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 소스 코드 수정
- 현재 DB는 H2를 사용하고 있음
- H2를 Mariadb로 변경해도 됨
- maven build
- docker image 생성
- docker-composer 파일 또는 docker 명령어 실행
- 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
실행 순서
- 스프링 빌드
mvn clean compile package -DskipTests=true- 도커 이미지 생성
docker build --no-cache --tag catalog-service:1.0 -f .\Dockerfile .- 이미지로 컨테이너 실행
docker-compose -f .\docker-compose-catalog.yml up -d
초기 상태

10개씩 두 번 POST

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

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