starter oss eureka java spring spring-boot microservices netflix-eureka

java - oss - spring cloud config eureka



Descubrimiento del servicio Eureka sin Spring-boot (3)

Escribí un micro-servicio de arranque de primavera y un cliente de REST. El cliente es parte de otro módulo y realiza llamadas RESTful al micro-servicio. El micro-servicio se registra con el registro Eureka y quiero que mi cliente (que no es un proyecto de arranque de primavera) use el Eureka para consultar y obtener los puntos finales del servicio.

Mi problema es que, dado que el cliente no es una aplicación Spring-Boot, no puedo usar las anotaciones como @SpringBootApplication , @EnableDiscoveryClient y DiscoveryClient no se conecta automáticamente a la aplicación. ¿Hay alguna forma de cablear manualmente el bean DiscoveryClient al cliente sin usar las anotaciones?


O bien usa netflix-eureka-client sin spring-cloud y tiene que configurarlo todo usted mismo (lo que significa duplicar EurekaDiscoveryClientConfiguration)

O podrías ejecutar un servicio de sidecar. El sidecar incluye un proxy zuul que verificaría los servicios descubiertos por eureka. Eche un vistazo en Spring Cloud Docs - Soporte de Polyglot con Sidecar


Bueno, así es como lo hice. Básicamente es mucho más fácil de lo que esperaba. Lo siguiente fue copiado del proyecto 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() );

También debe agregar un archivo de configuración a la ruta de clase. El cliente Eureka usa este archivo para leer la información sobre los servidores eureka.

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

También debe proporcionar al cliente eureka como una dependencia. Eureka1 es compatible con JDK7, aunque parte de ella se ha creado con JDK8. Sin embargo, tuve que proporcionar versiones anteriores de "archaius-core" y "servo-core" para que funcione 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 es totalmente compatible con JDK7.


El deseo de acceder a Eureka desde la primavera heredada (sin arranque) también se simplifica como @EnableEureka y @EnableFeignClient

Esto es lo más cerca que podría hacerlo funcionar. Este ejemplo está disponible en Eureka-examples en 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; } }

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