{"id":38598862,"url":"https://github.com/fraktalio/courier-demo","last_synced_at":"2026-01-17T08:31:42.773Z","repository":{"id":37762306,"uuid":"287572223","full_name":"fraktalio/courier-demo","owner":"fraktalio","description":"Axon demo - `Courier Management` Information System - A part of the systems landscape: https://github.com/fraktalio/courier-demo, https://github.com/fraktalio/restaurant-demo, https://github.com/fraktalio/order-demo","archived":false,"fork":false,"pushed_at":"2023-10-04T20:15:58.000Z","size":3945,"stargazers_count":30,"open_issues_count":1,"forks_count":16,"subscribers_count":4,"default_branch":"main","last_synced_at":"2023-10-05T07:43:47.344Z","etag":null,"topics":["axon-framework","cqrs","ddd","demo-app","event-sourcing","eventmodeling","java","microservices","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fraktalio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-08-14T16:02:14.000Z","updated_at":"2023-09-17T18:39:11.000Z","dependencies_parsed_at":"2023-10-05T03:12:42.456Z","dependency_job_id":null,"html_url":"https://github.com/fraktalio/courier-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/fraktalio/courier-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fraktalio%2Fcourier-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fraktalio%2Fcourier-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fraktalio%2Fcourier-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fraktalio%2Fcourier-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fraktalio","download_url":"https://codeload.github.com/fraktalio/courier-demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fraktalio%2Fcourier-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28504364,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T06:57:29.758Z","status":"ssl_error","status_checked_at":"2026-01-17T06:56:03.931Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["axon-framework","cqrs","ddd","demo-app","event-sourcing","eventmodeling","java","microservices","spring-boot"],"created_at":"2026-01-17T08:31:42.669Z","updated_at":"2026-01-17T08:31:42.758Z","avatar_url":"https://github.com/fraktalio.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Courier - demo\n\n![CI with maven](https://github.com/fraktalio/courier-demo/workflows/CI%20with%20Maven%20-%20Test,%20Build%20and%20Publish/badge.svg)\n\n## Systems Landscape\n\nThe systems landscape consists of three\nsystems [order management](https://github.com/fraktalio/order-demo), [restaurant management](https://github.com/fraktalio/restaurant-demo)\nand [courier management](https://github.com/fraktalio/courier-demo)\n\nCustomers use the web application to place food orders at local restaurants. Application(s) coordinates a\nrestaurant/kitchen order preparation, and a network of couriers who deliver the orders.\n\n### Vision\n\n[Event Modeling](https://eventmodeling.org/) is a method of describing systems using an example of how information has\nchanged within them over time.\n\n![event modeling](.assets/event-model-systems-landscape.jpg)\n\n### Structure\n\nThe [C4 software architecture model](https://c4model.com/) is a simple hierarchical way to think about the static\nstructures of a software system in terms of containers, components and classes (or code).\n\nA System `Context` diagram can be a useful starting point for diagramming and documenting a software system, allowing\nyou to step back and look at the big picture.\n\n![landscape](.assets/landscapeViews.png)\n\n## **Courier Management System**\n\nManaging courier information. A courier view of an order (managing the delivery of orders).\n\n### Vision\n\nWe zoom in to show the event model of the Courier Management System only:\n\n![event modeling](.assets/event-model.jpg)\n\nSpecification by example (SBE) is a collaborative approach to defining requirements and business-oriented functional\ntests for software products based on capturing and illustrating requirements using realistic examples instead of\nabstract statements.\n\n![spec by example](.assets/spec-by-example.jpg)\n\n### Structure\n\nOnce you understand how your system fits in to the overall IT environment with a System Context diagram, a really useful\nnext step can be to illustrate the high-level technology choices with a Container diagram:\n\n![containers diagram](.assets/containerViews.png)\n\nFollowing on from a Container diagram showing the high-level technology decisions, you can then start to zoom in and\ndecompose each container further:\n\n![components diagram](.assets/componentViews.png)\n\n### Canvas\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cstrong\u003eName:\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd colspan=\"3\"\u003eCourier Management\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cstrong\u003eDescription:\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd colspan=\"3\"\u003eManaging courier information. A courier view of an order (managing the delivery of orders).\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cstrong\u003eConcepts:\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cstrong\u003eArchitectural patterns:\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cstrong\u003eTechnology:\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003eDomain Driven Design\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003eEvent Driven Microservices\u003c/li\u003e\n                \u003cli\u003eEventsourcing\u003c/li\u003e\n                \u003cli\u003eCQRS\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003eJava\u003c/li\u003e\n                \u003cli\u003eAxon\u003c/li\u003e\n                \u003cli\u003eSpring(Boot)\u003c/li\u003e\n                \u003cli\u003eSQL(Postgres)\u003c/li\u003e\n                \u003cli\u003eDocker\u003c/li\u003e\n                \u003cli\u003eTestcontainers\u003c/li\u003e\n                \u003cli\u003eKubernetes\u003c/li\u003e\n                \u003cli\u003ePrometheus\u003c/li\u003e\n                \u003cli\u003eGrafana\u003c/li\u003e\n                \u003cli\u003eJaeger\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"3\"\u003e\u003cstrong\u003eService API\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003eCommands:\u003c/td\u003e\n        \u003ctd\u003eQueries:\u003c/td\u003e\n        \u003ctd\u003eEvents published:\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003ci\u003egRPC:\u003c/i\u003e\n            \u003cul\u003e\n                \u003cli\u003eCreateCourierCommand\u003c/li\u003e\n                \u003cli\u003eCreateShipmentCommand\u003c/li\u003e\n                \u003cli\u003eAssignShipmentCommand\u003c/li\u003e\n                \u003cli\u003eMarkShipmentAsDeliveredCommand\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ci\u003egRPC:\u003c/i\u003e\n            \u003cul\u003e\n                \u003cli\u003eFindCourierQuery\u003c/li\u003e\n                \u003cli\u003eFindShipmentQuery\u003c/li\u003e\n                \u003cli\u003eFindAllCouriersQuery\u003c/li\u003e\n                \u003cli\u003eFindAllShipmentsQuery\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ci\u003egRPC:\u003c/i\u003e\n            \u003cul\u003e\n                \u003cli\u003eCourierCreatedEvent\u003c/li\u003e\n                \u003cli\u003eShipmentCreatedEvent\u003c/li\u003e\n                \u003cli\u003eShipmentAssignedEvent\u003c/li\u003e\n                \u003cli\u003eShipmentNotAssignedEvent\u003c/li\u003e\n                \u003cli\u003eShipmentDeliveredEvent\u003c/li\u003e\n                \u003cli\u003eShipmentExpiredEvent\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"3\"\u003e\u003cstrong\u003eDomain model:\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"3\"\u003e\n            \u003cul\u003e\n                \u003cli\u003eCourier\u003c/li\u003e\n                \u003cli\u003eShipment\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"3\"\u003e\u003cstrong\u003eDependencies:\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"1\"\u003eInvokes\u003c/td\u003e\n        \u003ctd colspan=\"2\"\u003eSubscribes to\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd colspan=\"1\"\u003e\n           -\n        \u003c/td\u003e\n        \u003ctd colspan=\"2\"\u003e\n           -\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## Development\n\nThis project is driven using [maven].\n\n### Run locally\n\n**Requirements**\n\n- Java 17\n\n```\nsdk install java 17.0.1-zulu\nsdk use java 17.0.1-zulu\n```\n\n\u003e You can [download](https://download.axoniq.io/axonserver/AxonServer.zip) a ZIP file with AxonServer as a standalone\n\u003e JAR. This will also give you the AxonServer CLI and information on how to run and configure the server.\n\u003e\n\u003eAlternatively, you can run the following command to start AxonServer in a Docker container:\n\u003e\n\u003e```\n\u003edocker run -d --name axonserver -p 8024:8024 -p 8124:8124 axoniq/axonserver\n\u003e```\n\n**Build \u0026 Test**\n\n```bash\n./mvnw clean verify\n```\n\n**Run**\n\n```bash\n./mvnw spring-boot:run\n```\n\n### Run on Kubernetes cluster\n\n**Requirements**\n\n\u003e - [Kubernetes](https://kubernetes.io/). It is included in the Docker on Mac (and Windows) binary so it installed\n    automatically with it. After a successful installation, you need to explicitly enable Kubernetes support. Click the\n    Docker icon in the status bar, go to “Preferences”, and on the “Kubernetes” tab check “Enable Kubernetes”.\n\u003e- [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) allows you to run commands against Kubernetes\n   clusters. You can use kubectl to deploy applications, inspect and manage cluster resources, and view logs\n\nBuild the docker image to local registry:\n\n```\n./mvnw clean verify jib:dockerBuild\n```\n\nDeploy:\n\n```\nkubectl apply -k .k8s/base\n```\n\nDelete:\n\n```\nkubectl delete -k .k8s/base\nkubectl delete pvc --all\n```\n\n**Continuously deploy with google skaffold**\n\n\u003e - [Skaffold](https://github.com/GoogleContainerTools/skaffold) is a command line tool that facilitates continuous\n    development for Kubernetes applications.\n\nUse `skaffold dev` to build and deploy your app every time your code changes:\n\n```bash\n$ skaffold dev\n```\n\nor activate `observability` profile, to enable metrics and tracing with Prometheus, Grafana and Jaeger:\n\n```bash\n$ skaffold dev -p observability\n```\n\n**Deploy once**\n\nUse `skaffold run` to build and deploy your app once, similar to a CI/CD pipeline:\n\n```bash\n$ skaffold run\n```\n\nor activate `observability` profile, to enable metrics and tracing with Prometheus, Grafana and Jaeger:\n\n```bash\n$ skaffold run -p observability\n```\n\n## References and further reading\n\n- [https://microservices.io/book](https://microservices.io/book)\n- [https://www.manning.com/books/specification-by-example](https://www.manning.com/books/specification-by-example)\n- [https://teamtopologies.com/book](https://teamtopologies.com/book)\n- [https://www.oreilly.com/library/view/domain-driven-design-distilled/9780134434964/](https://www.oreilly.com/library/view/domain-driven-design-distilled/9780134434964/)\n- [https://ddd-crew.github.io/](https://ddd-crew.github.io/)\n- [https://miro.com/app/board/o9J_kqtuB6A=/](https://miro.com/app/board/o9J_kqtuB6A=/)\n- [https://eventmodeling.org/](https://eventmodeling.org/)\n- [https://docs.axoniq.io/reference-guide/](https://docs.axoniq.io/reference-guide/)\n- [https://c4model.com/](https://c4model.com/)\n- [https://structurizr.com/](https://structurizr.com/)\n- [https://github.com/archifacts/archifacts](https://github.com/archifacts/archifacts)\n\n---\nCreated with :heart: by [Fraktalio](https://fraktalio.com/)\n\n[maven]: https://maven.apache.org/\n\n[kotlin]: https://kotlinlang.org/\n\n[spring]: https://spring.io/\n\n[axon]: https://axoniq.io/\n\n[testcontainers]: https://www.testcontainers.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffraktalio%2Fcourier-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffraktalio%2Fcourier-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffraktalio%2Fcourier-demo/lists"}