2016-02-15 20 views
7

Ho scritto un micro-servizio di avvio a molla e un client REST. Il client fa parte di un altro modulo e effettua chiamate RESTful al micro-servizio. Il micro-servizio si registra con il registro Eureka e voglio che il mio client (che non è un progetto di avvio a molla) utilizzi Eureka per interrogare e ottenere gli endpoint del servizio.Scoperta del servizio Eureka senza Spring-boot

Il mio problema è poiché il cliente non è un applicazioni di primavera-avvio non posso usare le annotazioni come @SpringBootApplication, @EnableDiscoveryClient e il DiscoveryClient non è ottenere automaticamente collegato all'applicazione. È comunque possibile collegare automaticamente il bean DiscoveryClient al client senza utilizzare le annotazioni?

+0

Controllare il '@ EnableDiscoveryClient' annotazioni, trovare la configurazione che le importazioni e duplicare che nel proprio progetto. –

risposta

12

Bene, ecco come l'ho fatto. Fondamentalmente è molto più facile di quanto mi aspettassi. Il seguente è stato copiato da Netflix eureka project.

DiscoveryManager.getInstance().initComponent(new MyDataCenterInstanceConfig(), new DefaultEurekaClientConfig()); 

    String vipAddress = "MY-SERVICE"; 

    InstanceInfo nextServerInfo = null; 
    try { 
     nextServerInfo = DiscoveryManager.getInstance() 
       .getEurekaClient() 
       .getNextServerFromEureka(vipAddress, false); 
    } catch (Exception e) { 
     System.err.println("Cannot get an instance of example service to talk to from eureka"); 
     System.exit(-1); 
    } 

    System.out.println("Found an instance of example service to talk to from eureka: " 
      + nextServerInfo.getVIPAddress() + ":" + nextServerInfo.getPort()); 

    System.out.println("healthCheckUrl: " + nextServerInfo.getHealthCheckUrl()); 
    System.out.println("override: " + nextServerInfo.getOverriddenStatus()); 

    System.out.println("Server Host Name "+ nextServerInfo.getHostName() + " at port " + nextServerInfo.getPort()); 

Inoltre è necessario aggiungere un file di configurazione per il percorso della classe. Il client Eureka utilizza questo file per leggere le informazioni sui server eureka.

eureka.preferSameZone=true 
eureka.shouldUseDns=false 
eureka.serviceUrl.default=http://localhost:8761/eureka/ 
eureka.decoderName=JacksonJson 

Inoltre, è necessario fornire al client eureka una dipendenza. Eureka1 supporta JDK7 anche se alcune parti di esso sono state create con JDK8. Tuttavia, dovevo fornire versioni precedenti di "archaius-core" e "servo-core" per farlo funzionare con JDK7.

<dependency> 
     <groupId>com.netflix.archaius</groupId> 
     <artifactId>archaius-core</artifactId> 
     <version>0.7.3</version> 
    </dependency> 
    <dependency> 
     <groupId>com.netflix.servo</groupId> 
     <artifactId>servo-core</artifactId> 
     <version>0.10.0</version> 
    </dependency> 

Eureka2 supporta completamente JDK7.

2

O si usa il Netflix-eureka-client senza molla-cloud e devono configurare tutto da solo (che significa EurekaDiscoveryClientConfiguration duplicazione)

o si potrebbe eseguire un servizio sidecar. Il sidecar include un proxy zuul che dovrebbe delegare i servizi scoperti da eureka. Date un'occhiata al Spring Cloud Docs - Polyglot support with Sidecar

0

dei desideri accesso Eureka dalla primavera legacy (non di avvio) anche è reso semplice come @EnableEureka e @EnableFeignClient

Questo è il più vicino ho potuto farlo funzionare. Questo esempio è disponibile in Eureka-esempi in Git Hub

public class EurekaConfiguration { 

    private static ApplicationInfoManager applicationInfoManager; 
    private static EurekaClient eurekaClient; 

    private static synchronized ApplicationInfoManager initializeApplicationInfoManager(
      EurekaInstanceConfig instanceConfig) { 
     if (applicationInfoManager == null) { 
      InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get(); 
      applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo); 
     } 

     return applicationInfoManager; 
    } 

    private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager, 
      EurekaClientConfig clientConfig) { 
     if (eurekaClient == null) { 
      eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig); 
     } 

     return eurekaClient; 
    } 

    public static EurekaClient getEurekaClient() 
    { 
     ApplicationInfoManager applicationInfoManager = initializeApplicationInfoManager(new MyDataCenterInstanceConfig()); 
     EurekaClient client = initializeEurekaClient(applicationInfoManager, new DefaultEurekaClientConfig()); 
     return eurekaClient; 
    } 
} 

Il mio cliente

String vipAddress = "NLPService"; 

     InstanceInfo nextServerInfo = null; 
     try { 
      nextServerInfo = EurekaConfiguration.getEurekaClient().getNextServerFromEureka(vipAddress, false); 
     } catch (Exception e) { 
      System.err.println("Cannot get an instance of example service to talk to from eureka"); 
      System.exit(-1); 
     } 

     System.out.println("Found an instance of example service to talk to from eureka: " 
       + nextServerInfo.getVIPAddress() + ":" + nextServerInfo.getPort()); 

     String serviceBaseURL = "http://"+ nextServerInfo.getHostName() 
     +":"+nextServerInfo.getPort(); 


     String nlpServiceURL = serviceBaseURL +"/nlp"; 

     RestTemplate restTemplate = new RestTemplate(); 

     NLPInputToBeTransformed input = new NLPInputToBeTransformed(); 
     input.setInputText(" Test Input "); 


     NLPResponse nlpResponse = restTemplate.postForObject 
       (nlpServiceURL, input, NLPResponse.class, new HashMap<>()); 

     System.out.println(" Service Response " + nlpResponse.getTags()); 
Problemi correlati