【问题标题】:Spring Boot and how to configure connection details to MongoDB on cloud foundry?Spring Boot 以及如何在 Cloud Foundry 上配置与 MongoDB 的连接详细信息?
【发布时间】:2016-12-22 23:05:07
【问题描述】:

我目前正在使用 mongodb 创建一个 Spring Boot Web 应用程序。在本地,我能够运行我的应用程序,并且正在检索和存储数据。 但不是在云代工上。任何提示、链接或任何对我有帮助的东西都将不胜感激!

问题

当我将它推入 Cloud Foundry 时,我无法连接到我的 mongodb。我知道我们必须在 Cloud Foundry 上配置一些东西才能让它工作。我尝试使用 mongodb PCF,即使我将它绑定到我的应用程序,它仍然没有运行我的应用程序。我一直在网上搜索,试图找到正确的配置。

其他想法

我在使用 MongoDb 时从未设置过用户名和密码。我目前只是将 localhost 与 port27017 一起使用。也许我需要在我的 V_CAP 或环境变量上配置凭据,但我无法在 cloudfoundry.com 的 UI 上编辑这些凭据。是否会有命令行提示符将这些变量配置到 cf 中?我查看了几个文档,但我不清楚将这些 bean 添加到哪个配置文件中,或者它是否有助于让 mongodb 在云代工厂上运行Doc1

Cloud Foundry 连接错误

输出 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“indexController”的 bean 时出错:不满意 通过字段“apL”表示的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“appPortList”的 bean:调用 init 方法 失败的;嵌套异常是 org.springframework.dao.DataAccessResourceFailureException:超时 在等待匹配的服务器 30000 毫秒后 ReadPreferenceServerSelector{readPreference=primary}。客户端视图 集群状态为 {type=UNKNOWN, servers=[{address=127.0.0.1:27017, 类型=未知,状态=连接, exception={com.mongodb.MongoSocketOpenException: 异常开启 socket},由 {java.net.ConnectException: Connection refused}}] 引起; 嵌套异常是 com.mongodb.MongoTimeoutException: Timed out after 等待匹配的服务器时 30000 毫秒 ReadPreferenceServerSelector{readPreference=primary}。客户端视图 集群状态为 {type=UNKNOWN, servers=[{address=127.0.0.1:27017, 类型=未知,状态=连接, exception={com.mongodb.MongoSocketOpenException: 异常开启 socket},由 {java.net.ConnectException: Connection refused}}]

引起

【问题讨论】:

  • 您使用的是 PWS(Pivotal Web 服务)、Bluemix 还是 Swisscom?在这些 PaaS 上使用 mongodb 可能会略有不同。
  • PWS,如何创建 mongodb 用户名和密码,以便将其传递给这些变量。
  • 用户名和密码应由 PWS 为您创建。您可以通过检查应用程序的环境来查看它们——例如通过运行cf env <your_app_name>

标签: spring mongodb cloud cloud-foundry


【解决方案1】:

理论上,Spring boot 云连接器应该为你做这件事,但我过去遇到过问题。

或者,您需要添加一个扩展 AbstractMongoConfiguration 的 spring bean。在此配置中,您必须插入您在 VCAP_SERVICES 环境变量中找到的主机、端口、用户名、数据库名称和密码。

您可以通过使用 System.getEnv("VCAP_SERVICES") 获取 VCAP_SERVICES 变量的值来自动插入它,并使用 JACKSON 或其他一些 JSON 库对其进行解析。

@Configuration
@Profile("cloud")
public class DatabaseConfiguration extends AbstractMongoConfiguration {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Override
    public String getDatabaseName() {
        return this.databaseName;
    }

    @Override
    @Bean
    public Mongo mongo() throws Exception {
        List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
        ServerAddress address = new ServerAddress("my_host", 7777);
        serverAddresses.add(address);
        return new MongoClient(serverAdresses,
                singletonList(
                        MongoCredential.createCredential(
                                "my_user_name",
                                "my_database_name",
                                "my_password".toCharArray()
                        )
                )
        );
    }
}

关于你的“其他想法”。无法编辑 CloudFoundry 提供的 VCAP_SERVICES 变量。相反,它应该由您的应用程序读取,以便您的应用程序知道在哪里可以找到 CF 为其提供的 mongodb 实例。

不过,您可以使用“cf set-env”向您的应用程序添加更多环境变量。然而,据我所知,这无助于解决您的问题。

【讨论】:

  • 谢谢!我在哪里可以阅读有关此配置的更多信息?我在上面实现了你的脚本,返回 this.databasename 和 singletonList 时出错。
【解决方案2】:

在 Spring Framework 博客上有一篇关于在 CF 上绑定数据服务的非常好的博文:https://spring.io/blog/2015/04/27/binding-to-data-services-with-spring-boot-in-cloud-foundry

这篇文章在其示例中使用了与 JPA 的关系,但显示的所有内容也适用于 MongoDB。

【讨论】:

  • 我偶然发现了您的 github 示例,您使用云配置文件将 mongodb 与您的应用程序绑定。将 mongodb 与应用程序绑定后,数据会去哪里?我正在尝试查找我存储的所有数据。
  • 您可能希望将 MongoDbFactory bean 放入应用程序上下文中,如本例所示:github.com/cloudfoundry-samples/spring-music/blob/master/src/…。然后创建一个 Spring Data MongoDB Repository bean,如下例所示:github.com/cloudfoundry-samples/spring-music/blob/master/src/…。 Repository bean 将使用 MongoDbFactory bean。
  • 是的,我看到的例子,我在哪里可以访问存储的数据?例如在本地机器上,我可以使用命令行 db.collection.find() 并查询我的所有值。我怎样才能为 mongo-cloud 做同样的事情?\
  • 访问 MongoDB 中的数据完全取决于 MongoDB 的实现。如果您使用上述 PWS,则 mLab 将托管您的 MongoDB。请参阅 docs.run.pivotal.io/marketplace/services/mlab.htmldocs.mlab.com 的文档。
猜你喜欢
  • 2014-06-24
  • 1970-01-01
  • 2018-10-07
  • 2015-03-28
  • 1970-01-01
  • 2020-05-09
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多