As defined in the Twelve-Factor-App it’s important for cloud-native applications to store configuration externally, rather than in the code since this makes it possible to deploy applications to different environments.
An app’s config is everything that is likely to vary between deploys (staging, production, developer environments, etc). This includes: Resource handles to … backing services. Credentials to external services …
Microservices that are implemented with Java EE can leverage MicroProfile Config. The configuration can be done, for example, in Kubernetes yaml files and accessed from Java code via annotations and APIs.
Here is a simple example from the cloud-native-starter repo. The ‘articles’ service uses configuration to define whether or not to create ten articles the first time it is invoked.In the yaml file an environment variable pointing to a ConfigMap is defined.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
kind: Deployment
apiVersion: apps/v1beta1
metadata:
name: articles
spec:
replicas: 1
template:
metadata:
labels:
app: articles
version: v1
spec:
containers:
- name: articles
image: articles:1
ports:
- containerPort: 8080
env:
- name: samplescreation
valueFrom:
configMapKeyRef:
name: articles-config
key: samplescreation
restartPolicy: Always
---
kind: ConfigMap
apiVersion: v1
metadata:
name: articles-config
data:
samplescreation: CREATE
In the Java code the configuration can be accessed via @Inject and @ConfigProperty.
1
2
3
4
5
6
7
8
9
10
public class CoreService {
private static final String CREATE_SAMPLES = "CREATE";
@Inject
@ConfigProperty(name = "samplescreation", defaultValue = "dontcreate")
private String samplescreation;
@PostConstruct
private void addArticles() {
if (samplescreation.equalsIgnoreCase(CREATE_SAMPLES))
addSampleArticles();
}
Note that you cannot access the injected variable in the constructor. Instead use the @PostConstruct annotation. Thanks to Emily Jiang for figuring this out.
If you want to try this feature and many other MicroProfile and Istio features, get the code from the cloud-native-starter repo and run these commands.
1
2
3
4
$ git clone https://github.com/nheidloff/cloud-native-starter.git
$ scripts/check-prerequisites.sh
$ scripts/deploy-articles-java-jee.sh
$ scripts/show-urls.sh
To learn more about MicroProfile Config, check out these resources: