使用Spring-Cloud将Spring Boot应用程序部署到Cloud Foundry

我有一个基于Spring Boot的小型应用程序 ,该应用程序使用Postgres数据库作为数据存储。
我想记录将示例应用程序部署到Cloud Foundry的步骤 。 Spring Boot参考指南中描述了一些步骤 ,但是这些指南并未充分说明如何与基于云的环境中提供的数据存储集成。 Spring-cloud提供了连接在云上部署的基于Spring的应用程序以发现并连接到绑定服务的胶水,因此第一步是使用以下pom条目将Spring-cloud库引入项目中:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-spring-service-connector</artifactId><version>1.0.0.RELEASE</version>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-cloudfoundry-connector</artifactId><version>1.0.0.RELEASE</version>
</dependency>

一旦引入了这种依赖性,就很容易连接到绑定的服务,只需按照以下方式定义配置:

@Configuration
public class PostgresCloudConfig extends AbstractCloudConfig {@Beanpublic DataSource dataSource() {return connectionFactory().dataSource();}}

Spring-Cloud理解该应用程序已部署在特定的云上(当前的Cloud Foundry和Heroku通过查找已部署的Cloud平台的某些特征),发现了绑定的服务,认识到存在一个绑定的服务,基于Postgres的数据源可以使用该绑定服务创建并返回数据源作为Spring bean。 现在,该应用程序可以干净地部署到基于Cloud Foundry的云中。 可以在使用bosh-lite部署的Cloud Foundry版本中试用该示例应用程序,这是在Cloud Foundry启动并使用bosh-lite运行后我机器中的步骤的样子:以下命令在以下位置创建用户提供的服务Cloud Foundry:

cf create-user-provided-service psgservice -p '{"uri":"postgres://postgres:p0stgr3s@bkunjummen-mbp.local:5432/hotelsdb"}'

现在,推动应用程序,但是不要启动它。 一旦以上服务绑定到应用程序,我们就可以这样做:

cf push spring-boot-mvc-test -p target/spring-boot-mvc-test-1.0.0-SNAPSHOT.war --no-start

将服务绑定到应用程序并重新启动应用程序:

cf bind-service spring-boot-mvc-test psgservice
cf restart spring-boot-mvc-test

本质上就是这样,理想情况下,Spring Cloud应该接管并干净地解析来自绑定服务的凭证,该凭证在Cloud Foundry中转换为称为VCAP_SERVICES的环境变量,并从中创建数据源。 但是,这种方法存在一个问题–一旦使用spring-cloud方法创建了数据源bean,它就不再在本地环境中工作。 为此,可能的解决方法是使用Spring配置文件,假设在返回基于Spring-cloud的数据源的Cloud环境中有一个不同的“ cloud” Spring配置文件可用:

@Profile("cloud")
@Configuration
public class PostgresCloudConfig extends AbstractCloudConfig {@Beanpublic DataSource dataSource() {return connectionFactory().dataSource();}
}

并让Spring-boot自动配置在默认的本地环境中创建数据源,这样配置既可以在本地也可以在Cloud中工作。 该“云”配置文件来自何处,可以使用ApplicationContextInitializer创建它,并采用以下方式:

public class SampleWebApplicationInitializer implements ApplicationContextInitializer<AnnotationConfigEmbeddedWebApplicationContext> {private static final Log logger = LogFactory.getLog(SampleWebApplicationInitializer.class);@Overridepublic void initialize(AnnotationConfigEmbeddedWebApplicationContext applicationContext) {Cloud cloud = getCloud();ConfigurableEnvironment appEnvironment = applicationContext.getEnvironment();if (cloud!=null) {appEnvironment.addActiveProfile("cloud");}logger.info("Cloud profile active");}private Cloud getCloud() {try {CloudFactory cloudFactory = new CloudFactory();return cloudFactory.getCloud();} catch (CloudException ce) {return null;}}
}

该初始化程序利用Spring-cloud的扫描功能来激活“云”配置文件。 我想尝试的最后一件事是在Spring-Cloud的眼中使我的本地设备表现得至少像Cloud,这可以通过添加一些环境变量来完成,Spring-Cloud使用这些环境变量来确定云的类型。应用程序已部署,以下是我在本地的启动脚本,该应用程序假装成好像已部署在Cloud Foundry中:

read -r -d '' VCAP_APPLICATION <<'ENDOFVAR'
{"application_version":"1","application_name":"spring-boot-mvc-test","application_uris":[""],"version":"1.0","name":"spring-boot-mvc-test","instance_id":"abcd","instance_index":0,"host":"0.0.0.0","port":61008}
ENDOFVARexport VCAP_APPLICATION=$VCAP_APPLICATIONread -r -d '' VCAP_SERVICES <<'ENDOFVAR'
{"postgres":[{"name":"psgservice","label":"postgresql","tags":["postgresql"],"plan":"Standard","credentials":{"uri":"postgres://postgres:p0stgr3s@bkunjummen-mbp.local:5432/hotelsdb"}}]}
ENDOFVARexport VCAP_SERVICES=$VCAP_SERVICESmvn spring-boot:run
  • 可以在以下 github位置获得整个示例: https : //github.com/bijukunjummen/spring-boot-mvc-test

结论

Spring Boot和Spring-Cloud项目现在提供了一个出色的工具集,可以创建支持Spring的云就绪应用程序,希望这些说明对将Spring Boot与Spring-Cloud集成以及将它们用于无缝的本地和云部署有用。

翻译自: https://www.javacodegeeks.com/2014/08/deploying-a-spring-boot-application-to-cloud-foundry-with-spring-cloud.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前台js获取guid --getGuid

/** *获取id */function getGuid(){ var len32; //32长度 var radix16; //16进制 var chars0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.split(); var uuid[],i; radixradix || chars.length; if(len){ for(i0;i<len;i){ uuid[i]cha…

ie6 下最佳 PNG透明方案【转】

“咳! 哎!….. ” 你听见了么? 这些都是大家抱怨IE6下不能实现png图片漂亮的明效果的哀叫声,的确是无奈呀….. 不过现在幸运的是,我们能够让这一切的抱怨都停止. 网络上解决IE6下Png透明解决方案有很多,例如 IE PNG Fix from TwinHelix, Javascript IE PNG Fix, Transparent …

安装svn、git等托管软件

安装软件&#xff0c;配置环境。下面我找到的别人写的&#xff0c;写的都很详细&#xff0c;做个记录。就不在这里写具体步骤了。 1.nodejs安装 使用vue-cli 搭建项目的时候需要nodejs&#xff0c;node是比较方便的&#xff0c;打包部署&#xff0c;解析vue单文件组件&#xff…

Echarts在手机端y轴数据过大,显示不全

解决办法&#xff1a; 减少y轴的margion&#xff0c;和格式化y轴 myChart.setOption({...,yAxis: {axisLabel: {margin: 2,formatter: function (value, index) {if (value > 10000 && value < 10000000) {value value / 10000 "万";} else if (va…

HBase:为客户行为生成搜索点击事件统计信息

在本文中&#xff0c;我们将探索HBase来存储客户搜索点击事件数据&#xff0c;并利用其基于搜索查询字符串和构面过滤器点击来获取客户行为信息。 我们将介绍如何使用MiniHBaseCluster&#xff0c;HBase Schema设计&#xff0c;使用HBaseSink与Flume集成以存储JSON数据。 在之…

控制HTML Input只能输入数字和小数点

转&#xff1a;https://www.cnblogs.com/esion/p/3342866.html 本文介绍三种控制在中只允许输入数字和小数点的方案。 方案1&#xff1a;通过JavaScript代码实现。 JavaScript代码如下&#xff1a; function checkNum(obj) {//检查是否是非数字值if (isNaN(obj.value)) {obj…

2019-05-14 Sonar部署

1.下载软件地址&#xff1a;https://www.sonarqube.org/#downloads 官方文档&#xff1a;https://docs.sonarqube.org/display/SCAN/AnalyzingwithSonarQubeScannerforAnt 2.LTS Release不是最新但是是稳定的版本长久支持&#xff1b;Latest Realease是最新版本不稳定&#xff…

WildFly 8.1.0.Final上的SwitchYard 2.0.0.Alpha1入门

最近&#xff0c;我一直在关注一些热门的RedHat技术&#xff0c;在其中很多有趣的部分中&#xff0c;我找到了SwitchYard 。 过去&#xff0c;对于所有人都围绕SOA和面向服务的体系结构不屑一顾&#xff0c;这对我来说一直很奇怪&#xff0c;作为Java EE开发人员。 过去&#…

void main()是错误的

USE_NET新闻组一直苦恼于一个问题的讨论&#xff0c;我们能否用void作为一个main的返回类型&#xff0c;ANSI标准说不能&#xff0c;然而&#xff0c;大量的关于C的启蒙书中的例子都使用了void main (void)&#xff0c;这让许多人感觉不知该如何是好。 当有人问为什么使用void是…

zTree 优秀的jquery树插件

zTree 优秀的jquery树插件,文档详细&#xff0c;渲染快 使用方法&#xff1a; 1、引用zTree的js和css文件   <link href"~/Content/zTree_v3/css/zTreeStyle/zTreeStyle.css" rel"stylesheet" /><script src"~/Content/zTree_v3/js/jque…

执行点击事件,第一次点击后,一切正常,第二次点击,执行两次,以此类推

今天执行点击事件的时候&#xff0c;第一个点击正常&#xff0c;第二次点击接口调用了两次&#xff0c;第三次点击接口调用了3次。。。。我还以为是我的push数组写错了&#xff0c;后来发现是因为jq绑定一个按钮click事件的问题。 1.在点击事件上面添加了一行代码**$(’#btn’)…

牛客 2B 树 (组合计数)

传送门 大意: 给定n节点树, 求划分为不超过$k$个连通块的方案数. n,k<300. 核心观察是每个连通块深度最低的点固定以后染色方案就固定了. 所以答案为$\sum\limits_{i1}^k\binom{k}{i}i!\binom{n-1}{i-1}$ 转载于:https://www.cnblogs.com/uid001/p/10864775.html

Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis

显然&#xff0c;编写URL缩短服务是新的“ Hello&#xff0c;world&#xff01; ”在IoT /微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务 -整洁的Scala&#xff0c;以Spray和Redis进行调味以进行存储。 随后&#xff0c; 在35行Clojure中使用了url缩短服务&#x…

poj 3256(DFS)

http://acm.pku.edu.cn/JudgeOnline/problem?id3256 题意&#xff1a;有k头牛&#xff0c;n个牧场&#xff0c;m条路&#xff08;每条路相连两个牧场且单向&#xff09;&#xff0c;求全部牛都能到达的牧场有几个。 分析&#xff1a;用DFS&#xff0c;从每头牛所在牧场开始&am…

jquery常用表单操作

//js将表单序列化成对象$.fn.serializeObject function () {var $els $(this).find("[name]");var formData {};var len $els.length;for (var i 0; i < len; i ) {var $item $($els[i]);var name $item.attr("name");var type $item.attr(&qu…

Android 小項目之---Iphone拖动图片特效 (附源码)

曾经被Iphone用手指在屏幕上滑来滑去拖动图片的操作方式吸引吗&#xff1f;在Android里头&#xff0c;这并不是什么难事。 所需要的技术点如下&#xff1a;Android.content.Context 、Android.widget.BaseAdapter、Android.widget.ImageView等通常会用在设计相册、 图片类型的选…

jq绑定的事件不生效

不知道什么原因&#xff0c;写了一段代码之后&#xff0c;绑定的所有的jq事件都不生效了。后来百度了一下&#xff0c;这里列出一种方法。 转载&#xff1a;https://www.jb51.net/article/46666.html $("#ceshisub").bind("click",function(){ var a1; …

Python笔记_第三篇_面向对象_6.继承(单继承和多继承)

1. 概念解释&#xff1a; 继承&#xff1a;有两个类&#xff1a;A类和B类。那么A类就拥有了B类中的属性和方法。 * 例如&#xff1a;Object&#xff1a;是所有类的父亲&#xff0c;还可以成为基类或者超类&#xff08;super()&#xff09; * 继承者为子类&#xff0c;被继承者成…

文本内容之间的关键词提取和相似度计算

背景 Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了&#xff0c;用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前&#xff0c;此类网站曾经以诸如年龄&#xff0c;阅读书籍&#xff0c;喜欢的书籍类型&#xff0c;语言偏好…

Windows XP SP3支持多用户远程桌面连接

远程桌面连接的确很方便&#xff0c;但是在Windows XP中只支持单一用户的连接&#xff0c;当第二个用户连接时&#xff0c;第一个用户就被迫断开并回到用户登录界面了&#xff0c;这可和多任务的操作系统理念不符啊&#xff0c;或许微软是为了突出Server系统的特点吧&#xff0…