如何使用Cloud Foundry通过Vue前端和H2数据库为Spring Boot Web应用提供服务?

时间:2019-05-29 11:50:48

标签: spring-boot vue.js kubernetes cloudfoundry

我遵循了一个使用Vue作为前端并使用Spring Boot作为后端的教程。我写了前端,然后将Vue的dist文件夹中的构建文件放到spring boot web的src \ main \ resources \ static文件夹中。

本教程告诉我使用axios将数据传输到后端。其配置如下:

var axios = require('axios')
axios.defaults.baseURL = 'http://localhost:8090/api'

在我的本地PC上运行良好。但我想放它并使它在云上运行。 我用mvn clean install来构建jar。然后将其上传到IBM的Cloud Foundry。 前端工作。但是,它与后端无关。浏览器的控制台日志显示:

XHR failed loading: OPTIONS "<URL>".
4xhr.js:178 OPTIONS http://localhost:8090/api/login net::ERR_CONNECTION_REFUSED

演示已上传到https://github.com/clouddemo1/vuemduidemo1

我也想包含H2数据库,但是我尝试过,它仅适用于内存模式或文件模式。 jdbc:h2:tcp:// localhost /〜/ test模式在云上不起作用。 那么如何使其在云上运行呢?还有其他方法可以使Vue与不使用axios的java后端进行对话吗? 或者,如果必须,我可以配置cloud Foundry来使链接正常工作吗? 还是如果Cloud Foundry无法做到这一点(我之所以使用Cloud Foundry是因为它很简单,只需上传jar,无需配置),k8s可以做到吗?

1 个答案:

答案 0 :(得分:0)

  

XHR加载失败:选项“”。   4xhr.js:178个选项http://localhost:8090/api/login net :: ERR_CONNECTION_REFUSED

失败是因为您的应用程序不再在本地计算机上运行,​​而是在Cloud Foundry上运行。您需要更新axios.defaults.baseURL设置以引用绑定到应用程序的路由。

您可以在配置中对此进行硬编码,虽然这不是很好,但是可以工作,或者可以引用VCAP_APPLICATION环境变量,该变量由Cloud Foundry设置,并包含有关您的应用程序的信息,包括绑定的路由(可以有多个)。您可以阅读此书,选择路线并动态配置您的应用。

例如:

 "VCAP_APPLICATION": {
  "application_id": "<guid>",
  "application_name": "<app-name>",
  "application_uris": [
   "app-name.apps.example.com",
   "some-other-route.example.com"
  ],
  "application_version": "df82308c-7add-4f2b-bb44-a58680084a79",
  "cf_api": "https://api.system.example.com",
  "limits": {
   "disk": 1024,
   "fds": 16384,
   "mem": 64
  },
  "name": "<app-name>",
  "space_id": "<space-guid>",
  "space_name": "<space-name>",
  "uris": [
   "app-name.apps.example.com",
   "some-other-route.example.com"
  ],
  "users": null,
  "version": "df82308c-7add-4f2b-bb44-a58680084a79"
 }
  

我也想包含H2数据库,但是我尝试过,它仅适用于内存模式或文件模式。 jdbc:h2:tcp://localhost/~/test模式在云上不起作用。

我不明白为什么这在技术上是行不通的,只要您的应用通过本地主机与数据库进行通信,所有流量都将在应用容器内。您必须更确切地说明究竟是什么原因。

也就是说,我不希望您那样使用H2,至少不要在较小的测试/演示中使用。首先,应用程序容器是短暂的,因此您的任何数据都不会在重新启动/崩溃/重新上载/推送或任何触发容器重新启动的情况下幸存(平台维护也可以执行此操作,因此,这不仅仅是您启动的操作)。其次,您真的无法将应用程序扩展到一个实例之外,因为该应用程序的每个实例都拥有自己的数据库副本,这将是有问题的。

您真正想做的是创建服务并将其绑定到您的应用程序。然后,就像VCAP_APPLICTION一样,您可以从VCAP_SERVICES中提取服务凭据,并动态配置应用程序以连接到数据库。有关如何执行此操作的详细信息,请参见此答案的第二部分:https://stackoverflow.com/a/56257656/1585136

尝试运行cf marketplace以查看提供商提供的服务列表。许多服务甚至都有免费的服务套餐,因此您可以尝试使用它们或将其用于小型应用程序和演示。

希望有帮助!