2017-05-25 2 views
3

Ich versuche, eine Beispielanwendung mit Federwolke und minikube, die aus drei Feder Boot-Anwendungen bestehen zu entwickeln.Java - Kubernetes Dienst findet nach Label

Die ersten beiden sind zwei verschiedene Anwendungen (Server), die den gleichen Endpunkt, aber unterschiedliche Funktionalität haben, und der dritte ist ein Client, der die zwei anderen Anwendungen in eine einzige exponierte API integriert.

Ich habe es geschafft, alle drei Anwendungen in minikube zu implementieren und den gesamten Stack zu entwickeln und sie miteinander kommunizieren zu lassen, aber jetzt möchte ich einen Schritt weiter gehen und die Entdeckung der beiden Server ohne harte Codierung automatisch machen die Servicenamen.

ich entfalteten die beiden Server in minikube das gleiche Label verwenden und möchten etwas finden, so dass der Kunde die Dienste auf die zwei Server-Anwendungen automatisch im Zusammenhang zu finden ist in der Lage. Dadurch kann die Anwendung problemlos erweitert werden. Wenn ich dem Stack einen neuen Server hinzufüge, wird der Client ihn finden und ohne Änderungen verfügbar machen.

Mit Netflix Eureka Dies kann leicht durch etwas mit wie

discoveryClient.getInstances("service-name").forEach((ServiceInstance s) 

Aber ich keinen Mangel erreicht werden, um einen zusätzlichen Heureka-Server in die Liste der Microservices hinzuzufügen, da wir Kubernetes verwenden werden.

Gibt es eine Bibliothek, die diese Funktionalität für Kubernetes gibt?

Antwort

1

können Sie verwenden:

CLI: kubectl get services --selector=YOUR-LABEL-NAME.

API: GET /api/v1/namespaces/{namespace}/services mit labelSelector Parameter siehe API docs.

+0

wusste, dass ich über cli und api aber gibt es eine Java-Bibliothek, die das und wandelt macht Cloud-Sevice zu springen? – Sebb77

+1

Am einfachsten ist der API-Aufruf von Ihrem Spring Cloud Service? Warum brauchst du eine Java-Bibliothek? –

1

fand ich fabric8 Bibliothek, die mir geholfen, dies zu erreichen. Sie wissen immer noch nicht, ob dies die richtige Antwort ist, aber es funktioniert: D

https://github.com/fabric8io/kubernetes-client/tree/master/kubernetes-client

@RequestMapping("/") 
private String getResponse() { 
    String ret = "hello from Client L0L!!!\n"; 

    //Config config = new ConfigBuilder().withMasterUrl("https://mymaster.com").build(); 
    //KubernetesClient client = new DefaultKubernetesClient(config); 
    KubernetesClient client = new DefaultKubernetesClient(); 


    ServiceList services = client.services().withLabel("APIService").list(); 
    Service server = null; 
    log.warn("---------------------------------------------->"); 
    for (Service s : services.getItems()) { 
     log.warn(s.getMetadata().getName()); 
     log.warn(s.toString()); 
     if (s.getMetadata().getLabels().containsKey("ServiceType") && s.getMetadata().getLabels().get("ServiceType").equals("server")) 
      server = s; 
    } 

    log.warn("---------------------------------------------->"); 

    String s = ""; 
    if (server != null) { 
     RestTemplate t = new RestTemplate(); 
     String url = "http://" + server.getMetadata().getName() + ":" + server.getSpec().getPorts().get(0).getPort() + "/"; 
     log.warn("Contacting server service on: " + url); 
     s = t.getForObject(url, String.class); 
     log.warn("Response: " + s); 
    } else { 
     log.warn("Didn't find service with label ServiceType=server!!!"); 
    } 

    return ret + " - " + s; 
} 

ich die beiden Dienste und hinzugefügt, um die beiden Labels im Code verwendet erstellen.