2017-05-25 35 views
3

我試圖開發使用春雲和minikube其中包括3個春天啓動應用程序示例應用程序查找服務。爪哇 - Kubernetes按標籤

前兩個是兩個不同的應用(服務器),其具有相同的端點,但不同的功能,而第三個是用於集成兩個其它應用到一個單一暴露的API的客戶端。

我設法在minikube中部署所有三個應用程序,並設法開發完整堆棧並使它們彼此之間進行通信,但現在我想更進一步,自動發現兩臺服務器,而無需硬編碼服務名稱。

我部署了兩臺服務器中使用minikube相同的標籤,想找到的東西,使客戶能夠自動找到有關這兩個服務器應用程序的服務。這將允許輕鬆地擴展應用程序,以便在向堆棧添加新服務器時,客戶端將找到它並將其公開,無需進行任何更改。

使用Netflix的尤里卡這可以通過使用類似

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

容易實現,但我確實沒有想額外尤里卡服務器添加到微服務的列表,因爲我們將要使用kubernetes。

是否有這給此功能,kubernetes任何圖書館嗎?

回答

1

您可以使用:

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

API:GET /api/v1/namespaces/{namespace}/serviceslabelSelector參數參見API docs

+0

我知道CLI和API,但有一個Java庫,讓這一點,轉換爲春雲服務隊? – Sebb77

+1

最簡單的就是您的春季雲服務的API調用?爲什麼你需要一個Java庫? –

1

我發現fabric8庫,幫助我實現這一目標。 還是不知道這是正確的答案,但它的工作原理: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; 
} 

我創建了兩個服務,並添加代碼中使用的兩個標籤。