{"id":19862404,"url":"https://github.com/cse0518/msa-practice","last_synced_at":"2026-03-02T09:03:39.053Z","repository":{"id":153550529,"uuid":"628907683","full_name":"cse0518/MSA-practice","owner":"cse0518","description":"대규모 시스템 MSA 인프라 구조를 구현해봅니다.","archived":false,"fork":false,"pushed_at":"2024-08-18T10:24:32.000Z","size":106,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-27T09:12:36.406Z","etag":null,"topics":["docker-compose","kafka","netty","spring-cloud-gateway","spring-eureka","webflux"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cse0518.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-17T08:22:47.000Z","updated_at":"2024-09-03T01:27:41.000Z","dependencies_parsed_at":"2024-08-18T11:24:10.541Z","dependency_job_id":null,"html_url":"https://github.com/cse0518/MSA-practice","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cse0518/MSA-practice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cse0518%2FMSA-practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cse0518%2FMSA-practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cse0518%2FMSA-practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cse0518%2FMSA-practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cse0518","download_url":"https://codeload.github.com/cse0518/MSA-practice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cse0518%2FMSA-practice/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29996288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-compose","kafka","netty","spring-cloud-gateway","spring-eureka","webflux"],"created_at":"2024-11-12T15:11:42.475Z","updated_at":"2026-03-02T09:03:39.025Z","avatar_url":"https://github.com/cse0518.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 실행\n\n- 실행 환경\n  - Gradle 7.6.1\n  - Docker 20.10.24\n\n- 실행\n  ```shell\n  # submodules 포함하여 clone (--recursive 옵션)\n  git clone --recursive https://github.com/cse0518/MSA-practice.git\n  \n  # 프로젝트 실행 (docker-compose up → zookeeper 추가 세팅)\n  ./run.sh\n  \n  # docker-compose down\n  docker-compose -f docker/docker-compose.yml -p msa-project down\n  \n  # local 환경에서 jar 파일 백그라운드로 실행 (권장하지 않음)\n  ./script/gradle-build-all.sh # gradle 빌드\n  ./script/run-local.sh # jar 파일 실행\n  ```\n\n\u003cbr/\u003e\n\n## Index\n\n- [프로젝트 소개](#-프로젝트-소개)\n- [기술 스택](#-기술-스택)\n- [주요 내용](#-주요-내용)\n  - [1. 대규모 트래픽 처리를 위한 비동기 처리](#1-대규모-트래픽-처리를-위한-비동기-처리)\n  - [2. 마이크로 서비스들을 관제하기 위해 Spring Eureka 적용](#2-마이크로-서비스들을-관제하기-위해-spring-eureka-적용)\n  - [3. 비동기식으로 작업을 처리하기 위해 MQ(Kafka) 활용](#3-비동기식으로-작업을-처리하기-위해-mqkafka-활용)\n  - [4. 적은 스레드로 많은 요청을 효율적으로 처리하기 위해 Netty 활용](#4-적은-스레드로-많은-요청을-효율적으로-처리하기-위해-netty-활용)\n\n\u003cbr/\u003e\n\n## 📑 프로젝트 소개\n\n![all-structure](https://github.com/user-attachments/assets/4b647fda-76a9-47a9-a290-f94fb4e94fda)\n\n- 마이크로서비스 구조에 **Spring Cloud Gataway**와 **Spring Eureka**를 적용하여 모든 서비스에 대한 인증 및 로드밸런싱을 구현합니다.\n- Eureka Client에서는 WebFlux를 활용하여 비동기적으로 HTTP 요청을 처리합니다.\n- 데이터를 **Kafka**에 Publish, Subscribe 하는 로직을 구현합니다.\n- **Socket 통신**으로 데이터 전송 로직을 구현합니다.\n\n\u003cbr/\u003e\n\n## 🛠 기술 스택\n\n- Java 8, Spring Boot 2.7.10\n- Webflux, Netty\n- Spring Eureka, Spring Cloud Gateway\n- Zookeeper 3.4.13, Kafka 3.4.0\n- Docker 20.10.24\n\n\u003cbr/\u003e\n\n## 📌 주요 내용\n\n\u003cimg src=\"https://user-images.githubusercontent.com/60170616/232970280-115d2eb9-b1af-4fea-9c11-95817cca5a6c.png\" alt=\"https://user-images.githubusercontent.com/60170616/232970280-115d2eb9-b1af-4fea-9c11-95817cca5a6c.png\" width=\"800\"/\u003e\n\n### 1. 대규모 트래픽 처리를 위한 비동기 처리\n\n- 많은 서비스에 대한 Client의 요청이 Gateway를 거쳐 각 서비스에 전달됩니다.\n- Gateway에 집중되는 대규모 트래픽을 빠르게 처리하기 위해 WebFlux를 적용했습니다.  \n  WebFlux는 비동기 Non-Blocking 방식으로 동작하여 적은 수의 스레드로 많은 요청을 처리할 수 있습니다.\n- Spring-Cloud-Gateway는 MSA 구조에서 쉽고 빠르게 로드 밸런싱을 해줍니다.  \n  Netty를 기반의 비동기 Non-Blocking 방식으로 동작하여 빠르게 일을 처리합니다.\n\n\u003cbr/\u003e\n\n### 2. 마이크로 서비스들을 관제하기 위해 Spring Eureka 적용\n\n- Eureka Server에서는 실행중인 서비스들의 호스트와 포트 정보를 등록하고 관리합니다.  \n  마이크로 서비스들이 서로의 주소를 확인하고 통신할 수 있도록 합니다.\n\n\u003cbr/\u003e\n\n### 3. 비동기식으로 작업을 처리하기 위해 MQ(Kafka) 활용\n\n- 각 모듈에서 비동기식으로 요청을 처리하기 위해 MQ(Kafka)를 사용했습니다.\n- 동시에 처리되는 개수를 제어하고, 데이터 복원력 향상을 도모합니다.\n- Kafka 환경을 모니터링 하기 위해 CMAK을 사용했습니다.\n  - Kafka Cluster 및 Topic 등 관리\n  - Kafka Lag 모니터링\n\n\u003cbr/\u003e\n\n\u003cimg src=\"https://github.com/user-attachments/assets/3afa2d02-5214-4d67-9101-bde0a8be13f6\" alt=\"https://github.com/cse0518/MSA-practice/assets/60170616/d2cfe502-3ce4-4625-ad5c-8a8489bbcae7\" width=\"700\"\u003e\n\n### 4. 적은 스레드로 많은 요청을 효율적으로 처리하기 위해 Netty 활용\n\n- Kafka에서 consume 한 데이터를 비동기식으로 효율적으로 처리하기 위해 Netty를 사용했습니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcse0518%2Fmsa-practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcse0518%2Fmsa-practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcse0518%2Fmsa-practice/lists"}