2016-02-15 1 views
7

Я написал микросервис с пружинной загрузкой и клиент REST. Клиент является частью другого модуля и вызывает вызовы RESTful на микросервис. Микросертификация регистрируется с реестром Eureka, и я хочу, чтобы мой клиент (который не является проектом загрузки Spring) использовал Eureka для запроса и получения конечных точек службы.Открытие службы Eureka без весенней загрузки

Моя проблема, так как клиент не является приложений Spring-загрузки я не могу использовать аннотации как @SpringBootApplication@EnableDiscoveryClient, и DiscoveryClient не получают автоматически подключается к приложению. Есть ли в любом случае, чтобы вручную автообновить фасоль DiscoveryClient клиенту без использования аннотаций?

+0

Проверьте '@ EnableDiscoveryClient' аннотаций, найти конфигурацию, что импорт и тиражировать, что в свой собственный проект. –

ответ

12

Ну вот как я это сделал. В принципе, это намного проще, чем я ожидал. Далее был скопирован с 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()); 

Также вы должны добавить файл конфигурации в путь класса. Клиент Eureka использует этот файл для чтения информации о серверах eureka.

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

Также вы должны предоставить клиента eureka в качестве зависимости. Eureka1 поддерживает JDK7, хотя часть его была построена с помощью JDK8. Однако мне пришлось предоставить более старые версии «archaius-core» и «servo-core», чтобы запустить его с помощью 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 полностью поддерживает JDK7.

2

Либо вы используете Netflix-Эврика-клиент без пружинного облака и должен настроить все самостоятельно (что означает дублирующую EurekaDiscoveryClientConfiguration)

Или вы могли бы запустить службу коляски. Коляска включает в себя zuul-proxy, который проксирует услуги, открытые eureka. Взгляните int Spring Cloud Docs - Polyglot support with Sidecar

0

личный доступ к Eureka от устаревших яровой (без загрузки) также делается просто, как @EnableEureka и @EnableFeignClient

Это ближайший я мог заставить его работать. Этот пример доступен в Эврика-примеры в 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; 
    } 
} 

Мой клиент

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());