【问题标题】:jHipster App crashes propably because CloudFoundry activates cloud profile由于 CloudFoundry 激活了云配置文件,jHipster 应用程序崩溃了
【发布时间】:2019-01-02 18:51:24
【问题描述】:

我的小型 jhipster 应用程序“customerapp”的部署失败,可能是因为云代工除了配置文件“dev”之外还设置了配置文件“cloud”。我在 Cloud Foundry 中为不同的开发阶段使用了几个空间:dev、staging 和 prod。

我使用了 jhipster 生成器,添加了一些实体客户、地址和联系人。应用程序在本地运行,没有任何问题。

我还使用 gitlab-ci 来构建、测试和部署我的软件。我的 .gitlab-ci.yml 看起来像这样(我删除了一些不必要的部分)。

image: mydockerregistry.xxxxx.de/jutoro/jhipster_test/jhipster-dockerimage

services:
  - docker:dind

cache:
   key: "$CI_BUILD_REF_NAME"
  paths:
    - node_modules
    - .maven

 before_script:
   - chmod +x mvnw
   - export MAVEN_USER_HOME=`pwd`/.maven

 stages:
   - build
   - package
   - deployToCF

 mvn-build:
   stage: build
   only:
    - dev
    - prod
   script: 
     - npm install
     - ./mvnw compile -DskipTests -Dmaven.repo.local=$MAVEN_USER_HOME - 
Dspring.profiles.active=dev

 mvn-package-dev:
  stage: package
  only:
    - dev   
  script:
    - npm install    
    - ./mvnw package -Pdev -DskipTests -Dmaven.repo.local=$MAVEN_USER_HOME -Dspring.profiles.active=dev
  artifacts:
      paths:
        - target/*.war  

mvn-package-prod:
  stage: package
  only:
    - prod 
  script:    
    - npm install    
    - ./mvnw package -Pprod -DskipTests -Dmaven.repo.local=$MAVEN_USER_HOME -Dspring.profiles.active=prod
  artifacts:
      paths:
        - target/*.war     

deployToCloudFoundry-dev:
  image: pivotalpa/cf-cli-resource
  stage: deployToCF
  only:
    - dev
  cache:
    paths:
      - bin/
  script:
   - bash ci/scripts/deployToCloudFoundry.sh  

deployToCloudFoundry-prod:
  image: pivotalpa/cf-cli-resource
  stage: deployToCF
  only:
    - prod
  cache:
    paths:
      - bin/
  script:
    - bash ci/scripts/deployToCloudFoundry.sh

DOCKERFILE(也使用 gitlab-ci 构建并添加到我们的 docker 存储库):

# DOCKER-VERSION 1.8.2
FROM openjdk:8
MAINTAINER Robert Zieschang 

RUN apt-get install -y curl
# install node.js
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs python g++ build-essential && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# install yeoman
RUN npm install -g yo

deplpoyToCloudFoundry.sh shell 脚本:

cf login -a $CF_API_ENDPOINT -u $CF_USER -p $CF_PASS -o "${CF_ORG^^}" -s  ${CI_COMMIT_REF_NAME^^} 
cf push -n $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME 

我的清单文件:

---
applications:
- name: customerapp
  memory: 1024M
  #buildpack: https://github.com/cloudfoundry/java-buildpack#v3.19.2
  path: target/customerapp-0.0.1-SNAPSHOT.war
  services:
  - postgresql
  env:
    #SPRING_PROFILES_ACTIVE: dev
    #SPRING_PROFILES_DEFAULT: dev
    #JAVA_OPTS: -Dspring.profiles.active=dev

管道运行良好,应用程序被打包到 war 文件中并上传到 cloud foundry,但它崩溃了,我认为这是因为 cloud Foundry 仍然以某种方式应用配置文件“cloud”,这会覆盖来自 jhipsters 的重要配置“开发”配置文件。

 [...]
2019-01-02T19:03:16.05+0100 [APP/PROC/WEB/0] OUT 2019-01-02 18:03:16.055  INFO 8 --- [           main] pertySourceApplicationContextInitializer : 'cloud' property source added
2019-01-02T19:03:16.05+0100 [APP/PROC/WEB/0] OUT 2019-01-02 18:03:16.056  INFO 8 --- [           main] nfigurationApplicationContextInitializer : Reconfiguration enabled
2019-01-02T19:03:16.06+0100 [APP/PROC/WEB/0] OUT 2019-01-02 18:03:16.064  INFO 8 --- [           main] com.jutoro.cco.CustomerappApp            : The following profiles are active: cloud,dev,swagger     
[...]

这会导致: 2019-01-02T19:03:29.17+0100 [APP/PROC/WEB/0] OUT 2019-01-02 18:03:29.172 错误 8 --- [main] com.jutoro.cco.CustomerappApp:您配置错误你的申请!它不应同时与“开发”和“云”配置文件一起运行。 [...]

在该云代工厂停止应用程序之后。

2019-01-02T19:04:11.09+0100 [CELL/0] OUT Cell 83899f60-78c9-4323-8d3c-e6255086c8a7 stopping instance 74be1834-b656-4445-506c-bdfa

生成的application-dev.yml和bootstrap.yml只是在一些地方做了修改:

bootstrap.yml

        uri: https://admin:${jhipster.registry.password}@url.tomy.jhipsterregistryapp/config

        name: customerapp
        profile: dev # profile(s) of the property source
        label: config-dev 

application-dev.yml

client:
    service-url:
        defaultZone: https://admin:${jhipster.registry.password}@url.tomy.jhipsterregistryapp/eureka/

我尝试在 cf 中设置什么开发配置文件:

  • 在 gitlab-ci.yml 中添加了 -Dspring.profiles.active=dev 和 -Pdev
  • 在清单 env: 部分中添加了 SPRING_PROFILES_ACTIVE:dev
  • 在清单 env: 部分中添加了 SPRING_PROFILES_DEFAULT: dev
  • 添加了 SPRING_APPLICATION_JSON: {"spring.cloud.dataflow.applicationProperties.stream.spring.profiles.active": "dev"}(如https://github.com/spring-cloud/spring-cloud-dataflow/issues/2317 中所述)
  • 在清单 env: 部分中添加了 JAVA_OPTS: -Dspring.profiles.active=dev(cv env customerapp 显示已设置)
  • 使用 cf set-env 和 cf restage 设置 JAVA_OPTS -Dspring.profiles.active=dev

感谢任何帮助。

问候 罗伯特

【问题讨论】:

  • 您可以设置JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '[enabled: false]' 告诉JBP 禁用spring 自动重新配置,这是添加云配置文件的原因。请小心,因为这也会禁用服务的自动重新配置。
  • 谢谢@DanielMikusa,但我不完全知道,如果我关闭自动配置,会有什么后果。但我找到了一种部署方式。谢谢你的提示。
  • 这取决于您的应用。例如,您有一个 DataSource,您可以将其配置为在本地工作。然后,当您推送到 CF 时,JBP 的自动重新配置将自动重新配置您的单个 DataSource 以指向绑定的数据库。它有点神奇并且有一些限制,所以 IMO 最好直接使用 Spring Cloud 连接器并显式配置您的数据源。如果你这样做了,那么禁用自动重新配置实际上并没有任何影响。

标签: jhipster cloud-foundry gitlab-ci


【解决方案1】:

忘记之前的答案。事实证明,这是一个数据源问题,导致应用程序无法响应心跳。 取消注释

#hibernate.connection.provider_disables_autocommit: true 

在应用程序属性中修复了这个。

【讨论】:

    【解决方案2】:

    也许任何“未来”的人都会偶然发现同样的行为。

    我能够将我的 jhipster 应用程序部署到 Cloud Foundry。 我以某种方式“修复”了它,但我不知道进一步的后果。然而。

    原来 cloud Foundry 在通过标准的健康检查类型 http 监控我的 jhipster 应用程序时遇到问题,应该是“心跳”? 所以我决定将监控行为切换为一种非心跳方式。 只需在 manifest.yml 文件中将运行状况检查类型切换为进程即可。

    health-check-type: process
    

    应用程序现在正在运行。

    【讨论】:

    • 这样做的缺点是 CF 将无法检测到您的应用程序是否停止工作并重新启动它。对于“进程”的运行状况检查类型,CF 所查看的所有内容都是进程是否已启动并正在运行。只要 JVM 不退出,这就是事实。如果您的应用程序挂起并停止处理请求,该进程将继续运行,并且您的应用程序不会被平台自动重新启动。如果您将 health-check-type 设置为“http”,平台将尝试从您的应用程序访问 HTTP 端点(默认为“/”)。如果返回 200 OK 以外的任何内容,应用程序将自动重新启动。
    • 感谢 Daniel Mikusa 的澄清。这不是期望的行为。所以我会尝试关闭自动配置。到目前为止,谢谢。
    • 您好 Daniel,我删除了健康检查类型,添加了 JBP_CONFIG_SPRING_AUTO_RECONFIGURATION...该应用程序现在启动,但仍然应用云配置文件。 2019-01-14T09:32:24.93+0100 [APP/PROC/WEB/0] OUT 配置文件:[云、开发、招摇]
    • 你在哪里/如何添加的?您能否从暂存的输出中确认尚未安装自动重新配置?安装后,您会在暂存期间看到 JBP 中的一行,特别说明它已安装。我建议打开/关闭您所做的更改并确认它实际上正在禁用自动重新配置。让我知道它是否已被禁用并且您仍然可以看到云配置文件。
    • 我的错。我将它添加到环境变量中。现在自动配置已停用。这意味着我的 ${vcap. } 我的数据源的占位符不起作用,对吧?
    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多