# Spring Boot and ServiceCall EIP Example

This example show how to use Camel with ServiceCall EIP with spring-boot and consul.

This example includes two maven modules:

 - services that exposes a number of services
 - consumer that consumes services

## Configuration

The consumer is configured in the src/main/resources/application.properties in which we blacklist some services for being discovered and we add some additional services not managed by consul

    # Configure service filter
    camel.cloud.service-filter.blacklist[service-1] = localhost:9012

    # Configure additional services
    camel.cloud.service-discovery.services[service-2] = localhost:9021,localhost:9022,localhost:9023


## Build

You can build this example using

    mvn compile

## Run the example

Using multiple shells:

 - start consul:

  $ cd services
  $ src/main/bash/consul-run-linux.sh      (for linux)
  $ src/main/bash/consul-run-osx.sh        (for mac osx)

 - start the service-1 service group:

  $ cd services
  $ mvn spring-boot:run -Dspring.profiles.active=service-1

  - start the service-2 service group:

  $ cd services
  $ mvn spring-boot:run -Dspring.profiles.active=service-2

  - start the consumer

  $ cd consumer
  $ mvn spring-boot:run

## Test the example:

In a new shell:

  $ curl localhost:8080/camel/serviceCall/service1
  Hi!, I'm service-1 on camel-1/route1
  $ curl localhost:8080/camel/serviceCall/service2
  Hi!, I'm service-1 on camel-1/route2

If you keep calling the http endpoint you'll notice they are consumed using a round robin policy and that one of the services registered in consul is not taken into account according to the blacklist.

## Web console

You can open the Consul web console

     http://localhost:8500/ui

Where you can find information about the services and its state.
     

## More information

You can find more information about Apache Camel at the website: http://camel.apache.org/

