복붙노트

[SPRING] 스프링 부트가없는 유레카 서비스 발견

SPRING

스프링 부트가없는 유레카 서비스 발견

스프링 부트 마이크로 서비스와 REST 클라이언트를 작성했습니다. 클라이언트는 다른 모듈의 일부이며 마이크로 서비스에 대한 RESTful 호출을 작성합니다. 마이크로 서비스는 Eureka 레지스트리에 등록하고 내 클라이언트 (스프링 부트 프로젝트가 아님)가 Eureka를 사용하여 서비스 엔드 포인트를 쿼리하고 가져 오길 원합니다.

내 문제는 클라이언트가 Spring-Boot 응용 프로그램이 아니기 때문에 @SpringBootApplication, @EnableDiscoveryClient와 같은 주석을 사용할 수없고 DiscoveryClient가 자동으로 응용 프로그램에 유선 연결되지 않기 때문입니다. 어노테이션을 사용하지 않고 DiscoveryClient bean을 클라이언트에 수동으로 자동 연결하는 방법이 있습니까?

해결법

  1. ==============================

    1.글쎄, 어떻게 했어. 기본적으로 예상했던 것보다 훨씬 쉽습니다. 다음은 Netflix eureka 프로젝트에서 복사되었습니다.

    글쎄, 어떻게 했어. 기본적으로 예상했던 것보다 훨씬 쉽습니다. 다음은 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.preferSameZone=true
    eureka.shouldUseDns=false
    eureka.serviceUrl.default=http://localhost:8761/eureka/
    eureka.decoderName=JacksonJson
    

    또한 의존성으로 유레카 클라이언트를 제공해야합니다. Eureka1은 JDK7을 지원하지만 일부는 JDK8로 작성되었습니다. 그러나 JDK7을 실행하기 위해서는 "archaius-core"와 "servo-core"의 이전 버전을 제공해야했습니다.

        <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. ==============================

    2.Netflix-eureka-client를 spring-cloud없이 사용하거나 직접 구성해야합니다 (즉, EurekaDiscoveryClientConfiguration을 복제하는 것을 의미합니다)

    Netflix-eureka-client를 spring-cloud없이 사용하거나 직접 구성해야합니다 (즉, EurekaDiscoveryClientConfiguration을 복제하는 것을 의미합니다)

    또는 사이드카 서비스를 운영 할 수도 있습니다. 사이드카에는 유레카가 발견 한 서비스를 프록시 처리하는 zuul-proxy가 포함되어 있습니다. Spring Cloud Docs - Sidecar로 다국어 지원

  3. ==============================

    3.레거시 스프링 (부츠가 아닌)에서 유레카에 액세스하려는 것은 @EnableEureka 및 @EnableFeignClient처럼 간단 해졌습니다.

    레거시 스프링 (부츠가 아닌)에서 유레카에 액세스하려는 것은 @EnableEureka 및 @EnableFeignClient처럼 간단 해졌습니다.

    이것은 내가 일할 수있는 가장 가까운 곳입니다. 이 예제는 Git Hub의 Eureka-examples에서 사용할 수 있습니다.

    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()); 
    
  4. from https://stackoverflow.com/questions/35409492/eureka-service-discovery-without-spring-boot by cc-by-sa and MIT license