On this page
73. Service Discovery with Zookeeper
Service Discovery is one of the key tenets of a microservice based architecture. Trying to hand-configure each client or some form of convention can be difficult to do and can be brittle. Curator (A Java library for Zookeeper) provides Service Discovery through a Service Discovery Extension . Spring Cloud Zookeeper uses this extension for service registration and discovery.
73.1 Activating
Including a dependency on org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
enables autoconfiguration that sets up Spring Cloud Zookeeper Discovery.
For web functionality, you still need to include
org.springframework.boot:spring-boot-starter-web
.
When working with version 3.4 of Zookeeper you need to change the way you include the dependency as described here.
73.2 Registering with Zookeeper
When a client registers with Zookeeper, it provides metadata (such as host and port, ID, and name) about itself.
The following example shows a Zookeeper client:
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
The preceding example is a normal Spring Boot application.
If Zookeeper is located somewhere other than localhost:2181
, the configuration must provide the location of the server, as shown in the following example:
application.yml.
spring:
cloud:
zookeeper:
connect-string: localhost:2181
If you use Spring Cloud Zookeeper Config, the values shown in the preceding example need to be in
bootstrap.yml
instead ofapplication.yml
.
The default service name, instance ID, and port (taken from the Environment
) are ${spring.application.name}
, the Spring Context ID, and ${server.port}
, respectively.
Having spring-cloud-starter-zookeeper-discovery
on the classpath makes the app into both a Zookeeper “service” (that is, it registers itself) and a “client” (that is, it can query Zookeeper to locate other services).
If you would like to disable the Zookeeper Discovery Client, you can set spring.cloud.zookeeper.discovery.enabled
to false
.
73.3 Using the DiscoveryClient
Spring Cloud has support for Feign (a REST client builder) and Spring RestTemplate , using logical service names instead of physical URLs.
You can also use the org.springframework.cloud.client.discovery.DiscoveryClient
, which provides a simple API for discovery clients that is not specific to Netflix, as shown in the following example:
@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<ServiceInstance> list = discoveryClient.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri().toString();
}
return null;
}