Использование zuul для маршрутизации, когда serviceId - eureka.instance.appname - PullRequest
0 голосов
/ 13 июня 2019

У меня есть служба, работающая в различных средах виртуальных машин: Dev, Test, Staging и т. Д. Я хочу зарегистрировать сервисы для всех непроизводственных сред на одном сервере eureka. Я различаю эти сервисы, используя то же имя spring.application.name, но другое имя eureka.instance.appname, например:

eureka.instance.appname=${spring.application.name}_${spring.profiles.active}_${variant:}

Опять-таки, одна и та же служба развернута в виде разных вариантов (на основе нескольких параметров, таких как регион и т. Д.), Управляемых свойством $ {variable:}. Таким образом, в одной и той же среде, скажем Dev, один и тот же сервис на одном и том же сервере порождается в разных портах.

Approach1: Услуги регистрируются следующим образом: service application.yml:

logging.level.org.springframework.jdbc.core=TRACE
management.endpoints.web.exposure.include=*
eureka.client.serviceUrl.defaultZone = http://${EUREKA_SERVER:localhost}:8761/eureka/
eureka.instance.leaseRenewalIntervalInSeconds= 1
eureka.instance.leaseExpirationDurationInSeconds= 2
eureka.instance.appname=${spring.application.name}_${spring.profiles.active}_${variant:}

Сервер eureka правильно регистрирует их как отдельные службы:

service_dev_us n/a (1)  (1) UP (1) - devhostname:service:port1
service_dev_mx n/a (1)  (1) UP (1) - devhostname:service:port2
service_test_us n/a (1) (1) UP (1) - testhostname:service:port1
service_test_mx n/a (1) (1) UP (1) - testhostname:service:port2

Здесь сервис - это spring.application.name. service_dev_us - это имя eureka.instance.app для этого варианта «us» в среде «dev».

Когда я использую zuul с минимальной конфигурацией:

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${EUREKA_SERVER:localhost}:8761/eureka/
  instance:
    preferIpAddress: true

для автоматической маршрутизации этих услуг, маршруты указаны правильно, как:

{
"/service_dev_us/**" : "service_dev_us"
}

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

В дополнение к моей путанице, у меня есть несколько служб PCF, зарегистрированных на одном и том же сервере eureka, где я дифференцирую эти службы точно так же, используя имя eureka.instance.appname, а spring.application.name одинаково для всех экземпляров. службы. Приложение PCF yml

management:
   endpoints:
      web:
        exposure:
          include:
            - "*"
eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_SERVER}
  instance:
    prefer-ip-address: false
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
    appname: ${spring.application.name}_${spring.profiles.active}_${variant:}

Но там имена хостов в instanceid уникальны, когда они регистрируются в eureka.

PCFSERVICE_DEV_US   n/a (1) (1) UP (1) - pcfservice-dev-us.pcf.com:e8be8933-7216-4a58-50f5-d2e3
PCFSERVICE_TEST_US  n/a (1) (1) UP (1) - pcfservice-test-us.pcf.com:3c36058f-00ea-4ac9-6555-8ba0

Тот же сервис zuul с той же минимальной конфигурацией может правильно отобразить его

{
"/pcfservice_dev_us/**" : "pcfservice_dev_us"
}

И на ленте тоже нет проблем с получением списка серверов. Итак, службы pcf работают для имени eureka.instance.appname как идентификаторы службы.

Approach2:

Единственный способ заставить приложения VM работать с существующей конфигурацией zuul - это избежать eureka.instance.appname и иметь индивидуальные spring.application.name для каждого варианта, такого как service_us, service_mx, и запускать их на отдельных серверах eureka для каждая среда

Dev Eureka Server

service_us n/a (1)  (1) UP (1) - devhostname:service_us:port1
service_mx n/a (1)  (1) UP (1) - devhostname:service_mx:port2

Тест Eureka Server

service_us n/a (1)  (1) UP (1) - testhostname:service_us:port1
service_mx n/a (1)  (1) UP (1) - testhostname:service_mx:port2

Можно ли зарегистрировать мои сервисы, используя первый подход, т. Е. Разные eureka.instance.appname для разных экземпляров одного сервиса с одним spring.application.name и получить правильное сопоставление в eureka, чтобы сервисы были правильно разрешено с помощью ленты?

...