在PCF Spring Boot应用上访问VCAP属性

时间:2018-09-07 15:46:27

标签: spring spring-boot environment-variables pivotal-cloud-foundry

我有一个在PCF上运行的简单Spring Boot应用程序。我想知道是否有更好的方法可以从PCF访问VCAP环境变量。具体来说,我正在尝试访问PCF上运行并绑定到我的应用程序的RabbitMQ服务实例的服务凭据。

此刻,我使用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;

但是我还无法获取这些值。

我可以通过@Value注释访问VCAP变量吗?或者,除了System.getenv之外,还有其他更好的方法可以在我部署应用程序后从PCF获取这些凭据吗?

1 个答案:

答案 0 :(得分:1)

  

我可以通过@Value注释访问VCAP变量吗?

是的,我认为您需要稍微更改格式。是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,并确保将其连接到您的应用程序中。

例如:

@Bean
public RabbitConnectionFactory rabbitFactory() {
    return connectionFactory().rabbitConnectionFactory();
}

如果您有兴趣查看此内容,请参见Getting Started