{"id":19233361,"url":"https://github.com/hoangtien2k3/saga-pattern-microservice","last_synced_at":"2025-04-11T02:40:42.855Z","repository":{"id":236540923,"uuid":"792809750","full_name":"hoangtien2k3/saga-pattern-microservice","owner":"hoangtien2k3","description":"Demo - Saga Pattern Microservice Spring Boot 3","archived":false,"fork":false,"pushed_at":"2024-07-26T04:56:16.000Z","size":281,"stargazers_count":6,"open_issues_count":5,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T00:17:03.730Z","etag":null,"topics":["microservices-architecture","saga-pattern","spring-boot-3"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hoangtien2k3.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2024-04-27T16:36:32.000Z","updated_at":"2025-02-23T23:25:34.000Z","dependencies_parsed_at":"2024-11-09T16:11:43.833Z","dependency_job_id":null,"html_url":"https://github.com/hoangtien2k3/saga-pattern-microservice","commit_stats":null,"previous_names":["hoangtien2k3/saga-pattern-microservice-spring-boot-3","hoangtien2k3/saga-pattern-microservice"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoangtien2k3%2Fsaga-pattern-microservice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoangtien2k3%2Fsaga-pattern-microservice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoangtien2k3%2Fsaga-pattern-microservice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoangtien2k3%2Fsaga-pattern-microservice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hoangtien2k3","download_url":"https://codeload.github.com/hoangtien2k3/saga-pattern-microservice/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248330950,"owners_count":21085808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["microservices-architecture","saga-pattern","spring-boot-3"],"created_at":"2024-11-09T16:10:17.847Z","updated_at":"2025-04-11T02:40:42.832Z","avatar_url":"https://github.com/hoangtien2k3.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Saga Pattern Microservices\r\n\r\n![CircleCI](https://img.shields.io/circleci/build/github/uuhnaut69/saga-pattern-microservices/master?color=green\u0026logo=circleci\u0026style=for-the-badge)\r\n![Maven Central](https://img.shields.io/maven-central/v/org.springframework.boot/spring-boot-starter-parent?color=green\u0026label=spring-boot\u0026logo=spring-boot\u0026style=for-the-badge)\r\n![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/confluentinc/cp-kafka/7.5.0?color=green\u0026label=confluent\u0026logo=apache-kafka\u0026logoColor=green\u0026style=for-the-badge)\r\n\r\nSimple order flow to demo some concepts: ⚡ = 💗💎❤️\r\n\r\n- Microservices using `Spring Boot`, `Spring Cloud`, `Spring Cloud Stream`\r\n- Database per service using `Postgresql`\r\n- Saga Pattern (Saga Orchestration): Distributed transaction span multiple services.\r\n- Outbox Pattern: Avoid dual-writes, no 2PC required using `Kafka`,`Kafka Connect`, `Debezium`\r\n  , `Outbox Event Router`\r\n\r\n![1](1.png)\r\n\r\n## Choreography in SAGA Pattern\r\n\r\n![2](2.png)\r\n\r\n## Orchestration-based saga\r\n\r\n![3](3.png)\r\n\r\n## Prerequisites\r\n\r\n- `Java 17`\r\n- `Docker`\r\n- `Docker-run`\r\n- `Docker-compose`\r\n\r\n## Structure 'Order-Service' Demo\r\n\r\n```text\r\n├── pom.xml\r\n├── src\r\n│   ├── main\r\n│   │   ├── java\r\n│   │   │   └── com\r\n│   │   │       └── hoangtien2k3\r\n│   │   │           └── orderservice\r\n│   │   │               ├── OrderServiceApplication.java\r\n│   │   │               ├── api\r\n│   │   │               │   └── OrderController.java\r\n│   │   │               ├── domain\r\n│   │   │               │   ├── OrderRequest.java\r\n│   │   │               │   ├── OrderUseCase.java\r\n│   │   │               │   ├── PlacedOrderEvent.java\r\n│   │   │               │   ├── entity\r\n│   │   │               │   │   ├── Order.java\r\n│   │   │               │   │   └── OrderStatus.java\r\n│   │   │               │   └── port\r\n│   │   │               │       ├── EventHandlerPort.java\r\n│   │   │               │       ├── OrderRepositoryPort.java\r\n│   │   │               │       └── OrderUseCasePort.java\r\n│   │   │               └── infrastructure\r\n│   │   │                   ├── config\r\n│   │   │                   │   └── JacksonMapperConfig.java\r\n│   │   │                   ├── message\r\n│   │   │                   │   ├── EventHandlerAdapter.java\r\n│   │   │                   │   ├── log\r\n│   │   │                   │   │   ├── MessageLog.java\r\n│   │   │                   │   │   └── MessageLogRepository.java\r\n│   │   │                   │   └── outbox\r\n│   │   │                   │       ├── OutBox.java\r\n│   │   │                   │       └── OutBoxRepository.java\r\n│   │   │                   └── repository\r\n│   │   │                       ├── OrderEntity.java\r\n│   │   │                       ├── OrderJpaRepository.java\r\n│   │   │                       └── OrderRepositoryAdapter.java\r\n│   │   └── resources\r\n│   │       └── application.yml\r\n```\r\n\r\n## Get Started\r\n\r\n### Setup environment\r\n\r\n```shell\r\n## docker run\r\ndocker run --name postgres -p 5434:5432 -e POSTGRES_PASSWORD=12042003 -d postgres:16\r\n```\r\n\r\n```shell\r\n## docker compose\r\ndocker-compose up -d\r\n```\r\n\r\n### Build projects\r\n\r\n```shell\r\n./mvnw clean package -DskipTests=true\r\n```\r\n\r\n### Start Services\r\n\r\nRun services `api-gateway`, `order-service`, `customer-service`, `inventory-service`\r\n\r\n```shell\r\n./mvnw -f api-gateway/pom.xml spring-boot:run\r\n```\r\n\r\n```shell\r\n./mvnw -f order-service/pom.xml spring-boot:run\r\n```\r\n\r\n```shell\r\n./mvnw -f customer-service/pom.xml spring-boot:run\r\n```\r\n\r\n```shell\r\n./mvnw -f inventory-service/pom.xml spring-boot:run\r\n```\r\n\r\n| Service's name    | Endpoint       |\r\n|-------------------|----------------|\r\n| Api Gateway       | localhost:8080 |\r\n| Order service     | localhost:9090 |\r\n| Customer service  | localhost:9091 |\r\n| Inventory service | localhost:9093 |\r\n\r\n### Start outbox connectors\r\n\r\nCreate outbox connectors\r\n\r\n```shell\r\nsh register-connectors.sh\r\n```\r\n\r\n### Clean Up\r\n\r\nDelete all connectors\r\n\r\n```shell\r\nsh delete-connectors.sh\r\n```\r\n\r\n### Useful commands\r\n\r\nCreate new customer\r\n\r\n```shell\r\ncurl --location 'localhost:8080/customer-service/customers' \\\r\n--header 'Content-Type: application/json' \\\r\n--data '{\r\n    \"username\": \"usertest\",\r\n    \"fullName\": \"Test user 1\",\r\n    \"balance\": 100\r\n}'\r\n```\r\n\r\nCreate new product\r\n\r\n```shell\r\ncurl --location 'localhost:8080/inventory-service/products' \\\r\n--header 'Content-Type: application/json' \\\r\n--data '{\r\n    \"name\": \"Test product 1\",\r\n    \"stocks\": 10\r\n}'\r\n```\r\n\r\nCreate new order\r\n\r\n```shell\r\ncurl --location 'localhost:8080/order-service/orders' \\\r\n--header 'Content-Type: application/json' \\\r\n--data '{\r\n    \"customerId\": \"f0a000ad-ea44-4fa1-853b-207f9d9abe2c\",\r\n    \"productId\": \"d212c9d6-da3b-4fe2-b016-a852c8a8d32f\",\r\n    \"quantity\": 1,\r\n    \"price\": 2\r\n}'\r\n```\r\n\r\n## Contributing\r\n\r\nPull requests are welcome. For major changes, please open an issue first\r\nto discuss what you would like to change.\r\n\r\nPlease make sure to update tests as appropriate.\r\n\r\n## License\r\n\r\nThis project is licensed under the [MIT License](./LICENSE)\r\n\r\n```text\r\nMIT License\r\nCopyright (c) 2024 Hoàng Anh Tiến\r\n```\r\n\r\n## Contributors ✨\r\n\r\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\r\n\u003c!-- prettier-ignore-start --\u003e\r\n\u003c!-- markdownlint-disable --\u003e\r\n\u003ctable\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.linkedin.com/in/hoangtien2k3/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/122768076?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHoàng Anh Tiến\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/hoangtien2k3/news-app/commits?author=hoangtien2k3\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#maintenance-hoangtien2k3\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"#ideas-hoangtien2k3\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#design-hoangtien2k3\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"https://github.com/hoangtien2k3/news-app/issues?q=author%hoangtien2k3\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\r\n  \u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n\u003c!-- markdownlint-restore --\u003e\r\n\u003c!-- prettier-ignore-end --\u003e\r\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoangtien2k3%2Fsaga-pattern-microservice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoangtien2k3%2Fsaga-pattern-microservice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoangtien2k3%2Fsaga-pattern-microservice/lists"}