Доступ к свойствам VCAP в приложении PCF Spring Boot - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть простое приложение Spring Boot, работающее на PCF. Мне интересно, есть ли лучший способ получить доступ к переменным среды VCAP из PCF. В частности, я пытаюсь получить доступ к учетным данным службы для экземпляра службы RabbitMQ, работающего на PCF и связанного с моим приложением.

В данный момент я получаю доступ к учетным данным с помощью System.getenv:

JSONObject vcapServices = new JSONObject(System.getenv("VCAP_SERVICES"));
JSONArray rabbitmq = (JSONArray) vcapServices.get("p-rabbitmq");
JSONObject serviceInfo = (JSONObject) rabbitmq.get(0);
JSONObject credentials = (JSONObject) serviceInfo.get("credentials");

hostname = credentials.getString("hostname");
virtualHost = credentials.getString("vhost");
username = credentials.getString("username");
password = credentials.getString("password");

Я пытался заставить его работать с аннотацией @Value, чтобы попытаться получить доступ к переменным среды VCAP, например:

@Value("${vcap.services.p-rabbitmq.credentials.hostname}")
private String hostname;

но я пока не смог получить значения.

Есть ли способ получить доступ к переменным VCAP через аннотацию @Value? Или, кроме System.getenv, есть лучший способ получить эти учетные данные из PCF после развертывания приложения?

1 Ответ

0 голосов
/ 08 сентября 2018

Есть ли способ получить доступ к переменным 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();
}

См. Начало работы , если вы хотите проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...