Collection of independent libraries on top of Spring Boot to provide a faster setup of jvm microservices.
"I never did anything by accident, nor did any of my inventions come by accident; they came by work." - Thomas Edison
Have a look at the release notes for details about updates and changes.
This project contains a number of independent libraries on top of Spring Boot to provide a faster setup of jvm microservices. The libraries are used in different projects at OTTO. It's purpose is to provide a common implementation for cross-cutting requirements like:
... plus all the features of Spring Boot.
Semantic Versioning v2.0.0 is used to specify the version numbers.
This project maintains its roadmap with issues and milestones.
3.3.x: Edison Microservices for Spring Boot 3.3.x ✔ - Compatible with Java 17 and greater
2.7.x (EOL): Edison Microservices for Spring Boot 2.7.x ✔ - Compatible with Java 11 and greater - End of Life, not updated any more
3.2.x (EOL): Edison Microservices for Spring Boot 3.2.x ✔ - Compatible with Java 17 and greater - End of Life, not updated any more
In edison-ldap, whitelisted-paths was replaced with allowlisted-paths. Everything else should be ok if you follow the Spring Boot 2 -> 3 migration guide: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
Edison 2 has several breaking changes that will make a refactoring of your current application necessary. For a list of the actual changes, please take a look at the Changelog.
When migrating, take care of the following adjustments:
/internal
, you have to
configure management.endpoints.web.base-path=/internal
in your application.yml
edison-microservice
(named edison-aws
).gradlew bootRepackage
for packaging your application so far, you have to migrate this to gradlew bootJar
.To use @Timed
-Annotations, you need to configure Micrometer accordingly. See the following Example for a configuration that
covers the annotation and naming of all metrics:
@Configuration
@EnableAspectJAutoProxy
public class MicrometerConfiguration {
@Bean
public PrometheusNamingConvention prometheusNamingConvention() {
return new PrometheusNamingConvention();
}
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags(@Value("${service.vertical}") final String vertical,
@Value("${service.name}") final String serviceName,
final PrometheusNamingConvention prometheusNamingConvention) {
return registry -> registry
.config()
.namingConvention(new NamingConvention() {
// Set naming convention that gets applied to all metrics, in this example explicitly using a Prometheus naming convention
@Override
public String name(final String name, final Meter.Type type, final String baseUnit) {
return prometheusNamingConvention.name(String.format("%s.%s.%s", vertical, serviceName, name), type, baseUnit);
}
})
.meterFilter(new MeterFilter() { // Configure generally applicable configurations, like percentiles
@Override
public DistributionStatisticConfig configure(final Meter.Id id,
final DistributionStatisticConfig config) {
return config.merge(DistributionStatisticConfig.builder()
.percentiles(0.5, 0.9, 0.95, 0.98, 0.99, 0.999)
.build());
}
});
}
// Create a `TimedAspect` to enable `@Timed`-Annotations
@Bean
public TimedAspect timedAspect(final MeterRegistry registry) {
return new TimedAspect(registry);
}
}
Edison Modules:
edison-aws
: AWS related configuration and togglz settingsedison-core
: Main library of Edison microservices.edison-jobs
: Optional module providing a simple job library.edison-mongo
: Auto-configuration for MongoDB repositories plus implementation of MongoJobRepository and Togglz StateRepository.edison-oauth
: Auto-configuration for OAuth Public Key repositories with autofetching and a simple JWT Token Validation.edison-togglz
: Optional support for feature toggles for Edison microservices based on Togglz.edison-testsupport
: Test support for feature toggles plus utilities.edison-validation
: Optional module for validation in Spring with a specific response format.Examples:
example-status
: Service only relying on edison-core
to show the usage of health and status features. example-jobs
: Edison service using edison-jobs to run background tasks. example-togglz
: Example using `edison-togglz´ to implement feature toggles.example-togglz-mongo
: Same edison-toggz
, but with a MongoDB configuration to auto-configure persistence of feature toggles.Make sure you have Java 11 or later and gradle 6.x installed on your computer.
Test and create coverage report
gradle check
Determine possible dependency updates
gradle dependencyUpdates -Drevision=release
./release.sh
Click on "Releases" -> "Draft a new release". Create a tag and copy&paste the relevant info from the changelog.
Don't publish packages to github. They are published to sonatype.
There are a few examples that may help you to start your first microservice based on Edison and Spring Boot. Because Spring Boot itself has some complexity, it is recommended to first read its documentation before starting with Edison.
The examples can be started with gradle:
gradle examples:example-status:bootRun
gradle examples:example-jobs:bootRun
gradle examples:example-togglz:bootRun
gradle examples:example-togglz-mongo:bootRun
Open in your browser http://localhost:8080/
Note: Every example is configured to use port 8080, so make sure to run only one example at a time or to reconfigure the ports.
Have a look at our contribution guidelines.