This repo contains a demo application written in rust, showcasing the use of commonly used enterprise application technologies.
- Messaging with Apache Kafka (Apache Avro message format)
- Interaction with databases (including transactions)
- Relational databases (PostgreSQL)
- NoSQL databases (MongoDB)
- Tracing with Jaeger
- Prometheus metrics endpoints
- API technologies
- REST
- GraphQL (including federation with apollo-router)
- OAuth 2.0 authentication with Keycloak
The application is a proof-of-concept and contains a few conceptual simplifications:
- Messaging
- Dual write mechanism was not tested to work correctly under load (especially the mongodb version needs to be checked as the solution relies on the ordering properties of the document's ObjectId)
- Event handling in consumers need a few more rounds of abstraction and generalization.
- Testing
- The code was not written with testing in mind. A few more abstraction would potentially be needed to make the code better testable.
- Security
- The authentication mechanism is not security/pen-tested and was not audited.
- Authorization functionality is missing.
- SeaOrm related code is not tested regarding SQL Injection sensitivity (not checked whether the code uses prepared statements).
- Keycloak configuration is only appropriate for local testing
The code is structured into five parts: Apps (services), Common (shared libraries), Docker (related configuration file), Kafka-Schema definitions and Scripts.
The project consists of four primary services:
- app-accommodation-service
- app-kafka-connector-mongodb
- app-kafka-connector-relational
- app-user-service
Additionally two supporting service exist, that must be executed initially after starting the docker containers:
- app-kafka-schema-publisher
- app-kafka-topic-client
Common, reusable aspects are extracted into libraries:
- common-db-mongodb
- common-db-relationaldb
- common-error
- common-kafka
- common-metrics
- common-security
- common-tracing
Docker related files can be found in the directory docker
.
There are convenience scripts in the scripts
directory
and run-configurations for IntelliJ, that can be used.
The kafka message schemas are specified by using the Apache Avro message format. The schemas can be found in the modules:
- kafka-schema-accommodation
- kafka-schema-common
- kafka-schema-user
Convenience scripts to start the docker-compose file and the
apollo router can be found in the scripts
directory.
Apache Kafka, Jaeger, the Databases and Keycloak are preconfigured in docker/docker-compose.yml
.
The containers can be started/stopped using the convenience scripts:
scripts/docker-comppse-up.sh
andscripts/docker-compose-down.sh
.
Hint:
It might be necessary to add 127.0.0.1 mongodb1
to your /etc/hosts
to make the single node
mongodb replicaset accessible.
The apollo-router for graphql federation can be started using the scripts:
scripts/apollo_router_download.sh
to download the repo (as there are no pre-build binaries for apple silicon)scripts/apollo_router_build.sh
to build the routerscripts/apollo_router_run.sh
to run the router
The applications can be started by setting the active profiles as an
environment variable RUST_PROFILES_ACTIVE=LOCAL
.
There are also pre-configured IntelliJ run configurations that can be used to start the services in debug or release mode in IntelliJ.
The source code is developed with rust's stable toolchain.
The code is formatted using nightly features.
The format specification can be found in rustfmt.toml
.
The code can be formatted on command line with the command:
cargo +nightly fmt
In IntelliJ the formatter can be configured by opening:
Preferences > Languages & Frameworks > Rust > Rustfmt
and selecting the channel nightly
.
The code of the demo application in this repo is licensed under the:
The module opentelemetry-propagator-b3
contains copied and modified code
of the crate opentelemetry-zipkin
which is licensed under the Apache 2.0 License