Обнаружение сервиса Eureka без Spring-boot

Я написал микро-сервис spring boot и клиент REST. Клиент входит в состав другого модуля и совершает спокойные звонки на микро-сервис. Микро-сервис регистрируется в реестре Eureka, и я хочу, чтобы мой клиент (который не является проектом spring boot) использовал Eureka для запроса и получения конечных точек службы.

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

3 ответов


Ну вот как я это сделал. В принципе, это намного проще, чем я ожидал. Следующее было скопировано из проект Netflix eureka.

  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.


либо вы используете netflix-eureka-client без spring-cloud и должны настроить все самостоятельно (что означает дублирование EurekaDiscoveryClientConfiguration)

или вы можете запустить службу sidecar. Коляска включает в себя Zuul-прокси, который будет прокси-службы, обнаруженные Эврика. Посмотрите в Spring Cloud Docs - поддержка полиглота с коляской


желание доступа к Eureka из legacy spring (без загрузки) также просто, как @EnableEureka и @EnableFeignClient

Это самое близкое, что я мог заставить его работать . Этот пример доступен в Eureka-примеры в 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());