访问 PCF Spring 引导应用程序上的 VCAP 属性
Accessing VCAP properties on PCF Spring Boot app
我在 PCF 上有一个简单的 Spring 启动应用程序 运行。我想知道是否有更好的方法从 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 获取这些凭据?
Is there any way I can access VCAP variables via the @Value annotation?
是的,我认为您需要稍微更改一下格式。是 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
解释了所有这些之后,连接所有属性仍然是一项相当大的工作。特别是如果您使用多种服务,或者在您的情况下,您使用的是 RabbitMQ,它有很多通过 VCAP_SERVICES.
传递的信息
更新
Spring Cloud Connectors 仍然是一个选项,将其保留在历史背景下,但 java-cfenv 是未来访问服务属性的推荐方式。它与 Spring Boot 配合使用效果更好,并且功能强大。
已弃用
另一个要考虑的选项是 Spring Cloud Connectors。这是一个基本上可以为您处理所有这些的库。您要求一个 DataSource 或 ConnectionFactory,它确保将一个连接到您的应用程序。
例如:
@Bean
public RabbitConnectionFactory rabbitFactory() {
return connectionFactory().rabbitConnectionFactory();
}
如果您对此感兴趣,请参阅 Getting Started。
我在 PCF 上有一个简单的 Spring 启动应用程序 运行。我想知道是否有更好的方法从 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 获取这些凭据?
Is there any way I can access VCAP variables via the @Value annotation?
是的,我认为您需要稍微更改一下格式。是 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
解释了所有这些之后,连接所有属性仍然是一项相当大的工作。特别是如果您使用多种服务,或者在您的情况下,您使用的是 RabbitMQ,它有很多通过 VCAP_SERVICES.
传递的信息更新
Spring Cloud Connectors 仍然是一个选项,将其保留在历史背景下,但 java-cfenv 是未来访问服务属性的推荐方式。它与 Spring Boot 配合使用效果更好,并且功能强大。
已弃用
另一个要考虑的选项是 Spring Cloud Connectors。这是一个基本上可以为您处理所有这些的库。您要求一个 DataSource 或 ConnectionFactory,它确保将一个连接到您的应用程序。
例如:
@Bean
public RabbitConnectionFactory rabbitFactory() {
return connectionFactory().rabbitConnectionFactory();
}
如果您对此感兴趣,请参阅 Getting Started。