package org.apache.helix.servicediscovery; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.apache.helix.servicediscovery.ServiceDiscovery.Mode; public class ServiceDiscoveryDemo { public static void main(String[] args) throws Exception { String clusterName = "service-discovery-demo"; String zkAddress = "localhost:2199"; String serviceName = "myServiceName"; int numServices = 5; // registration + zk watch demo(clusterName, zkAddress, serviceName, numServices, Mode.WATCH); // registration + periodic poll demo(clusterName, zkAddress, serviceName, numServices, Mode.POLL); // only registration + ondemand demo(clusterName, zkAddress, serviceName, numServices, Mode.NONE); } private static void demo(String clusterName, String zkAddress, String serviceName, int numServices, Mode mode) throws Exception, UnknownHostException { System.out.println("START:Service discovery demo mode:" + mode); ServiceDiscovery serviceDiscovery = new ServiceDiscovery(zkAddress, clusterName, mode); serviceDiscovery.start(); int startPort = 12000; List<MyService> serviceList = new ArrayList<MyService>(); System.out.println("\tRegistering service"); for (int i = 0; i < numServices; i++) { String host = InetAddress.getLocalHost().getHostName(); int port = startPort + i; String serviceId = host + "_" + port; ServiceMetadata metadata = new ServiceMetadata(); metadata.setHost(host); metadata.setPort(port); metadata.setServiceName(serviceName); MyService service = new MyService(serviceId, metadata, serviceDiscovery); service.start(); serviceList.add(service); System.out.println("\t\t" + serviceId); } listAvailableServices(serviceDiscovery); stopAndStartServices(serviceDiscovery, serviceList, mode); for (MyService service : serviceList) { serviceDiscovery.deregister(service.getServiceId()); } serviceDiscovery.stop(); System.out.println("END:Service discovery demo mode:" + mode); System.out.println("============================================="); } /** * Randomly stop and start some services, list all the available services. * This demonstrates that the list is dynamically updated when services * starts/stops * @param serviceDiscovery * @param serviceList * @param mode * @throws Exception */ private static void stopAndStartServices(ServiceDiscovery serviceDiscovery, List<MyService> serviceList, Mode mode) throws Exception { // randomly select some services stop int index = ((int) (Math.random() * 1000)) % serviceList.size(); MyService service = serviceList.get(index); String serviceId = service.getServiceId(); System.out.println("\tDeregistering service:\n\t\t" + serviceId); serviceDiscovery.deregister(serviceId); switch (mode) { case WATCH: Thread.sleep(100);// callback should be immediate break; case POLL: System.out.println("\tSleeping for poll interval:" + ServiceDiscovery.DEFAULT_POLL_INTERVAL); Thread.sleep(ServiceDiscovery.DEFAULT_POLL_INTERVAL + 1000); break; case NONE: // no need to wait, it reads on demand default: break; } listAvailableServices(serviceDiscovery); Thread.sleep(100); System.out.println("\tRegistering service:" + serviceId); serviceDiscovery.register(serviceId, service.getMetadata()); } private static void listAvailableServices(ServiceDiscovery serviceDiscovery) { List<ServiceMetadata> findAllServices = serviceDiscovery.findAllServices(); System.out.println("\tSERVICES AVAILABLE"); System.out.printf("\t\t%s \t%s \t\t\t%s\n", "SERVICENAME", "HOST", "PORT"); for (ServiceMetadata serviceMetadata : findAllServices) { System.out.printf("\t\t%s \t%s \t\t%s\n", serviceMetadata.getServiceName(), serviceMetadata.getHost(), serviceMetadata.getPort()); } } }