= Spring Boot Example with gRPC on Kubernetes

== Introduction

This example demonstrates how you can use Camel-gRPC Starter component. The example is composed of a standalone gRPC server and a Camel Spring-boot gRPC route acting as client. We will run this example on Minikube (0.21.0)

=== Server

You can build the server under the directory hello-camel-grpc-server with:

    $ mvn clean install 

and then run the server with

    $ mvn -Pkubernetes k8s:deploy

then check your pod status with

    $ kubectl get pods

[source,bash]
----
NAME                                                          READY     STATUS    RESTARTS   AGE
camel-example-hello-grpc-server-kubernetes-2604940788-g47hr   1/1       Running   0          13s
----

and get the logs

    $ kubectl logs camel-example-hello-grpc-server-kubernetes-2604940788-g47hr

You should see the following output:

[source,bash]
----
Aug 30, 2017 7:31:11 AM org.apache.camel.examples.grpc.HelloCamelServer start
INFO: Server started. I'm listening on 8080
----

=== Run the client

You can build the client example under the directory hello-camel-grpc-client with:

    $ mvn clean install

and then run the server with

    $ mvn -Pkubernetes k8s:deploy

then check your pod status with

    $ kubectl get pods

[source,bash]
----
NAME                                                          READY     STATUS    RESTARTS   AGE
camel-example-hello-grpc-client-kubernetes-1594657646-ptrkn   1/1       Running   0          15s
camel-example-hello-grpc-server-kubernetes-2604940788-g47hr   1/1       Running   0          7m

----

and get the logs

    $ kubectl logs camel-example-hello-grpc-client-kubernetes-1594657646-ptrkn

And you should see this output in the console.

[source,bash]
----
2017-08-30 07:38:50.753:INFO:ifasjipjsoejs.Server:jetty-8.y.z-SNAPSHOT
2017-08-30 07:38:50.787:INFO:ifasjipjsoejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:9779

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.6.RELEASE)

2017-08-30 07:38:51.742  INFO 1 --- [           main] o.a.c.e.springboot.grpc.Application      : Starting Application v2.20.0-SNAPSHOT on camel-example-hello-grpc-client-kubernetes-1594657646-ptrkn with PID 1 (/deployments/camel-example-hello-grpc-client-kubernetes-2.20.0-SNAPSHOT.jar started by root in /deployments)
2017-08-30 07:38:51.744  INFO 1 --- [           main] o.a.c.e.springboot.grpc.Application      : No active profile set, falling back to default profiles: default
2017-08-30 07:38:51.899  INFO 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5faeada1: startup date [Wed Aug 30 07:38:51 GMT 2017]; root of context hierarchy
2017-08-30 07:38:53.236  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.camel.spring.boot.CamelAutoConfiguration' of type [org.apache.camel.spring.boot.CamelAutoConfiguration$$EnhancerBySpringCGLIB$$bd99dea4] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-08-30 07:38:54.109  INFO 1 --- [           main] o.a.c.i.converter.DefaultTypeConverter   : Type converters loaded (core: 192, classpath: 1)
2017-08-30 07:38:54.906  INFO 1 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-08-30 07:38:54.976  INFO 1 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Loading additional Camel XML routes from: classpath:camel/*.xml
2017-08-30 07:38:54.977  INFO 1 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Loading additional Camel XML rests from: classpath:camel-rest/*.xml
2017-08-30 07:38:54.977  INFO 1 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Starting CamelMainRunController to ensure the main thread keeps running
2017-08-30 07:38:54.980  INFO 1 --- [inRunController] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.20.0-SNAPSHOT (CamelContext: gRPC) is starting
2017-08-30 07:38:54.983  INFO 1 --- [inRunController] o.a.c.m.ManagedManagementStrategy        : JMX is enabled
2017-08-30 07:38:55.005  INFO 1 --- [           main] o.a.c.e.springboot.grpc.Application      : Started Application in 3.745 seconds (JVM running for 4.657)
2017-08-30 07:38:55.308  INFO 1 --- [inRunController] o.a.camel.spring.SpringCamelContext      : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2017-08-30 07:38:55.387  INFO 1 --- [inRunController] o.a.camel.component.grpc.GrpcProducer    : Creating channel to the remote gRPC server grpc-server:80
2017-08-30 07:38:55.544  INFO 1 --- [inRunController] o.a.camel.spring.SpringCamelContext      : Route: route1 started and consuming from: timer://foo?period=10000&repeatCount=5
2017-08-30 07:38:55.545  INFO 1 --- [inRunController] o.a.camel.spring.SpringCamelContext      : Total 1 routes, of which 1 are started
2017-08-30 07:38:55.546  INFO 1 --- [inRunController] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.20.0-SNAPSHOT (CamelContext: gRPC) started in 0.565 seconds
2017-08-30 07:38:57.443  INFO 1 --- [2 - timer://foo] route1                                   : Received message: "Hello Camel"

2017-08-30 07:39:06.556  INFO 1 --- [2 - timer://foo] route1                                   : Received message: "Hello Camel"

2017-08-30 07:39:16.551  INFO 1 --- [2 - timer://foo] route1                                   : Received message: "Hello Camel"

2017-08-30 07:39:26.551  INFO 1 --- [2 - timer://foo] route1                                   : Received message: "Hello Camel"

2017-08-30 07:39:36.551  INFO 1 --- [2 - timer://foo] route1                                   : Received message: "Hello Camel"

----

=== Cleanup

Undeploy server and client

[source,bash]
----
$ cd hello-camel-grpc-client-kubernetes
$ mvn -Pkubernetes k8s:undeploy
$ cd ../hello-camel-grpc-server-kubernetes
$ mvn -Pkubernetes k8s:undeploy
----
Make sure no pod is running

[source,bash]
----
$ kubectl get pods
No resources found.
----

==== Help and contributions

If you hit any problem using Camel or have some feedback, 
then please https://camel.apache.org/support.html[let us know].

We also love contributors, 
so https://camel.apache.org/contributing.html[get involved] :-)

The Camel riders!
