Spring Boot Admin не может отличаться между несколькими экземплярами службы в Cloudfoundry - PullRequest
0 голосов
/ 27 июня 2018

Я получил Spring Boot Admin, работающий локально с Eureka Service Discovery (нет зависимости SBA в клиентах). Теперь я попытался развернуть его в Cloudfoundry. Согласно документации, версия 2.0.1 должна «поддерживать CloudFoundry из коробки».

Моя проблема в том, что когда я масштабирую службу до нескольких экземпляров, все они регистрируются под одним именем хоста и портом. Эврика показывает мне все экземпляры с их InstanceID, который я настроил так:

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

Но Spring Boot Admin перечисляет только один экземпляр с именем хоста: порт в качестве идентификатора. Я думаю, что я должен настроить что-то на клиенте, чтобы он отправлял идентификатор экземпляра для HTTP-заголовка при регистрации. Но я не знаю как.

1 Ответ

0 голосов
/ 03 июля 2018

Очевидно, вы должны установить ApplicationId и InstanceIndex, которые Cloudfoundry генерирует как Eureka ApplicationId и InstanceId при запуске / ContextRefresh вашего клиента.

CloudFoundryApplicationInitializer.kt

@Component
@Profile("cloud")
@EnableConfigurationProperties(CloudFoundryApplicationProperties::class)
class CloudFoundryApplicationInitializer {

private val log = LoggerFactory.getLogger(CloudFoundryApplicationInitializer::class.java)

@Autowired
private val applicationInfoManager: ApplicationInfoManager? = null

@Autowired
private val cloudFoundryApplicationProperties: CloudFoundryApplicationProperties? = null

@EventListener
fun onRefreshScopeRefreshed(event: RefreshScopeRefreshedEvent) {
    injectCfMetadata()
}

@PostConstruct
fun onPostConstruct() {
    injectCfMetadata()
}

fun injectCfMetadata() {

    if(this.cloudFoundryApplicationProperties == null) {
        log.error("Cloudfoundry Properties not set")
        return
    }

    if(this.applicationInfoManager == null) {
        log.error("ApplicationInfoManager is null")
        return
    }

    val map = applicationInfoManager.info.metadata
    map.put("applicationId", this.cloudFoundryApplicationProperties.applicationId)
    map.put("instanceId", this.cloudFoundryApplicationProperties.instanceIndex)

    }
}

CloudFoundryApplicationProperties.kt

@ConfigurationProperties("vcap.application")
class CloudFoundryApplicationProperties {
    var applicationId: String? = null
    var instanceIndex: String? = null
    var uris: List<String> = ArrayList()
}
...