将Spring Boot应用程序绑定到Cloud Foundry中的服务的方法

如果您想试用Cloud Foundry ,最简单的方法是下载出色的PCF开发人员或在Pivotal Web Services站点上创建试用帐户。

文章的其余部分假定您已经安装了Cloud Foundry,并且对Cloud Foundry有较高的了解。 这篇文章的目的是列出将Java应用程序集成到服务实例中的所有选项–该演示使用mysql作为示例服务进行集成,但是这种方法足够通用。

应用概述

该应用程序是一个相当简单的Spring-Boot应用程序,它是一个REST服务,它公开了三种域类型及其之间的关系,代表了大学–课程,教师和学生。 域实例将保存到MySQL数据库中。 如果您想继续前进,可以在github上找到整个源代码和方法。

要在本地尝试该应用程序,请首先在具有自制软件的Mac OSX盒子上安装本地mysql服务器数据库,然后可以运行以下命令集:

brew install mysql

mysql.server start
mysql -u root
# on the mysql prompt: 

CREATE USER 'univadmin'@'localhost' IDENTIFIED BY 'univadmin';
CREATE DATABASE univdb;
GRANT ALL ON univdb.* TO 'univadmin'@'localhost';

在cf-db-services-sample-auto下调出Spring-Boot:

mvn spring-boot:run

带有示例数据的端点将在http:// localhost:8080 / courses上提供。

在Cloud Foundry上尝试此应用程序

如果您在本地运行PCF Dev的安装,则可以通过以下方式尝试部署应用程序:

cf api api.local.pcfdev.io --skip-ssl-validation
cf login # login with admin/admin credentials

创建一个Mysql服务实例:

cf create-service p-mysql 512mb mydb

并推送应用! (manifest.yml提供了应用程序与服务实例的绑定)

cf push

端点应该位于http://cf-db-services-sample-auto.local.pcfdev.io/courses

服务连通性的方法

现在我们有了一个可以在本地运行并在示例本地Cloud Foundry上运行的应用程序,这些就是连接到服务实例的方法。

方法1 –不执行任何操作,让Java buildpack处理连接详细信息

cf-db-services-sample-auto项目中演示了这种方法。 在这里,已经使用Spring Boot指定了到本地数据库的连接,如下所示:

---

spring:
  jpa:
    show-sql: true
    hibernate.ddl-auto: none
    database: MYSQL

  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost/univdb?autoReconnect=true&useSSL=false
    username: univadmin
    password: univadmin

使用Java Buildpack将此应用程序推送到Cloud Foundry时,一个名为java-buildpack-auto-reconfiguration的组件被注入到应用程序中,该组件根据运行时服务绑定重新配置与服务的连接。

方法2 –禁用自动重新配置并使用运行时属性

cf-db-services-sample-props项目中演示了此方法。 当服务绑定到应用程序时,在键“ VCAP_SERVICES”下将一组环境属性注入到应用程序中。 对于此特定服务,该条目看起来类似于以下几行:

"VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "mysql.local.pcfdev.io",
     "jdbcUrl": "jdbc:mysql://mysql.local.pcfdev.io:3306/cf_456d9e1e_e31e_43bc_8e94_f8793dffdad5?user=**\u0026password=***",
     "name": "cf_456d9e1e_e31e_43bc_8e94_f8793dffdad5",
     "password": "***",
     "port": 3306,
     "uri": "mysql://***:***@mysql.local.pcfdev.io:3306/cf_456d9e1e_e31e_43bc_8e94_f8793dffdad5?reconnect=true",
     "username": "***"
    },
    "label": "p-mysql",
    "name": "mydb",
    "plan": "512mb",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [
     "mysql"
    ]
   }
  ]
 }

原始的json使用起来有点笨拙,但是Spring Boot会自动将此数据转换为一组扁平的属性,如下所示:

"vcap.services.mydb.plan": "512mb",
"vcap.services.mydb.credentials.username": "******",
"vcap.services.mydb.credentials.port": "******",
"vcap.services.mydb.credentials.jdbcUrl": "******",
"vcap.services.mydb.credentials.hostname": "******",
"vcap.services.mydb.tags[0]": "mysql",
"vcap.services.mydb.credentials.uri": "******",
"vcap.services.mydb.tags": "mysql",
"vcap.services.mydb.credentials.name": "******",
"vcap.services.mydb.label": "p-mysql",
"vcap.services.mydb.syslog_drain_url": "",
"vcap.services.mydb.provider": "",
"vcap.services.mydb.credentials.password": "******",
"vcap.services.mydb.name": "mydb",

鉴于此,可以通过以下方式在Spring Boot应用程序中指定与数据库的连接–在application.yml文件中:

spring:
  datasource:
    url: ${vcap.services.mydb.credentials.jdbcUrl}
    username: ${vcap.services.mydb.credentials.username}
    password: ${vcap.services.mydb.credentials.password}

不过,有一个小问题是,由于我现在已明确控制指定服务连接的控制,因此必须禁用运行时java-buildpack-auto-reconfiguration,这可以通过清单元数据来完成:

---
applications:
  - name: cf-db-services-sample-props
    path: target/cf-db-services-sample-props-1.0.0.RELEASE.jar
    memory: 512M
    env:
      JAVA_OPTS: -Djava.security.egd=file:/dev/./urandom
      SPRING_PROFILES_ACTIVE: cloud
    services:
      - mydb

buildpack: https://github.com/cloudfoundry/java-buildpack.git

env:
    JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '{enabled: false}'

方法3 –使用Spring Cloud连接器

第三种方法是使用出色的Spring Cloud Connectors项目,并且指定服务连接的配置如下所示,并在cf-db-services-sample-connector子项目中进行了演示:

@Configuration
@Profile("cloud")
public  class CloudFoundryDatabaseConfig {

    @Bean
    public Cloud cloud() {
        return new CloudFactory().getCloud();
    }

    @Bean
    public DataSource dataSource() {
        DataSource dataSource = cloud().getServiceConnector("mydb", DataSource.class, null);
        return dataSource;
    }
}

利弊

这些是每种方法的利弊:

方法 优点 缺点
方法1 –让Buildpack处理 1.简单,可以在本地运行的应用程序无需更改即可在云上运行 1.神奇的–对于不了解底层流程的人,自动重新配置可能看起来很神奇
2.支持的服务类型数量非常有限–
例如,如果需要与Cassandra的连接,则自动重新配置将不起作用
方法2 –显式属性 1.相当简单。
2.遵循Spring Boot的方法,并使用了一些基于Boot的应用程序的最佳实践–例如,创建数据源连接池的顺序是确定的,所有这些最佳实践都将使用此方法。
1.必须明确禁用自动重配置
2.需要知道扁平化属性的外观
3.可能必须通过环境属性手动注入“云”配置文件,以区分本地开发和云部署 4.难以封装对较新服务类型的连接的可重用性-例如Cassandra或DynamoDB。
方法3 – Spring Cloud连接器 1.易于整合
2.易于添加可重复使用的集成到较新的服务类型
1.绕过Spring Boot连接池逻辑的优化。

结论

我个人更喜欢采用方法2,因为它与Spring Boot的默认设置最接近,而不受方法的不利影响。 如果需要与服务建立更复杂的连接,我可能会采用方法3。

参考文献

斯科特·弗雷德里克Scott Frederick )的Spring音乐一直是他的常客。

2.我从Ben Halepong_matcher_spring样本中慷慨地借了下来

翻译自: https://www.javacodegeeks.com/2016/05/approaches-binding-spring-boot-application-service-cloud-foundry.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值