Aroma (Automatic Recovery Of Microservices Architecture) is a Java software analysis tool, that supports the dynamic recovery of microservices architecture and the detection of microservices smells. The tool is able to reverse engineer microservices applications and build the dependency graph i.e. the high-level representation of microservices and their dependencies. Aroma relies mainly on Zipkin, a distributed tracing system able to collect dynamic data of microservices systems.
Zipkin offers a wide set of libraries to provide instrumentation on various platforms, allowing us to analyze different kinds of microservices implementations. The only requirement to start the analysis on a project is to instrument directly with Zipkin or through OpenTelemetry API. At the end of the execution, Aroma produces a .graphml file containing the dependency graph.
Currently, it supports the following three microservice smells:
- No API Gateway: This smell appears when an external client of the application directly accesses some internal components, increasing the complexity of the system and decreasing its ease of maintenance.
- Shared Persistence: This smell appears when multiple services interact with the same database. In the worst case, different services access the same entities of the same database. This smell couples the microservices connected to the same data, leading to a reduction of the services’ independence.
- Cyclic Dependency: This smell appears when two or more services have direct or indirect dependencies on each other. A Cyclic Dependency in a microservices application can damage the capacity of services to scale or independently deploy, as well as violate the Acyclic Dependency principle.
Reference
P. Bacchiega, I. Pigazzini and F. A. Fontana, “Microservices smell detection through dynamic analysis,”48th Euromicro Conference on Software Engineering and Advanced Applications (SEAA), Gran Canaria, Spain, 2022, pp. 290-293, doi: 10.1109/SEAA56994.2022.00052.
Download Aroma
In order to download Aroma, please visit the GitLab repository: