Service Registry

Service registration is a key part of service discovery which Camel leverages through the Service Call EIP and support to ease the process to expose routes in a cloud environment and consume them with minimal configuration.

Service Registry Set-Up

A ServiceRegistry is just like any other camel service so set it up you only need to register your implementations to the CamelContext:

ServiceRegistry service = new MyServiceRegistry();

context.addService(service);

The configuration of the Service Registry depends on the implementation you have chosen. Out of the box camel provides the following implementations:

Type Module Class

consul

camel-consul

org.apache.camel.component.consul.cloud.ConsulServiceRegistry

spring-cloud

camel-spring-cloud

org.apache.camel.component.spring.cloud.CamelSpringCloudServiceRegistry

zookeeper

camel-zookeeper

org.apache.camel.component.zookeeper.cloud.ZooKeeperServiceRegistry

Service Registry Usage

The Service Registry SPI is leveraged by the following new implementations:

ServiceRegistryRoutePolicy

This is an implementation of a Route Policy that register/deregister routes to a given ServiceRegistry according to route’s life-cycle:

RoutePolicy policy = new ServiceRegistrationRoutePolicy()

// bind the policy to one or more routes
from("undertow:http://0.0.0.0:8080")
    .routePolicy(policy)
    .log("Route ${routeId} has been invoked");

To apply the same policy to all the routes a dedicated RoutePolicyFactory can be used:

// add the service registry route policy factory to context
context.addRoutePolicyFactory(new ServiceRegistrationRoutePolicyFactory()));

To configure how the service is exposed you can add route specific properties like:

// bind the policy to one or more routes
from("undertow:http://0.0.0.0:8080")
    .routePolicy(policy)
    .routeProperty(ServiceDefinition.SERVICE_META_NAME, "my-service")
    .routeProperty(ServiceDefinition.SERVICE_META_ID, "my-id")
    .routeProperty(ServiceDefinition.SERVICE_META_PORT, "8080")
    .log("Route ${routeId} has been invoked");

Service name and service id can also be provided by routeId and routeGroup:

// bind the policy to one or more routes
from("undertow:http://0.0.0.0:8080")
    .routePolicy(policy)
    .routeGroup("my-service")
    .routeId("my-id")
    .routeProperty(ServiceDefinition.SERVICE_META_PORT, "8080")
    .log("Route ${routeId} has been invoked");

Any property prefixed with service. is automatically added to the service’s metadata.

Some component such has camel-undertow and those based on camel-http-common implement DiscoverableService and they can automatically provide the metadata needed for service registration.

Service Component

The Service component is similar to a ServiceRegistrationRoutePolicyFactory but is capable of tagging routes that need to be registered to the ServiceRegistry by prefixing the related endpoints with service:name according to the following syntax:

service:serviceName:delegateUri[?options]

Let’s explain this with an example:

from("service:my-service:undertow:http://0.0.0.0:8080")
    .log("Route ${routeId} has been invoked");

To configure how the service is exposed you can add service specific endpoint options such as:

from("service:my-service:undertow:http://0.0.0.0:8080?service.id=my-service-id")
    .log("Route ${routeId} has been invoked");

Any option prefixed with service. is automatically added to the service’s metadata.