| [[ServiceRegistry-ServiceRegistry]] |
| = Service Registry |
| |
| *Since Camel 2.22* |
| |
| [WARNING] |
| ==== |
| *Experimental feature* |
| ==== |
| |
| Service registration is a key part of service discovery which Camel leverages through the _Service Call EIP_ and as of v 2.22.0 Camel provides an experimental support to ease the process to expose routes in a cloud environment and consume them with minimal configuration. |
| |
| == Service Registry Set-Up |
| |
| A _Service Registry_ is just like any other camel service so set it up you only need to register your implementations to the camel context: |
| |
| [source,java] |
| ---- |
| 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: |
| |
| [cols="1,1,2", options="header"] |
| |==== |
| |Type |Module | Class |
| |consul |camel-consul | org.apache.camel.component.consul.cloud.ConsulServiceRegistry |
| |zookeeper |camel-zookeeper | org.apache.camel.component.zookeeper.cloud.ZooKeeperServiceRegistry |
| |spring-cloud |camel-spring-cloud | org.apache.camel.component.spring.cloud.CamelSpringCloudServiceRegistry |
| |==== |
| |
| On Spring/Blueprint all the _Service Registry_ instances are automatically added to the camel context. |
| |
| == Serice Registry Usage |
| |
| The _Service Registry SPI_ is leveraged by the following new implementations: |
| |
| - *ServiceRegistryRoutePolicy* |
| + |
| This is an implementation of a RoutePolicy that register/deregister routes to a given _Service Registry_ according to route's life-cycle |
| + |
| [source,java] |
| ---- |
| fiRoutePolicy 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: |
| + |
| [source,java] |
| ---- |
| // 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: |
| + |
| [source,java] |
| ---- |
| // 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_ |
| + |
| [source,java] |
| ---- |
| // 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"); |
| ---- |
| + |
| [TIP] |
| ==== |
| 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. |
| ==== |
| + |
| [TIP] |
| ==== |
| Any property prefixed with _service._ is automatically added to the service's metadata. |
| ==== |
| |
| - *Service Component* |
| + |
| The service component is similar to a _ServiceRegistrationRoutePolicyFactory_ but let to "tags" routes that need to be registered to the _Service Registry_ by prefixing the related endpoints according to the service component syntax: |
| + |
| [source] |
| ---- |
| service:serviceName:delegateUri[?options] |
| ---- |
| + |
| Example: |
| + |
| [source,java] |
| ---- |
| 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: |
| |
| [source,java] |
| ---- |
| from("service:my-service:undertow:http://0.0.0.0:8080?service.id=my-service-id") |
| .log("Route ${routeId} has been invoked"); |
| ---- |
| |
| [TIP] |
| ==== |
| Any option prefixed with _service._ is automatically added to the service's metadata. |
| ==== |
| |
| == Spring Cloud |
| |
| The _Service Registry_ binding for _Spring Cloud_ let you register your route with minimal code changes a a _Service Registry_ is automatically added to the Camel Context as soon as the camel-spring-cloud dependency is added to the classpath. |
| |
| [WARNING] |
| ==== |
| As the spring-cloud backend has some limitations you need to include also some additional dependencies according to the selected backend. At the moment, the following implementations are provided: |
| |
| [options="header"] |
| |==== |
| |Spring Cloud |Camel |
| |spring-cloud-consul |camel-spring-cloud-consul |
| |spring-cloud-zookeeper |camel-spring-cloud-zookeeper |
| |==== |
| ==== |
| |
| Assuming the consul backend has been chosen the following code will configure and activate the _Service Registry_: |
| |
| [source,properties] |
| ---- |
| # Spring cloud |
| spring.cloud.consul.enabled = true |
| spring.cloud.consul.discovery.enabled = true |
| |
| # Camel Cloud |
| camel.cloud.service-registry.service-host = localhost |
| ---- |
| |
| To register a route, the easy way is then to use the _service_ component as described above. |