数据源对象被Cloud Foundry配置覆盖

时间:2019-08-26 13:14:52

标签: java spring spring-boot cloudfoundry

我有一个Spring Boot应用程序绑定到Cloud Foundry环境中的DB服务实例(postgres)。 该应用程序的VCAP包含以下绑定:

"postgresql": [
   {
    "binding_name": null,
    "credentials": {
     "dbname": "yD6nAoGVmfmqnbex",
     "end_points": [
      {
       "host": "10.11.241.0",
       "network_id": "SF",
       "port": "50257"
      }
     ],
     "hostname": "10.11.241.0",
     "password": "No963ndbbsfndJoj",
     "port": "50257",
     "ports": {
      "5432/tcp": "50257"
     },
     "uri": "postgres://Gw7n8pHTvpM2gh7t:No963ndbbsfndJoj@10.11.241.0:50257/yD6nAoGVmfmqnbex",
     "username": "Gw7n8pHTvpM2gh7t"
    },
    "instance_name": "cispostgres",
    "label": "postgresql",
    "name": "cispostgres",
    "plan": "v9.6-dev",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [
     "postgresql",
     "relational"
    ],
    "volume_mounts": []
   }
  ]

启动应用程序时,Cloud Foundry将创建一个DataSource对象,并将其与预期的先前vcaps的确切配置放到spring的上下文中。

另一个问题:How to update postgres uri value in cf vcaps env

我试图覆盖Datasource neam对象,以便能够将数据库的架构名称连接到url,如下所示:

@Bean(name = "dataSource")
    @Primary
    public DataSource createDataSource() throws SQLException {

        String dbUri = "jdbc:postgresql://10.11.241.0:50257/yD6nAoGVmfmqnbex?currentSchema=accounts";
        String username = "Gw7n8pHTvpM2gh7t";
        String password = "No963ndbbsfndJoj";

        DataSource dataSource = DataSourceBuilder.create()
                .url(dbUri)
                .username(username)
                .password(password)
                .type(org.postgresql.ds.PGSimpleDataSource.class)
                .driverClassName(DRIVER_CLASS_NAME)
                .build();
        return dataSource;
    }

令人难以置信的是,发现云似乎覆盖了我的bean,并在创建我的bean之后创建了一个新的云。

当我执行以下CF命令时:

$ cf us myapp mypostgres
$ cf restart myapp

我的bean并没有过度使用,它可以正常工作。 我正在尝试寻找一种方法来取消由云计算基础人员完成的自动配置,或者为我做的任何事情。

有什么主意吗?

预先感谢

1 个答案:

答案 0 :(得分:2)

有两种方法可以选择退出自动重新配置。

  1. 如果您的应用程序具有从AbstractCloudConfig扩展的Java配置,或者您定义了@Bean类型的Cloud,则可以不选择自动重新配置。无论哪种情况,自动重新配置都应显示您正在手动配置并退出。

    这没有很好的记录,但是first two sections here暗示了这一点。

  2. 通过将环境变量JBP_CONFIG_SPRING_AUTO_RECONFIGURATION设置为{ enabled: false },可以完全禁用自动重新配置。这将完全启用自动重新配置。参见docs here for reference

这两个选项之间的主要区别在于,后者告诉Java buildpack甚至不安装自动重新配置,这意味着您失去了一些附加功能,例如cloud.services属性占位符和{{ 1}} Spring个人资料。

我个人更喜欢选择#2,因为我不使用cloud属性占位符,并且通过添加环境变量cloud.services并将其设置为{{ 1}},假设您需要这样做。

希望有帮助!