A commerce service designed with MSA and DDD.

Last update: May 3, 2022

commerce

MSA, DDD로 설계하는 commerce 서비스입니다.

본 프로젝트는 완성 기한이 정해져있지 않습니다. 꾸준히 달성해가는 성과들을 바탕으로 더 큰 성장과 서비스의 프로젝트를 개선하기 위한 시도를 할 것입니다. 아직 부족한 부분들이 많은 프로젝트이지만, 점진적으로 꾸준한 개선을 시도하며 좋은 오픈소스가 되었으면 하는 바램입니다.

각 기능들의 자세한 내용은 이곳을 참고해주시면 감사하겠습니다.

Event Storming

event storming

Archiecture

MSA Archiecture

Untitled Diagram drawio (1)

  1. user에서 회원가입을 진행합니다.
  2. 한번 로그인 하면 여러 도메인에서 더 이상의 로그인 없이 이용할 수 있도록 sso 방식으로, auth를 따로 두어 그 곳에서 인증을 하고, 인증에 성공하면 로그인을 진행합니다.
  3. 로그인에 성공하면, api gateway에서 토큰을 받아 사용자 정보를 추출하여 header에 삽입합니다.
  4. api gateway에서 만들어진 토큰을 이용해서 product, order의 인가 작업을 진행하고 신뢰할 수 있는 토큰이면 인가에 성공합니다.
  5. 인가에 성공하면, api gateway header에 있는 사용자 정보를 가져와 상품 생성 및 주문 등을 수행합니다.
  6. 카프카의 토픽과 메세지 큐를 이용해 non-blocking 방식으로 product와 order간에 주문 작업을 진행합니다.
  • 모든 작업은 api gateway를 통해 이루어 집니다.
  • 각각의 서버 모두 독립된 서비스로 나누었기 떄문에, 각 서비스는 독립된 배포 및 분산되고, 자율적으로 개발되고, 크기가 작고, 기능 중심적이고, 자동화된 프로세스로 구축되고 배포됩니다.
  • 또한 각각의 MicroService에서 발생하는 장애가 전체 시스템 장애로 확장되지 않습니다.

데이터 플레인

  • 트래픽을 컨트롤 하는 목적으로 제공하는 영역이고, 데이터 플래인은 Envoy Proxy 를 사용합니다.

Envoy proxy

  • L4, L7 지원, 서버간의 부하 분산량 조절가능합니다.
  • 로드 벨런싱 등 액세스 제어 및 속도제한, 할당량을 지원합니다.
  • Zipkin을 통한 분산트랜젝션 추적 기능 제공합니다.
  • 풍부한 라우팅 규칙, 재시도, 장애 조치등으로 트래픽 동작 제어, 서킷 브래이커등을 제공합니다.
  • http 등 tcp 트래픽에 대한 자동 로드 벨런싱 제공합니다.

컨트롤 플레인

  • 데이터 영역으로 어떤 방식으로 어떠한 트래픽으로 흐르도록 제어하는 영역입니다.
  • 데이터 영역에 대한 컨피그 값을 저장합니다.

Gateway

  • standalone envoy proxy 형태로 istio-ingress-gateway에서 직접적으로 트래픽을 받으며 서비스 메시에 대한 inbound, outbound 트래픽을 관리합니다.

Virtual Service

  • 쿠버네티스 서비스로 라우팅 되게 구성하는 이스티오 오브젝트입니다. 버추얼 서비스가 없는 경우, envoy proxy 는 모든 서비스 인스턴스 간에 라운드로빈 로드 밸런싱을 사용해 트래픽을 분산시킵니다.

DDD -> Hexagonal Architecture(육각형 아키텍쳐)의 구성

Hexagonal-Simplified

핵사고날 아키텍쳐 장점

  1. 아키텍처 확장이 용이합니다.
  2. SOLID 원칙을 쉽게 적용할 수 있습니다.
  3. 모듈 일부를 배포하는 게 용이합니다.
  4. 테스트를 위해 모듈을 가짜로 바꿀 수 있으므로 테스트가 더 안정적이고 쉽습니다.
  5. 더 큰 비즈니스적 가치를 갖고 더 오래 지속되는 도메인 모델에 큰 관심을 둡니다.

헥사고날 아키텍처는 내부(도메인)와 외부(인프라)로 구분됩니다.

  • 내부 영역 - 순수한 비즈니스 로직을 표현하며 캡슐화된 영역이고 기능적 요구사항에 따라 먼저 설계
  • 외부 영역 - 내부 영역에서 기술을 분리하여 구성한 영역이고 내부 영역 설계 이후 설계

포트와 어댑터 - 포트는 내부 비즈니스 영역을 외부 영역에 노출한 API이고 인바운드(Inbound)/아웃바운드(Outbound) 포트로 구분됩니다.

  • 인바운드 포트 - 내부 영역 사용을 위해 노출된 API
  • 아웃바운드 포트 - 내부 영역이 외부 영역을 사용하기 위한 API

어댑터는 외부 세계와 포트 간 교환을 조정하고 역시 인바운드(Inbound)/아웃바운드(Outbound) 어댑터로 구분됩니다.

  • 인바운드 어댑터 - 외부 애플리케이션/서비스와 내부 비즈니스 영역(인바운드 포트) 간 데이터 교환을 조정
  • 아웃바운드 어댑터 - 내부 비즈니스 영역(아웃바운드 포트)과 외부 애플리케이션/서비스 간 데이터 교환을 조정

결국 이 구조의 핵심은 비즈니스 로직이 표현 로직이나 데이터 접근 로직에 의존하지 않는 것입니다.

use tech

  • springboot, kotlin, kotest, docker, mysql, flyway DB, redis, spring security, kafka, zookeeper, github action CI, Kotest(BDD)

GitHub

https://github.com/Hyung1Jung/commerce
Comments
  • 1. apply Resilience4j circuit breaker to prevent the spread of disability.

    Fixes #37

    상세 내용

    api gateway에서 마이크로 서비스의 api 호출 시, 마이크로 서비스의 장애가 발생하여 지연시간이 생기면서 호출하는 api gateway까지 장애가 확산 될 우려가 있음.

    • Resilience4j의 서킷브레이커를 이용하여 해결
    • 지연 발생 시, fallback method를 호출하여 "일시적으로 지연이 발생했습니다"라는 메시지 응답
    Reviewed by Hyung1Jung at 2022-02-18 14:52
  • 2. apply Resilience4j circuit breaker to prevent the spread of disability.

    AS-IS

    api gateway에서 마이크로 서비스의 api 호출 시, 마이크로 서비스의 장애가 발생하여 지연 시간이 생긴다면 호출하는 api gateway에도 장애가 발생할 우려가 있음

    TO-BE

    api gateway에서 마이크로 서비스의 api 호출 시, 마이크로 서비스의 장애가 발생하여 지연시간이 생기면서, 호출하는 api gateway까지 장애가 확산 되는 것을 Resilience4j의 서킷브레이커를 이용하여 해결

    Reviewed by Hyung1Jung at 2022-02-18 12:42
  • 3. apply of istio, the implementation of the service mesh pattern

    • Kubernetes용 Deployment.yaml 을 작성하고 Kubernetes에 Deploy를 생성합니다.
    • Kubernetes용 Service.yaml을 작성하고 Kubernetes에 Service/LoadBalancer을 생성하여 Gateway 엔드포인트를 확인합니다.
    Reviewed by Hyung1Jung at 2022-01-28 16:57
  • 4. Kubernetes용 Deployment.yaml, Service.yaml 추가

    • Kubernetes용 Deployment.yaml 을 작성하고 Kubernetes에 Deploy를 생성함
    • Kubernetes용 Service.yaml을 작성하고 Kubernetes에 Service/LoadBalancer을 생성하여 Gateway 엔드포인트를 확인함.
    Reviewed by Hyung1Jung at 2022-01-28 15:23
  • 5. apply customAuthFilter to product service, order service

    이전 feature에서는 auth service에서 생성된 토큰을 api gateway에서 받아 온 후에, 다른 microService에 인가 작업을 수행하는 기능을 구현하였습니다. 그리고 이번 feature에서는

    product, order service에서 사용자 정보가 필요할 때마다 auth service나 user service에 불필요하게 접근하지 않게 하기 위해서

    • api gateway에서 토큰에 들어있는 사용자 정보를 파싱해서 header에 추가하였습니다.
    • 그리고, product, order service의 request를 proxy 하고 있는 api gateway의 header를 통해 간단하게 사용자 정보를 받아오도록

    customAuthFilter를 수정하고 product, order service에 customAuthFilter를 적용하였습니다.

    Reviewed by Hyung1Jung at 2022-01-25 16:47
  • 6. apply customAuthFilter to product service, order service

    • product, order service에 customAuthFilter가 적용되어 있지 않습니다.
    • product, order service에서 사용자 정보를 받아올 수 없습니다.

    따라서,

    product, order service에서 사용자 정보가 필요할 때마다 auth service나 user service에 불필요하게 접근하지 않게 하기 위해서

    • api gateway에서 토큰에 들어있는 사용자 정보를 파싱해서 헤더에 추가하고,
    • product, order service에서 api gateway의 header를 통해 간단하게 사용자 정보를 받아오도록

    customAuthFilter를 수정하고 product, order 서비스에 customAuthFilter를 적용합니다.

    Reviewed by Hyung1Jung at 2022-01-25 16:44
  • 7. api gateway에 인가 기능 추가 및 토큰에서 사용자 정보 추출 후 헤더에 삽입

    • api gateway에 인가 기능을 추가합니다.
    • api gateway에서 토큰을 파싱하여 유저 정보 추출 후 header에 삽입합니다.
      • 다른 마이크로 서비스들에서 사용자 정보가 필요할 때, api gateway header를 통해 쉽게 사용자 정보를 가져올 수 있게 하기 위함입니다.
    Reviewed by Hyung1Jung at 2022-01-23 14:52
  • 8. api gateway에 인가 기능 추가 및 토큰에서 사용자 정보 추출 후 헤더에 삽입

    • api gateway에 인가 기능이 없습니다.
    • user, auth, product, auth 서비스들이 모두 따로 있기 때문에, product, auth에서 사용자 정보를 얻어오려면 모든 서비스마다 거대하고 중복적인 로직들을 구현해야 하는 문제 점이 발생합니다.

    따라서,

    • api gateway에서 토큰을 파싱하여 유저 정보 추출 후 header에 삽입합니다.
      • 다른 마이크로 서비스들에서 사용자 정보가 필요할 때, api gateway header를 통해 쉽게 사용자 정보를 가져올 수 있게 하기 위함입니다.
    Reviewed by Hyung1Jung at 2022-01-23 14:51
  • 9. apply distributed transactions for saga patterns to product and order domain

    • 여러 마이크로서비스들이 독립적으로 존재하기 때문에 각각의 마이크로서비스에서 발생하는 db access 작업을 하나의 트랜잭션으로 묶기 위해서는 추가적인 고민
    • 따라서, 마이크로서비스들끼리 이벤트를 주고받아 특정 마이크로서비스에서의 작업이 실패하면 이전까지 작업이 완료된 마이크로서비스들에게 보상 (complementary) 이베트를 소싱함으로써 분산 환경에서 atomicity를 보장하는 패턴인 사가 패턴 적용
    Reviewed by Hyung1Jung at 2022-01-26 13:47
Team management service is a production ready and fully tested service that can be used as a template for a microservices development.
Team management service is a production ready and fully tested service that can be used as a template for a microservices development.

team-mgmt-service Description Team management service is a production ready and fully tested service that can be used as a template for a microservice

May 3, 2022
Accessibility-Service - Filter url from browser by using accessibility service
Accessibility-Service - Filter url from browser by using accessibility service

Accessibility Service example Filter url from browser by using accessibility ser

Feb 9, 2022
An e-commerce mobile application built using Android Studio + Java + Firebase.
An e-commerce mobile application built using Android Studio + Java + Firebase.

E-Commerce An e-commerce mobile application built using Android Studio + Java + Firebase. Login for : [email protected] 123456 Screenshots of the app : L

May 17, 2022
Learn how to make an app designed for single-screen devices shine when running on foldable and dual-screen devices

dcberlin21-workshop Make your app shine om foldable devices with the samples we have here. Related links SDK open-source code SDK samples (Kotlin) App

Oct 26, 2021
An Intentionally designed Vulnerable Android Application built in Kotlin.

?? InsecureShop InsecureShop is an Android application that is designed to be intentionally vulnerable. The aim of creating this app is to teach devel

May 7, 2022
Climby is designed to put climbers in contact with each other
Climby is designed to put climbers in contact with each other

Climby Con el nuevo 'BOOM' de la escalada, se vio la necesidad de crear un app donde los usuarios puedan publicar o unirse a viajes, sin la necesidad

Jan 10, 2022
Go Outside is an augmented reality app designed for our team's Software Engineering UI/UX class
Go Outside is an augmented reality app designed for our team's Software Engineering UI/UX class

Go Outside Go Outside is an augmented reality app designed for our team's Software Engineering UI/UX class. This app serves as a PROTOTYPE to demonstr

May 11, 2022
A backend service that generates a random 32-chars length message and its sha256 hashcode and put them to DB
A backend service that generates a random 32-chars length message and its sha256 hashcode and put them to DB

This is an Android application in which a user can ask the server to generate a random message and its sha256, and ask to obtain this info from the server.

Apr 11, 2022
Service exposes sensitive administration APIs to initialize and set lower level of Slurpanize infrastructure

slurpanize-baker Project This project uses Quarkus, the Supersonic Subatomic Java Framework. If you want to learn more about Quarkus, please visit its

Nov 25, 2021
Android Github service with paging, hilt and retrofit

github-paging-hilt-retrofit This repository contains a simple app that implements Dagger-Hilt in MVVM architecture, Retrofit using Kotlin. The app has

Dec 28, 2021
Starter project to create a simple RESTful web service in Kotlin

Modified: Adding Koin for DI Using JWT for authentication and authorization Dropping proprietary FlyAway tool Single Page Application support Starter

Oct 23, 2021
Demo Spting REST Service on Kotlin. Works with PostgreSQL via Spring Data. Data initialization provided by liquibase

Spring Boot REST API with Kotlin Spring Boot REST API service. Spring Data with PostgreSQL. Data initialization with Liquibase. Swagger UI Reference D

Nov 14, 2021
Template for a modern spring web service.

Spring Service Scaffold A scaffold for a web service operating with a Spring Framework backend, reactjs as frontend and a continuous testing and build

Nov 15, 2021
Block unknown callers with this call screening service.
Block unknown callers with this call screening service.

Silence Block unknown callers with this call screening service. By default numbers not in your contact list are blocked. Optionally allow: Numbers you

May 16, 2022
The home of the amigo-platform which serves as the main service for the amigo multimedia platform

amigo-platform This is the home of the amigo-platform which serves as the main service for the amigo multimedia platform. Authentication with JWT Toke

Nov 22, 2021
intera.kt is a Kotlin library for interacting with the Discord Interactions API through a gateway service or a REST API.

?? Overview ⚠️ WARNING: intera.kt is a work in progress. It is not yet ready for use. You may encounter bugs and other issues, but please report if yo

Nov 30, 2021
intera.kt is a Kotlin library for interacting with the Discord Interactions API through a gateway service or a REST API.

?? Overview ⚠️ WARNING: intera.kt is a work in progress. It is not yet ready for use. You may encounter bugs and other issues, but please report if yo

Nov 30, 2021
A tip app which the user can use a screen bar to choose a tip based on the service, the total is then displayed.

Tip Calculator Spencer Damon Tippy Total computes the tip and total amount for a bill. The app uses the base amount and tip percentage to calculate th

Jan 3, 2022
(National Service Scheme) displays a list of activities organised by a committee
(National Service Scheme) displays a list of activities organised by a committee

NSS NSS (National Service Scheme) displays a list of activities organised by a c

Feb 14, 2022