当前位置: 首页 > 知识库问答 >
问题:

带有Heroku的Quarkus数据源

邵弘义
2023-03-14

我正在尝试在Heroku上部署我的Quarkus-app。它工作正常,但我需要使用固定值指定数据源参数。因为Heroku可能会旋转此参数,所以这不是一个真正的好主意。

在Quarkus中,我需要应用程序中的这3个参数。属性:

quarkus.datasource.username
quarkus.datasource.password
quarkus.datasource.jdbc.url

Heroku只给了我1个环境变量(DATABASE\u URL),它以以下方式定义连接字符串:postgres://user:pass@服务器:端口/数据库名称

我知道我可以使用这样的环境变量:quarkus。数据源。jdbc。url=jdbc:${DATABASE\u url}

但我需要拆分变量以提取用户和密码并更改前缀(postgresql而不是postgres)。

有人知道如何做到这一点吗?


共有2个答案

夹谷宜民
2023-03-14

我创建了一个bash脚本,从Heroku数据库URL提取三个Quarkus参数。

它适用于JVM和Native版本。

我的application.properties代码

quarkus.datasource.jdbc.url=${DB_JDBC_URL:jdbc-url}
quarkus.datasource.username=${DB_JDBC_USER:postgres}
quarkus.datasource.password=${DB_JDBC_PASSWORD:postgres}
# cut the DATABASE_URL after '@'
export DB_JDBC_URL=jdbc:postgresql://${DATABASE_URL#*@}

# substring the DATABASE_URL between '//' and ':'
export DB_JDBC_USER=$(expr $DATABASE_URL : '.*/\([^:]*\):.*')

# substring the DATABASE_URL between ':' and '@'
export DB_JDBC_PASSWORD=$(expr $DATABASE_URL : '.*:\([^@]*\)@.*')

用heroku保存以下脚本。项目根文件夹中的sh文件名。

#!/bin/sh
# =============================================================================
# This script automatically splits the Heroku ENV DATABASE_URL variable
# into the three JDBC variables needed from Quarkus.
# 
# It will only do the split if the DB_HEROKU_SPLIT is set to "true".
#
# If you set DB_HEROKU_SPLIT to 'false', you must pass the Quarkus parameters:
#   - DB_JDBC_URL;
#   - DB_JDBC_USER;
#   - DB_JDBC_PASSWORD.
# 
# For test purposes, you can set the DB_ECHO_VALUES to 'true' and check if the
# values are correct.
# 
# Pattern of DATABASE_URL from Heroku:
# --------------------------------------
#   postgres://username:password@host:port/databasename
# 
# Pattern of JDBC variables of Quarkus:
# -------------------------------------
#   quarkus.datasource.jdbc.url=jdbc:postgresql://host:port/databasename
#   quarkus.datasource.username=username
#   quarkus.datasource.password=password
# 
# =============================================================================

echo DB_HEROKU_SPLIT=[$DB_HEROKU_SPLIT] 

# check for 'true' in string (case insensitive)
if [[ "${DB_HEROKU_SPLIT,,}" == "true" ]]; then

  # cut the DATABASE_URL after '@'
  export DB_JDBC_URL=jdbc:postgresql://${DATABASE_URL#*@}

  # substring the DATABASE_URL between '//' and ':'
  export DB_JDBC_USER=$(expr $DATABASE_URL : '.*/\([^:]*\):.*')

  # substring the DATABASE_URL between ':' and '@'
  export DB_JDBC_PASSWORD=$(expr $DATABASE_URL : '.*:\([^@]*\)@.*')

fi

# check for 'true' in string (case insensitive)
if [[ "${DB_ECHO_VALUES,,}" == "true" ]]; then

  echo DATABASE_URL=[$DATABASE_URL]
  echo DB_JDBC_URL=[$DB_JDBC_URL]
  echo DB_JDBC_USER=[$DB_JDBC_USER] 
  echo DB_JDBC_PASSWORD=[$DB_JDBC_PASSWORD]

fi

请记住将此文件包含到您的中。dockerignore公司:

*
!heroku.sh
!target/*-runner
!target/*-runner.jar
!target/lib/*
!target/quarkus-app/*

将原始ENTRYPOINT替换为:

# commands from original Quarkus Dockerfile.jvm file suppressed for breviety

COPY --chown=1001 heroku.sh /deployments/heroku.sh
RUN chmod 540 /deployments/heroku.sh

CMD [ "/bin/bash", "-c" , ". /deployments/heroku.sh && /deployments/run-java.sh" ]

将原始CMD替换为:

# commands from original Quarkus Dockerfile.jvm file suppressed for breviety

COPY --chown=1001 heroku.sh /work/heroku.sh
RUN chmod 540 /work/heroku.sh

CMD ["/bin/bash", "-c", ". ./heroku.sh && ./application", "-Dquarkus.http.host=0.0.0.0"]

DB_HEROKU_SPLIT

DB_HEROKU_SPLIT添加到Heroku的Config Vars中,并将其设置为true,如果您希望bash脚本为您提取Quarkus数据源变量。

将其设置为false,您可以在Heroku配置变量中创建Quarkus数据源(DB\u JDBC\u URL、DB\u JDBC\u密码和DB\u JDBC\u密码),并绕过bash脚本将其直接传递给Quarkus。

DB\u ECHO\u值

我还创建了一个DB\u ECHO\u VALUES变量,允许您在日志上显示数据源。如果要在屏幕上打印日志,只需将DB\u ECHO\u VALUES设置为true即可。

干浩然
2023-03-14

您可以针对您的用例使用JDBC\u DATABASE\u URL、JDBC\u DATABASE\u用户名和JDBC\u DATABASE\u密码环境变量。

有关更多详细信息,您可以在此处找到文档:https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#using--jdbc\u database\u url

 类似资料:
  • 我想用Optaplanner解决VRP问题(添加一些内容)。在文档中,人们经常说,预先计算位置之间的距离,然后对每个位置使用

  • 我目前正在开发一个尽可能尊重六边形架构原则的应用程序。 因此,我的“域”模块(组Id: ; 工件Id:)不依赖于任何技术框架。 我的所有服务都使用自定义注释(本身是我域的一部分)进行注释: 然而,在我的“Quarkus应用”模块(groupId:< code > acme ;artifact id:< code > app-quar kus ,我需要注入我的“域”模块中定义的服务(< code>a

  • 问题内容: 我已经使用Angular 2 CLI构建了Angular 2项目,并能够使用本教程将应用程序部署到Heroku 。 现在,我想为应用程序的不同环境(开发,登台,生产等)创建管道。 在我的package.json中,它将创建我的代码的生产版本,我的应用程序将在此版本上运行。有没有一种方法可以根据我在Heroku设置中的设置进行更改?例如,它将针对开发环境或登台环境。还是我需要以其他方式设

  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke

  • 使现代化 在解决了一些与主要问题无关的问题后,我修复了示例代码中的小错误,主要问题仍然是关于服务之间的非阻塞流。 背景信息: 我正在Quarkus下移植一个Spring WebFlux服务。该服务在多个庞大的数据集上运行长时间搜索,并在Flux(文本/事件流)可用时返回部分结果。 问题: 现在,我正在尝试使用叛变多与垂直。Quarkus下的x,但无法确定消费者服务如何在不阻塞的情况下接收此流。 在