마이크로서비스 방식의 ecommerce형 backend
패키지명 공통 : com.hwan2272.msaecomms.xxx
Microservice(구성개념)
Spring Cloud + SpringBoot + Spring Security + JWT + Spring Data jpa +
H2 Database||MariaDB + RabbitMQ + Kafka(Zookeeper, Kafka Server/Producer/Consumer, Kafka Connect, Kafka Sink) +
CircuitBreaker(Resilience4J) + Sleuth + Zipkin +
Prometheus + Grafana +
Docker + AWS EC2 +
(Spring Rest docs + Kubernetes)
- discovery-service 구동 : 포트 8761 - eureka 서버 - 127.0.0.1:8761 접속
- gateway-service 구동 : 포트 8000 - 각 api로 연결되는 gateway 서비스
- config-service 구동 : 포트 8888 / RabbitMQ 구동 : (자동구동), 포트 5672
- user-service 및 기타 service 구동 : 포트 랜덤
config-service 구동이 user-service등보다 늦었을 경우, busrefresh사용하여 config 재적용
Window 환경 - Window PowerShell 실행
- zookeeper 구동 - .\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
- Kafka server 구동 - .\bin\windows\kafka-server-start.bat .\config\server.properties
--테스트시--
- Kafka producer 구동 및 토픽설정 - .\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic quickstart-events (토픽명 임의 지정)
- Kafka consumer 구동 및 토픽설정 - .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic quickstart-events (토픽명 임의 지정)
- producer에서 message 입력 -> consumer에서 표시되는지 확인
Window 환경 - Window PowerShell 실행
- Kafka connect(distributed) 구동 - .\bin\windows\connect-distributed.bat .\etc\kafka\connect-distributed.properties
- sink connect 생성 - POST localhost:8083/connectors (body내용-orders테이블용) { "name": "my-sink-topic-orders-connect", "config": { "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", "connection.url": "jdbc:mysql://localhost:3306/mydb", "connection.user": "root", "connection.password": "test1357", "key.converter": "org.apache.kafka.connect.json.JsonConverter", "value.converter": "org.apache.kafka.connect.json.JsonConverter", "key.converter.schemas.enable": true, "value.converter.schemas.enable": true, "auto.create": "true", "auto.evolve": "true", "delete.enabled": "false", "tasks.max": "1", "topics": "orders" } }
- connectors status 확인 - http://localhost:8083/connectors?expand=info&expand=status
적용시 2개 orderService에서 Kafka connect를 바라보며 POST orders호출시 connect에 담겨진 메세지가 MariaDB로 이관 insert됨
- docker pull openzipkin/zipkin
- docker run -d -p 9411:9411 openzipkin/zipkin
- localhost:9411/zipkin
- POST localhost:8000/users/users - 사용자 가입 (users insert)
- POST localhost:8000/users/login - 로그인 (JWT발급)
- POST localhost:8000/users/actuator/busrefresh - 전모듈 config 정보 refresh (재가동 없음)
- GET localhost:8000/users/users/{userId} - 사용자 정보 조회
- POST localhost:8000/orders/{userId} - 주문하기 (orders insert)
- GET localhost:8000/orders/{userId}/orders - 사용자의 주문 정보 조회
- GET localhost:8000/product/{productId} - 상품 정보 조회
4~7 에는 Authorization header 필요 (Bearer JWT)
추가 EndPoint (kafka connect)
- GET localhost:8083/connectors/{connectorName}
- GET localhost:8083/connectors?expand=info&expand=status
- POST localhost:8083/connectors
- DELETE localhost:8083/connectors/{connectorName}
... 등등
- docker build --tag hwan2272/user-service:1.0 .
- docker push hwan2272/user-service:1.0 => https://hub.docker.com/repository/docker/hwan2272/user-service
- docker pull hwan2272/user-service:1.0
AWS EC2 배포, Docker 구동 (예시)
- https://hub.docker.com/repository/docker/hwan2272/discovery-service
- https://hub.docker.com/repository/docker/hwan2272/gateway-service
- https://hub.docker.com/repository/docker/hwan2272/config-service
- 이도원님 강의 (https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4) 및 소스(https://github.com/joneconsulting/msa_with_spring_cloud) 기반 환경 구성
- 김영한님 강의 (https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84) 기반 Data JPA 구성
- 기타 독학 부분
- 강의에서는
- Data JPA를 사용하지 않았지만 본 소스에서는 Data JPA를 적용하고, 이에 대한 보충작업등을 추가
- @Test를 사용하지 않았으나 본 소스에서는 사용, entity 정도는 test해보는 로직 추가
- gatewayService의 AuthorizationHeaderFilter에서 JWT를 검증부분이 미흡하여 본 소스에서는 userFeignClient도입하였으나 실패, 다른방법 구상중
- local PC에 Docker별 배포로 구축하고 끝났지만 본 소스에서는 AWS EC2를 사용하여 배포해봄
- java docs 등도 없지만 본 소스에서는 Spring Rest Docs 적용 (진행중 - productService)
--적용 테스트
--테스트로 인해 adoc 생성
-
소스 리팩토링 - orderService KafkaConnectOrderDto V1- 예제상 4개 클래스 통합화, V2- schema, payload 세팅 소스간략화 시도 => 성공, 커뮤니티 공유 (https://www.inflearn.com/chats/541160)
-
MSA방식이라 모듈별로 나누어져있는 Entity들의 올바른 관리방법 구상중..
-
(본 소스에서는 Spring Cloud의 FeignClient개념으로 MSA간 통신으로 참조문제가 해결되었지만
-
타 MSA 등의 Spring Cloud가 아닐(참조할수 없는) 경우의 표준or올바른 관리 방법은?)
- AWS S3, CloudFront 를 이용한 Frontend단(resources포함) 처리로 인프라 확장
- AWS RDS 를 이용한 DB 서버 관리 확장