Hello World - Spring Boot Java

A simple web app written in Java using Spring Boot 2.0 that you can use for
testing. It reads in an env variable TARGET and prints “Hello \${TARGET}!“. If
TARGET is not specified, it will use “World” as the TARGET.

Follow the steps below to create the sample code and then deploy the app to your
cluster. You can also download a working copy of the sample, by running the
following commands:

If you don’t have curl installed, you can accomplish the same by visiting the
Spring Initializr page. Specify Artifact as
helloworld and add the Web dependency. Then click Generate Project,
download and unzip the sample archive.

Update the SpringBootApplication class in
src/main/java/com/example/helloworld/HelloworldApplication.java by adding a
@RestController to handle the “/” mapping and also add a @Value field to
provide the TARGET environment variable:

# Use the official maven/Java 8 image to create a build artifact.# https://hub.docker.com/_/maven FROM maven:3.5-jdk-8-alpine as builder# Copy local code to the container image. WORKDIR /app COPY pom.xml . COPY src ./src# Build a release artifact. RUN mvn package -DskipTests# Use AdoptOpenJDK for base image.# It's important to use OpenJDK 8u191 or above that has container support enabled.# https://hub.docker.com/r/adoptopenjdk/openjdk8# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds FROM adoptopenjdk/openjdk8:jdk8u202-b08-alpine-slim# Copy the jar to the production image from the builder stage. COPY --from=builder /app/target/helloworld-*.jar /helloworld.jar# Run the web service on container startup. CMD ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/helloworld.jar"]

Create a new file, service.yaml and copy the following service definition
into the file. Make sure to replace {username} with your Docker Hub
username.

After the build has completed and the container is pushed to docker hub, you
can deploy the app into your cluster. Ensure that the container image value
in service.yaml matches the container you built in the previous step. Apply
the configuration using kubectl:

kubectl apply --filename service.yaml

Now that your service is created, Knative will perform the following steps:

Automatically scale your pods up and down (including to zero active pods).

To find the IP address of your service, use:

# In Knative 0.2.x and prior versions, the `knative-ingressgateway` service was used instead of `istio-ingressgateway`.INGRESSGATEWAY=knative-ingressgateway
# The use of `knative-ingressgateway` is deprecated in Knative v0.3.x.# Use `istio-ingressgateway` instead, since `knative-ingressgateway`# will be removed in Knative v0.4.if kubectl get configmap config-istio -n knative-serving &> /dev/null;thenINGRESSGATEWAY=istio-ingressgateway
fi
kubectl get svc $INGRESSGATEWAY --namespace istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
xxxxxxx-ingressgateway LoadBalancer 10.23.247.74 35.203.155.229 80:32380/TCP,443:32390/TCP,32400:32400/TCP 2d
# Now you can assign the external IP address to the env variable.exportIP_ADDRESS=<EXTERNAL-IP column from the command above>
# Or just execute:exportIP_ADDRESS=$(kubectl get svc $INGRESSGATEWAY\
--namespace istio-system \
--output jsonpath="{.status.loadBalancer.ingress[*].ip}")

Note If your cluster is new, it may take some time for the service to get
assigned an external IP address. Instead of rerunning the command, you can
add --watch to the command below to view the component’s status updates in
real time. Use CTRL+C to exit watch mode.