0

Я смотрю Spring Boot/Cloud и Netflix FWs (Eureka, Ribbon). Я работаю в этом примере:Балансировка нагрузки весной Cloud/Netflix OSS

https://spring.io/blog/2015/07/14/microservices-with-spring В основном речь идет о небольших микросредах Spring Boot, которые используют реестр службы Eureka.

Теперь я хочу запустить несколько экземпляров одной и той же службы (в этом примере AccountService, на разных портах). Все, что я прочитал (выше статьи, http://callistaenterprise.se/blogg/teknik/2015/04/10/building-microservices-with-spring-cloud-and-netflix-oss-part-1/ и т. Д.), Предполагает, что если я это сделаю, все экземпляры будут зарегистрированы с Eureka избыточно, и когда я вызову услугу, будет применена балансировка нагрузки на стороне клиента, а услуга для вызова будет динамически выбрана.

Однако это НЕ, что происходит. Когда я запускаю первый экземпляр службы, он регистрируется и появляется на панели инструментов Eureka. Когда я запускаю ту же службу на другом порту, она также регистрируется, но, похоже, ЗАМЕНИТЬ предыдущий экземпляр службы: на панели инструментов Eureka показывается только один экземпляр с доступными зонами = 1 (должен быть 2?) И ВСЕ вызовы этой услуги обрабатываются вторым экземпляром. Когда я запрашиваю реестр, применяется только этот экземпляр.

Когда я останавливаю второй экземпляр, через некоторое время Эврика переключается на первый, и он все еще работает. Таким образом, похоже, что он хранит все экземпляры, но только когда-либо использует экземпляр, который был зарегистрирован последним.

Пропустить что-нибудь важное? Я думал, что все экземпляры должны использоваться одновременно?

========== Свойства приложения являются (те практически не изменились к примеру от Spring Site):

EurekaServer

eureka: 
    instance: 
    hostname: localhost 
    client:  
    registerWithEureka: false 
    fetchRegistry: false 

server: 
    port: 1111  

spring: 
    thymeleaf: 
    enabled: false 

AccountsServer

spring: 
    application: 
    name: accounts-service 
    freemarker: 
    enabled: false   
    thymeleaf: 
    cache: false    
    prefix: classpath:/accounts-server/templates/  

eureka: 
    client: 
    serviceUrl: 
     defaultZone: http://localhost:1111/eureka/ 

server: 
    port: 4444 # HTTP (Tomcat) port, for the second instance this is changed to a different port 
+0

Вы можете размещать свои приложения.properties от клиента и сервера? –

ответ

4

@dshuld, если вы используете поезд для выпуска ангела или версию 1.0.x, вам нужно, чтобы каждый экземпляр имел уникальный идентификатор. См. docs here. Что-то вроде:

eureka: 
    instance: 
    metadataMap: 
     instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}} 

Для освобождения поезда Brixton (1.1.x) он должен иметь разумный по умолчанию.

+0

Это было именно то, что мне нужно, благодаря связке! – dschuld

0

Я думаю, так как вы используете stat IC номер порта на ваш AccountsServer, Eureka будет зарегистрировать только один экземпляр ...
Вы можете сделать что-то вроде этого на клиентах

server: 
    compression.enabled: true 
    port: 0 

(в данном случае, я использую YAML для настройки, а не свойство)

на шлюзе, вы должны указать, что вы хотите балансировки нагрузки, как то

@Autowired 
private LoadBalancerClient loadBalancer; 
.... 
private String getUrl(){ 
    return loadBalancer.choose("your-service-name").getUri().toString(); 
} 

Я сделал что-то подобное, если вы заинтересованы вы можете взглянуть here

+0

Как я уже писал в этом вопросе, второй экземпляр запускается с другого порта.И я также пытался использовать метод LoadBalancerClient.choose(), но также и тот, который дает мне только один экземпляр и никогда другой. – dschuld

+0

О, извините, я этого не видел. что произойдет, если вы ждете 1 или 2 минуты? может ли клиент найти два экземпляра? –

+0

Нет, он только когда-либо находит экземпляр, который был зарегистрирован последним ... Когда я останавливаю этот экземпляр, он переключается обратно на тот, который был зарегистрирован первым – dschuld