Есть ли способ получить доступ к переменным VCAP через аннотацию @Value?
Да, я думаю, вам нужно немного изменить свой формат. Это vcap.services.<service-instance-name>.credentials.hostname
. У вас есть имя самого поставщика услуг, а не имя вашего экземпляра службы. Я не вижу этого имени в приведенном выше примере, но я нашел Javadoc полезным. В нем приведен следующий пример.
VCAP_SERVICES: {
"rds-mysql-1.0": [
{
"credentials": {
"host": "mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com",
"hostname": "mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com",
"name": "d04fb13d27d964c62b267bbba1cffb9da",
"password": "pxLsGVpsC9A5S",
"port": 3306,
"user": "urpRuqTf8Cpe6",
"username": "urpRuqTf8Cpe6"
},
"label": "rds-mysql-1.0",
"name": "mysql",
"plan": "10mb"
}
]
}
В этом примере имя поставщика услуг - "rds-mysql-1.0", которое будет таким же, как "p-rabbitmq" в вашем примере. Затем у него есть имя экземпляра службы «mysql», и именно это вы бы использовали в качестве заполнителя вашего свойства.
Пример: vcap.services.mysql.credentials.host
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/cloud/CloudFoundryVcapEnvironmentPostProcessor.html
Объяснив все это, все еще может потребоваться немало усилий, чтобы соединить все ваши свойства. Особенно, если вы используете несколько служб или в вашем случае, вы используете RabbitMQ, у которого много информации, которая передается через VCAP_SERVICES.
Другой вариант, который следует рассмотреть, это Spring Cloud Connectors . Это библиотека, которая в основном будет обрабатывать все это для вас. Вы запрашиваете DataSource или ConnectionFactory, и он проверяет, подключен ли он к вашему приложению.
Ex:
@Bean
public RabbitConnectionFactory rabbitFactory() {
return connectionFactory().rabbitConnectionFactory();
}
См. Начало работы , если вы хотите проверить это.