|
Note
|
This repository contains the guide documentation source. To view the guide in published form, view it on the Open Liberty website. |
Learn how to develop a Java application on Open Liberty with Maven and Docker.
You will learn how to run and update a simple REST microservice on an Open Liberty server. You will use Maven throughout the guide to build and deploy the microservice as well as to interact with the running server instance.
Open Liberty is an application server designed for the cloud. It’s small, lightweight, and designed with modern cloud-native application development in mind. It supports the full MicroProfile and Java EE APIs and is composable, meaning that you can use only the features that you need, keeping the server lightweight, which is great for microservices. It also deploys to every major cloud platform, including Docker, Kubernetes, and Cloud Foundry.
Maven is an automation build tool that provides an efficient way to develop Java applications.
Using Maven, you will build a simple microservice, called system, that collects basic
system properties from your laptop and displays them on an endpoint that you can access
in your web browser.
You’ll also explore how to package your application with the server runtime so that it can be deployed anywhere in one go. You will then make server configuration and code changes and see how they are picked up by a running server.
Finally, you will package the application along with the server configuration into a Docker image and run that image as a container.
Your application is configured to be built with Maven. Every Maven-configured project
contains a pom.xml file, which defines the project configuration, dependencies, plug-ins,
and so on.
Navigate to the start directory where your pom.xml file is located. Your pom.xml file
is configured to include the liberty-maven-plugin, which allows
you to install applications into Open Liberty and manage the server instances.
pom.xml
link:finish/pom.xml[role=include]To begin, build the system microservice that is provided and deploy it to Open Liberty
by running the Maven liberty:run goal from the start directory:
mvn liberty:runThe mvn command initiates a Maven build, during which the target directory is created
to store all build-related files.
The liberty:run argument specifies the Open Liberty run goal, which
starts an Open Liberty server instance in the foreground.
As part of this phase, an Open Liberty server runtime is downloaded and installed into
the target/liberty/wlp directory, a server instance is created and configured in the
target/liberty/wlp/usr/servers/defaultServer directory, and the application is
installed into that server via loose config.
For more information about the Liberty Maven plug-in, see its GitHub repository.
When the server begins starting up, various messages display in your command-line session. Wait for the following message, which indicates that the server startup is complete:
[INFO] [AUDIT] CWWKF0011I: The server defaultServer is ready to run a smarter planet.To access the system microservice, see the http://localhost:9080/system/properties URL,
and you see a list of the various system properties of your JVM:
{
"os.name": "Mac OS X",
"java.version": "1.8.0_151",
...
}When you need to stop the server, press CTRL+C in the command-line session where
you ran the server, or run the liberty:stop goal from the start directory in
another command-line session:
mvn liberty:stopAlthough you can start and stop the server in the foreground by using the Maven
liberty:run goal, you can also start and stop the server in the background with
the Maven liberty:start and liberty:stop goals:
mvn liberty:start mvn liberty:stop
The Open Liberty Maven plug-in includes a dev goal that listens for any changes in the project,
including application source code or configuration. The Open Liberty server automatically reloads the configuration without restarting. This goal allows for quicker turnarounds and an improved developer experience.
Stop the Open Liberty server if it is running, and start it in development mode by running the liberty:dev goal in the start directory:
mvn liberty:devDevelopment mode automatically picks up changes that you make to your application and allows you to run tests by pressing the enter/return key in the active command-line session. When you’re working on your application, rather than rerunning Maven commands, press the enter/return key to verify your change.
As before, you can see that the application is running by going to the http://localhost:9080/system/properties URL.
Now try updating the server configuration while the server is running in development mode.
The system microservice does not currently include health monitoring to report whether the server and the microservice that it runs are healthy.
You can add health reports with the MicroProfile Health feature, which adds a /health endpoint to your application.
If you try to access this endpoint now at the http://localhost:9080/health/ URL, you see a 404 error because the /health endpoint does not yet exist:
Error 404: java.io.FileNotFoundException: SRVE0190E: File not found: /healthTo add the MicroProfile Health feature to the server, include the mpHealth feature in the server.xml.
Replace the server configuration file.
src/main/liberty/config/server.xml
server.xml
link:finish/src/main/liberty/config/server.xml[role=include]After you make the file changes, Open Liberty automatically reloads its configuration.
When enabled, the mpHealth feature automatically adds a /health endpoint to the application.
You can see the server being updated in the server log displayed in your command-line session:
[INFO] [AUDIT] CWWKG0016I: Starting server configuration update.
[INFO] [AUDIT] CWWKT0017I: Web application removed (default_host): http://foo:9080/
[INFO] [AUDIT] CWWKZ0009I: The application io.openliberty.guides.getting-started has stopped successfully.
[INFO] [AUDIT] CWWKG0017I: The server configuration was successfully updated in 0.284 seconds.
[INFO] [AUDIT] CWWKT0016I: Web application available (default_host): http://foo:9080/health/
[INFO] [AUDIT] CWWKF0012I: The server installed the following features: [mpHealth-2.2].
[INFO] [AUDIT] CWWKF0008I: Feature update completed in 0.285 seconds.
[INFO] [AUDIT] CWWKT0016I: Web application available (default_host): http://foo:9080/
[INFO] [AUDIT] CWWKZ0003I: The application io.openliberty.guides.getting-started updated in 0.173 seconds.Try to access the /health endpoint again by visiting the http://localhost:9080/health URL.
You see the following JSON:
{
"checks":[],
"status":"UP"
}Now you can verify whether your server is up and running.
The JAX-RS application that contains your system microservice runs in a server from its .class file and other artifacts.
Open Liberty automatically monitors these artifacts, and whenever they are updated, it updates the running server without the need for the server to be restarted.
Look at your pom.xml file.
pom.xml
link:finish/pom.xml[role=include]Try updating the source code while the server is running in development mode.
At the moment, the /health endpoint reports whether the server is running, but the endpoint doesn’t provide any details on the microservices that are running inside of the server.
MicroProfile Health offers health checks for both readiness and liveness. A readiness check allows third-party services, such as Kubernetes, to know if the microservice is ready to process requests. A liveness check allows third-party services to determine if the microservice is running.
Create theSystemReadinessCheckclass.src/main/java/io/openliberty/sample/system/SystemReadinessCheck.java
SystemReadinessCheck.java
link:finish/src/main/java/io/openliberty/sample/system/SystemReadinessCheck.java[role=include]The SystemReadinessCheck class verifies that the
system microservice is not in maintenance by checking a config property.
Create theSystemLivenessCheckclass.src/main/java/io/openliberty/sample/system/SystemLivenessCheck.java
SystemLivenessCheck.java
link:finish/src/main/java/io/openliberty/sample/system/SystemLivenessCheck.java[role=include]The SystemLivenessCheck class reports a status of
DOWN if the microservice uses over 90% of the maximum amount of memory.
After you make the file changes, Open Liberty automatically reloads its configuration and the system application.
The following messages display in your first command-line session:
[INFO] [AUDIT] CWWKT0017I: Web application removed (default_host): http://foo:9080/
[INFO] [AUDIT] CWWKZ0009I: The application io.openliberty.guides.getting-started has stopped successfully.
[INFO] [AUDIT] CWWKT0016I: Web application available (default_host): http://foo:9080/
[INFO] [AUDIT] CWWKZ0003I: The application io.openliberty.guides.getting-started updated in 0.136 seconds.Access the /health endpoint again by going to the http://localhost:9080/health URL.
This time you see the overall status of your server and the aggregated data of the liveness and readiness checks for the system microservice:
{
"checks":[
{
"data":{},
"name":"SystemResource Readiness Check",
"status":"UP"
},
{
"data":{
"memory used":40434888,
"memory max":4294967296
},
"name":"SystemResource Liveness Check",
"status":"UP"
}
],
"status":"UP"
}You can also access the /health/ready endpoint by going to the http://localhost:9080/health/ready URL to view the data from the readiness health check.
Similarly, access the /health/live endpoint by going to the http://localhost:9080/health/live URL to view the data from the liveness health check.
Making code changes and recompiling is fast and straightforward.
The development mode of Open Liberty automatically picks up changes in the .class files and artifacts, without needing to be restarted.
Alternatively, you can run the run goal and manually repackage or recompile the application by using the mvn package command or the mvn compile command while the server is running. The development mode was added to further improve the developer experience by minimizing turnaround times.
While the server is running in the foreground, it displays various console messages in
the command-line session. These messages are also logged to the target/liberty/wlp/usr/servers/defaultServer/logs/console.log
file. You can find the complete server logs in the target/liberty/wlp/usr/servers/defaultServer/logs
directory. The console.log and messages.log files are the primary log files that contain
console output of the running application and the server. More logs are created when runtime errors
occur or whenever tracing is enabled. You can find the error logs in the
ffdc directory and the tracing logs in the trace.log file.
In addition to the log files that are generated automatically, you can enable logging of
specific Java packages or classes by using the <logging/> element:
<logging traceSpecification="<component_1>=<level>:<component_2>=<level>:..."/>The component element is a Java package or class, and the level element is one
of the following logging levels: off, fatal, severe, warning, audit, info,
config, detail, fine, finer, finest, all.
Try enabling detailed logging of the MicroProfile Health feature by adding the
<logging/> element to your configuration file.
Replace the server configuration file.
src/main/liberty/config/server.xml
server.xml
link:finish/src/main/liberty/config/server.xml[role=include]After you change the file, Open Liberty automatically reloads its configuration.
Now, when you visit the /health endpoint, additional traces are logged in the trace.log file.
To run the application in a container, Docker needs to be installed. For installation instructions, see the Official Docker Docs.
Make sure to start your Docker daemon before you proceed.
To containerize the application, you need a Dockerfile. This file contains a collection
of instructions that define how a Docker image is built, what files are packaged into it,
what commands run when the image runs as a container, and other information. You can find a complete
Dockerfile in the start directory. This Dockerfile copies the .war file into a Docker
image that contains the Java runtime and a preconfigured Open Liberty server.
Run the mvn package command from the start directory so that the .war file resides in the target directory.
mvn packageTo build and containerize the application, run the
following Docker build command in the start directory:
docker build -t openliberty-getting-started:1.0-SNAPSHOT .The Docker openliberty-getting-started:1.0-SNAPSHOT image is also built from the Dockerfile.
To verify that the image is built, run the docker images command to list all local Docker images:
docker imagesYour image should appear in the list of all Docker images:
REPOSITORY TAG IMAGE ID CREATED SIZE
openliberty-getting-started 1.0-SNAPSHOT 85085141269b 21 hours ago 487MBNext, run the image as a container:
docker run -d --name gettingstarted-app -p 9080:9080 openliberty-getting-started:1.0-SNAPSHOTThere is a bit going on here, so here’s a breakdown of the command:
| Flag | Description |
|---|---|
-d |
Runs the container in the background. |
--name |
Specifies a name for the container. |
-p |
Maps the container ports to the host ports. |
The final argument in the docker run command is the Docker image name.
Next, run the docker ps command to verify that your container started:
docker psMake sure that your container is running and does not have Exited as its status:
CONTAINER ID IMAGE CREATED STATUS NAMES
4294a6bdf41b openliberty-getting-started 9 seconds ago Up 11 seconds gettingstarted-appTo access the application, go to the http://localhost:9080/system/properties URL.
To stop and remove the container, run the following commands:
docker stop gettingstarted-app && docker rm gettingstarted-appTo remove the image, run the following command:
docker rmi openliberty-getting-started:1.0-SNAPSHOTSo far, Open Liberty was running out of the target/liberty/wlp directory, which
effectively contains an Open Liberty server installation and the deployed application. The
final product of the Maven build is a server package for use in a continuous integration
pipeline and, ultimately, a production deployment.
Open Liberty supports a number of different server packages. The sample application
currently generates a usr package that contains the servers and application to be
extracted onto an Open Liberty installation.
Instead of creating a server package, you can generate a runnable JAR file that contains
the application along with a server runtime. This JAR file can then be run anywhere and deploy
your application and server at the same time. To generate a runnable JAR file, override the
include property:
mvn liberty:package -Dinclude=runnableThe packaging type is overridden from the usr package to the runnable
package. This property then propagates to the liberty-maven-plugin
plug-in, which generates the server package based on the openliberty-kernel package.
When the build completes, you can find the minimal runnable guide-getting-started.jar file in the
target directory. This JAR file contains only the features that you
explicitly enabled in your server.xml file. As a result, the
generated JAR file is only about 50 MB.
To run the JAR file, first stop the server if it’s running. Then, navigate to the target
directory and run the java -jar command:
java -jar guide-getting-started.jarWhen the server starts, go to the http://localhost:9080/system/properties URL to access your application that is now running out of the minimal runnable JAR file.
You can stop the server by pressing CTRL+C in the command-line session that the server runs in.
pom.xml
link:finish/pom.xml[role=include]server.xml
link:finish/src/main/liberty/config/server.xml[role=include]You’ve learned the basics of deploying and updating an application on an Open Liberty server.